1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-04-17 17:42:20 +03:00

Credits: Be paranoid about all related Journal events

MissionCompleted doesn't contain 'Reward' if you pick an option without
a credits amount (rather than being there but with zero value).

Let's not wait to find out about other exceptions, just utilise
entry.get(<field>, 0) on them all.
This commit is contained in:
Athanasius 2021-05-08 19:25:38 +01:00
parent 2d42334755
commit aaf1fda1a1

View File

@ -552,7 +552,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Rebuy'] = None self.state['Rebuy'] = None
self.state['Modules'] = None self.state['Modules'] = None
self.state['Credits'] -= entry['ShipPrice'] self.state['Credits'] -= entry.get('ShipPrice', 0)
elif event_type == 'ShipyardSwap': elif event_type == 'ShipyardSwap':
self.state['ShipID'] = entry['ShipID'] self.state['ShipID'] = entry['ShipID']
@ -604,17 +604,17 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
'Value': entry['BuyPrice'], 'Value': entry['BuyPrice'],
} }
self.state['Credits'] -= entry['BuyPrice'] self.state['Credits'] -= entry.get('BuyPrice', 0)
elif event_type == 'ModuleRetrieve': elif event_type == 'ModuleRetrieve':
self.state['Credits'] -= entry.get('Cost', 0) self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'ModuleSell': elif event_type == 'ModuleSell':
self.state['Modules'].pop(entry['Slot'], None) self.state['Modules'].pop(entry['Slot'], None)
self.state['Credits'] += entry['SellPrice'] self.state['Credits'] += entry.get('SellPrice', 0)
elif event_type == 'ModuleSellRemote': elif event_type == 'ModuleSellRemote':
self.state['Credits'] += entry['SellPrice'] self.state['Credits'] += entry.get('SellPrice', 0)
elif event_type == 'ModuleStore': elif event_type == 'ModuleStore':
self.state['Modules'].pop(entry['Slot'], None) self.state['Modules'].pop(entry['Slot'], None)
@ -870,11 +870,11 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
name = self.canonicalise(entry['Name']) name = self.canonicalise(entry['Name'])
self.state[category][name] += entry['Count'] self.state[category][name] += entry['Count']
self.state['Credits'] -= entry['Price'] self.state['Credits'] -= entry.get('Price', 0)
elif event_type == 'SellMicroResources': elif event_type == 'SellMicroResources':
# Selling to a Bar Tender on-foot. # Selling to a Bar Tender on-foot.
self.state['Credits'] += entry['Price'] self.state['Credits'] += entry.get('Price', 0)
# One event per whole sale, so it's an array. # One event per whole sale, so it's an array.
for mr in entry['MicroResources']: for mr in entry['MicroResources']:
category = self.category(mr['Category']) category = self.category(mr['Category'])
@ -1197,10 +1197,10 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
elif event_type == 'SellOrganicData': elif event_type == 'SellOrganicData':
for bd in entry['BioData']: for bd in entry['BioData']:
self.state['Credits'] += bd['Value'] + bd['Bonus'] self.state['Credits'] += bd.get('Value', 0) + bd.get('Bonus', 0)
elif event_type == 'BookDropship': elif event_type == 'BookDropship':
self.state['Credits'] -= entry['Cost'] self.state['Credits'] -= entry.get('Cost', 0)
# Technically we *might* now not be OnFoot. # Technically we *might* now not be OnFoot.
# The problem is that this event is recorded both for signing up for # The problem is that this event is recorded both for signing up for
# an on-foot CZ, and when you use the Dropship to return after the # an on-foot CZ, and when you use the Dropship to return after the
@ -1213,13 +1213,13 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# event is going to be Disembark to on-foot anyway. # event is going to be Disembark to on-foot anyway.
elif event_type == 'BookTaxi': elif event_type == 'BookTaxi':
self.state['Credits'] -= entry['Cost'] self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'CancelDropship': elif event_type == 'CancelDropship':
self.state['Credits'] += entry['Refund'] self.state['Credits'] += entry.get('Refund', 0)
elif event_type == 'CancelTaxi': elif event_type == 'CancelTaxi':
self.state['Credits'] += entry['Refund'] self.state['Credits'] += entry.get('Refund', 0)
elif event_type == 'NavRoute': elif event_type == 'NavRoute':
# Added in ED 3.7 - multi-hop route details in NavRoute.json # Added in ED 3.7 - multi-hop route details in NavRoute.json
@ -1249,10 +1249,10 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Cargo'][commodity] += entry.get('Count', 1) self.state['Cargo'][commodity] += entry.get('Count', 1)
if event_type == 'BuyDrones': if event_type == 'BuyDrones':
self.state['Credits'] -= entry['TotalCost'] self.state['Credits'] -= entry.get('TotalCost', 0)
elif event_type == 'MarketBuy': elif event_type == 'MarketBuy':
self.state['Credits'] -= entry['TotalCost'] self.state['Credits'] -= entry.get('TotalCost', 0)
elif event_type in ('EjectCargo', 'MarketSell', 'SellDrones'): elif event_type in ('EjectCargo', 'MarketSell', 'SellDrones'):
commodity = self.canonicalise(entry['Type']) commodity = self.canonicalise(entry['Type'])
@ -1262,10 +1262,10 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
cargo.pop(commodity) cargo.pop(commodity)
if event_type == 'MarketSell': if event_type == 'MarketSell':
self.state['Credits'] += entry['TotalSale'] self.state['Credits'] += entry.get('TotalSale', 0)
elif event_type == 'SellDrones': elif event_type == 'SellDrones':
self.state['Credits'] += entry['TotalSale'] self.state['Credits'] += entry.get('TotalSale', 0)
elif event_type == 'SearchAndRescue': elif event_type == 'SearchAndRescue':
for item in entry.get('Items', []): for item in entry.get('Items', []):
@ -1348,7 +1348,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
module['Engineering'].pop('ExperimentalEffect_Localised', None) module['Engineering'].pop('ExperimentalEffect_Localised', None)
elif event_type == 'MissionCompleted': elif event_type == 'MissionCompleted':
self.state['Credits'] += entry['Reward'] self.state['Credits'] += entry.get('Reward', 0)
for reward in entry.get('CommodityReward', []): for reward in entry.get('CommodityReward', []):
commodity = self.canonicalise(reward['Name']) commodity = self.canonicalise(reward['Name'])
@ -1435,74 +1435,75 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# Try to keep Credits total updated # Try to keep Credits total updated
elif event_type in ('MultiSellExplorationData', 'SellExplorationData'): elif event_type in ('MultiSellExplorationData', 'SellExplorationData'):
self.state['Credits'] += entry['TotalEarnings'] self.state['Credits'] += entry.get('TotalEarnings', 0)
elif event_type == 'BuyExplorationData': elif event_type == 'BuyExplorationData':
self.state['Credits'] -= entry['Cost'] self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'BuyTradeData': elif event_type == 'BuyTradeData':
self.state['Credits'] -= entry['Cost'] self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'BuyAmmo': elif event_type == 'BuyAmmo':
self.state['Credits'] -= entry['Cost'] self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'CommunityGoalReward': elif event_type == 'CommunityGoalReward':
self.state['Credits'] += entry['Reward'] self.state['Credits'] += entry.get('Reward', 0)
elif event_type == 'CrewHire': elif event_type == 'CrewHire':
self.state['Credits'] -= entry['Cost'] self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'FetchRemoteModule': elif event_type == 'FetchRemoteModule':
self.state['Credits'] -= entry['TransferCost'] self.state['Credits'] -= entry.get('TransferCost', 0)
elif event_type == 'MissionAbandoned': elif event_type == 'MissionAbandoned':
# Is this paid at this point, or just a fine to pay later ? # Is this paid at this point, or just a fine to pay later ?
# self.state['Credits'] -= entry['Fine'] # self.state['Credits'] -= entry.get('Fine', 0)
pass pass
elif event_type in ('PayBounties', 'PayFines', 'PayLegacyFines'): elif event_type in ('PayBounties', 'PayFines', 'PayLegacyFines'):
self.state['Credits'] -= entry['Amount'] self.state['Credits'] -= entry.get('Amount', 0)
elif event_type == 'RedeemVoucher': elif event_type == 'RedeemVoucher':
self.state['Credits'] += entry['Amount'] self.state['Credits'] += entry.get('Amount', 0)
elif event_type in ('RefuelAll', 'RefuelPartial', 'Repair', 'RepairAll', 'RestockVehicle'): elif event_type in ('RefuelAll', 'RefuelPartial', 'Repair', 'RepairAll', 'RestockVehicle'):
self.state['Credits'] -= entry['Cost'] self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'SellShipOnRebuy': elif event_type == 'SellShipOnRebuy':
self.state['Credits'] += entry['ShipPrice'] self.state['Credits'] += entry.get('ShipPrice', 0)
elif event_type == 'ShipyardSell': elif event_type == 'ShipyardSell':
self.state['Credits'] += entry['ShipPrice'] self.state['Credits'] += entry.get('ShipPrice', 0)
elif event_type == 'ShipyardTransfer': elif event_type == 'ShipyardTransfer':
self.state['Credits'] -= entry['TransferPrice'] self.state['Credits'] -= entry.get('TransferPrice', 0)
elif event_type == 'PowerplayFastTrack': elif event_type == 'PowerplayFastTrack':
self.state['Credits'] -= entry['Cost'] self.state['Credits'] -= entry.get('Cost', 0)
elif event_type == 'PowerplaySalary': elif event_type == 'PowerplaySalary':
self.state['Credits'] += entry['Amount'] self.state['Credits'] += entry.get('Amount', 0)
elif event_type == 'SquadronCreated': elif event_type == 'SquadronCreated':
# v30 docs don't actually say anything about credits cost # v30 docs don't actually say anything about credits cost
pass pass
elif event_type == 'CarrierBuy': elif event_type == 'CarrierBuy':
self.state['Credits'] -= entry['Price'] self.state['Credits'] -= entry.get('Price', 0)
elif event_type == 'CarrierBankTransfer': elif event_type == 'CarrierBankTransfer':
self.state['Credits'] = entry['PlayerBalance'] if (newbal := entry.get('PlayerBalance')):
self.state['Credits'] = newbal
elif event_type == 'CarrierDecommission': elif event_type == 'CarrierDecommission':
# v30 doc says nothing about citing the refund amount # v30 doc says nothing about citing the refund amount
pass pass
elif event_type == 'NpcCrewPaidWage': elif event_type == 'NpcCrewPaidWage':
self.state['Credits'] -= entry['Amount'] self.state['Credits'] -= entry.get('Amount', 0)
elif event_type == 'Resurrect': elif event_type == 'Resurrect':
self.state['Credits'] -= entry['Cost'] self.state['Credits'] -= entry.get('Cost', 0)
return entry return entry