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

Added variables for repeatedly indexed keys

Repeatedly indexing keys is in general slow. And, not only is it slow,
it makes reading code hell.
This commit is contained in:
A_D 2020-07-21 12:10:12 +02:00 committed by Athanasius
parent 12fdbd0678
commit 21ab456e22

View File

@ -8,6 +8,7 @@ from os.path import basename, expanduser, isdir, join
from sys import platform from sys import platform
from time import gmtime, localtime, sleep, strftime, strptime, time from time import gmtime, localtime, sleep, strftime, strptime, time
from calendar import timegm from calendar import timegm
from typing import Any, Dict
if __debug__: if __debug__:
from traceback import print_exc from traceback import print_exc
@ -342,9 +343,11 @@ class EDLogs(FileSystemEventHandler):
return {'event': None} # Fake startup event return {'event': None} # Fake startup event
try: try:
entry = json.loads(line, object_pairs_hook=OrderedDict) # Preserve property order because why not? entry: Dict[str, Any] = json.loads(line, object_pairs_hook=OrderedDict) # Preserve property order because why not?
entry['timestamp'] # we expect this to exist entry['timestamp'] # we expect this to exist
if entry['event'] == 'Fileheader':
event_type = entry['event']
if event_type == 'Fileheader':
self.live = False self.live = False
self.version = entry['gameversion'] self.version = entry['gameversion']
self.is_beta = 'beta' in entry['gameversion'].lower() self.is_beta = 'beta' in entry['gameversion'].lower()
@ -386,10 +389,10 @@ class EDLogs(FileSystemEventHandler):
'Modules': None, 'Modules': None,
} }
elif entry['event'] == 'Commander': elif event_type == 'Commander':
self.live = True # First event in 3.0 self.live = True # First event in 3.0
elif entry['event'] == 'LoadGame': elif event_type == 'LoadGame':
self.cmdr = entry['Commander'] self.cmdr = entry['Commander']
# 'Open', 'Solo', 'Group', or None for CQC (and Training - but no LoadGame event) # 'Open', 'Solo', 'Group', or None for CQC (and Training - but no LoadGame event)
self.mode = entry.get('GameMode') self.mode = entry.get('GameMode')
@ -417,11 +420,11 @@ class EDLogs(FileSystemEventHandler):
'Role': None, 'Role': None,
}) })
elif entry['event'] == 'NewCommander': elif event_type == 'NewCommander':
self.cmdr = entry['Name'] self.cmdr = entry['Name']
self.group = None self.group = None
elif entry['event'] == 'SetUserShipName': elif event_type == 'SetUserShipName':
self.state['ShipID'] = entry['ShipID'] self.state['ShipID'] = entry['ShipID']
if 'UserShipId' in entry: # Only present when changing the ship's ident if 'UserShipId' in entry: # Only present when changing the ship's ident
self.state['ShipIdent'] = entry['UserShipId'] self.state['ShipIdent'] = entry['UserShipId']
@ -429,7 +432,7 @@ class EDLogs(FileSystemEventHandler):
self.state['ShipName'] = entry.get('UserShipName') self.state['ShipName'] = entry.get('UserShipName')
self.state['ShipType'] = self.canonicalise(entry['Ship']) self.state['ShipType'] = self.canonicalise(entry['Ship'])
elif entry['event'] == 'ShipyardBuy': elif event_type == 'ShipyardBuy':
self.state['ShipID'] = None self.state['ShipID'] = None
self.state['ShipIdent'] = None self.state['ShipIdent'] = None
self.state['ShipName'] = None self.state['ShipName'] = None
@ -439,7 +442,7 @@ class EDLogs(FileSystemEventHandler):
self.state['Rebuy'] = None self.state['Rebuy'] = None
self.state['Modules'] = None self.state['Modules'] = None
elif entry['event'] == 'ShipyardSwap': elif event_type == 'ShipyardSwap':
self.state['ShipID'] = entry['ShipID'] self.state['ShipID'] = entry['ShipID']
self.state['ShipIdent'] = None self.state['ShipIdent'] = None
self.state['ShipName'] = None self.state['ShipName'] = None
@ -449,7 +452,7 @@ class EDLogs(FileSystemEventHandler):
self.state['Rebuy'] = None self.state['Rebuy'] = None
self.state['Modules'] = None self.state['Modules'] = None
elif (entry['event'] == 'Loadout' and elif (event_type == 'Loadout' and
'fighter' not in self.canonicalise(entry['Ship']) and 'fighter' not in self.canonicalise(entry['Ship']) and
'buggy' not in self.canonicalise(entry['Ship'])): 'buggy' not in self.canonicalise(entry['Ship'])):
self.state['ShipID'] = entry['ShipID'] self.state['ShipID'] = entry['ShipID']
@ -479,7 +482,7 @@ class EDLogs(FileSystemEventHandler):
self.state['Modules'][module['Slot']] = module self.state['Modules'][module['Slot']] = module
elif entry['event'] == 'ModuleBuy': elif event_type == 'ModuleBuy':
self.state['Modules'][entry['Slot']] = { self.state['Modules'][entry['Slot']] = {
'Slot': entry['Slot'], 'Slot': entry['Slot'],
'Item': self.canonicalise(entry['BuyItem']), 'Item': self.canonicalise(entry['BuyItem']),
@ -489,29 +492,32 @@ class EDLogs(FileSystemEventHandler):
'Value': entry['BuyPrice'], 'Value': entry['BuyPrice'],
} }
elif entry['event'] == 'ModuleSell': elif event_type == 'ModuleSell':
self.state['Modules'].pop(entry['Slot'], None) self.state['Modules'].pop(entry['Slot'], None)
elif entry['event'] == 'ModuleSwap': elif event_type == 'ModuleSwap':
to_item = self.state['Modules'].get(entry['ToSlot']) to_item = self.state['Modules'].get(entry['ToSlot'])
self.state['Modules'][entry['ToSlot']] = self.state['Modules'][entry['FromSlot']] to_slot = entry['ToSlot']
from_slot = entry['FromSlot']
modules = self.state['Modules']
modules[to_slot] = modules[from_slot]
if to_item: if to_item:
self.state['Modules'][entry['FromSlot']] = to_item modules[from_slot] = to_item
else: else:
self.state['Modules'].pop(entry['FromSlot'], None) modules.pop(from_slot, None)
elif entry['event'] == 'Undocked': elif event_type == 'Undocked':
self.station = None self.station = None
self.station_marketid = None self.station_marketid = None
self.stationtype = None self.stationtype = None
self.stationservices = None self.stationservices = None
elif entry['event'] in ('Location', 'FSDJump', 'Docked', 'CarrierJump'): elif event_type in ('Location', 'FSDJump', 'Docked', 'CarrierJump'):
if entry['event'] in ('Location', 'CarrierJump'): if event_type in ('Location', 'CarrierJump'):
self.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None self.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None
elif entry['event'] == 'FSDJump': elif event_type == 'FSDJump':
self.planet = None self.planet = None
if 'StarPos' in entry: if 'StarPos' in entry:
@ -522,7 +528,7 @@ class EDLogs(FileSystemEventHandler):
self.systemaddress = entry.get('SystemAddress') self.systemaddress = entry.get('SystemAddress')
if entry['event'] in ('Location', 'FSDJump', 'CarrierJump'): if event_type in ('Location', 'FSDJump', 'CarrierJump'):
self.systempopulation = entry.get('Population') self.systempopulation = entry.get('Population')
self.system = 'CQC' if entry['StarSystem'] == 'ProvingGround' else entry['StarSystem'] self.system = 'CQC' if entry['StarSystem'] == 'ProvingGround' else entry['StarSystem']
@ -531,32 +537,34 @@ class EDLogs(FileSystemEventHandler):
self.stationtype = entry.get('StationType') # May be None self.stationtype = entry.get('StationType') # May be None
self.stationservices = entry.get('StationServices') # None under E:D < 2.4 self.stationservices = entry.get('StationServices') # None under E:D < 2.4
elif entry['event'] == 'ApproachBody': elif event_type == 'ApproachBody':
self.planet = entry['Body'] self.planet = entry['Body']
elif entry['event'] in ('LeaveBody', 'SupercruiseEntry'): elif event_type in ('LeaveBody', 'SupercruiseEntry'):
self.planet = None self.planet = None
elif entry['event'] in ('Rank', 'Promotion'): elif event_type in ('Rank', 'Promotion'):
payload = dict(entry) payload = dict(entry)
payload.pop('event') payload.pop('event')
payload.pop('timestamp') payload.pop('timestamp')
self.state['Rank'].update({k: (v, 0) for k, v in payload.items()}) self.state['Rank'].update({k: (v, 0) for k, v in payload.items()})
elif entry['event'] == 'Progress': elif event_type == 'Progress':
rank = self.state['Rank']
for k, v in entry.items(): for k, v in entry.items():
if k in self.state['Rank']: if k in rank:
# perhaps not taken promotion mission yet # perhaps not taken promotion mission yet
self.state['Rank'][k] = (self.state['Rank'][k][0], min(v, 100)) rank[k] = (rank[k][0], min(v, 100))
elif entry['event'] in ('Reputation', 'Statistics'): elif event_type in ('Reputation', 'Statistics'):
payload = OrderedDict(entry) payload = OrderedDict(entry)
payload.pop('event') payload.pop('event')
payload.pop('timestamp') payload.pop('timestamp')
self.state[entry['event']] = payload self.state[event_type] = payload
elif entry['event'] == 'EngineerProgress': elif event_type == 'EngineerProgress':
engineers = self.state['Engineers']
if 'Engineers' in entry: # Startup summary if 'Engineers' in entry: # Startup summary
self.state['Engineers'] = { self.state['Engineers'] = {
e['Engineer']: (e['Rank'], e.get('RankProgress', 0)) e['Engineer']: (e['Rank'], e.get('RankProgress', 0))
@ -564,13 +572,14 @@ class EDLogs(FileSystemEventHandler):
} }
else: # Promotion else: # Promotion
engineer = entry['Engineer']
if 'Rank' in entry: if 'Rank' in entry:
self.state['Engineers'][entry['Engineer']] = (entry['Rank'], entry.get('RankProgress', 0)) engineers[engineer] = (entry['Rank'], entry.get('RankProgress', 0))
else: else:
self.state['Engineers'][entry['Engineer']] = entry['Progress'] engineers[engineer] = entry['Progress']
elif entry['event'] == 'Cargo' and entry.get('Vessel') == 'Ship': elif event_type == 'Cargo' and entry.get('Vessel') == 'Ship':
self.state['Cargo'] = defaultdict(int) self.state['Cargo'] = defaultdict(int)
# From 3.3 full Cargo event (after the first one) is written to a separate file # From 3.3 full Cargo event (after the first one) is written to a separate file
if 'Inventory' not in entry: if 'Inventory' not in entry:
@ -579,41 +588,44 @@ class EDLogs(FileSystemEventHandler):
self.state['Cargo'].update({self.canonicalise(x['Name']): x['Count'] for x in entry['Inventory']}) self.state['Cargo'].update({self.canonicalise(x['Name']): x['Count'] for x in entry['Inventory']})
elif entry['event'] in ('CollectCargo', 'MarketBuy', 'BuyDrones', 'MiningRefined'): elif event_type in ('CollectCargo', 'MarketBuy', 'BuyDrones', 'MiningRefined'):
commodity = self.canonicalise(entry['Type']) commodity = self.canonicalise(entry['Type'])
self.state['Cargo'][commodity] += entry.get('Count', 1) self.state['Cargo'][commodity] += entry.get('Count', 1)
elif entry['event'] in ('EjectCargo', 'MarketSell', 'SellDrones'): elif event_type in ('EjectCargo', 'MarketSell', 'SellDrones'):
commodity = self.canonicalise(entry['Type']) commodity = self.canonicalise(entry['Type'])
self.state['Cargo'][commodity] -= entry.get('Count', 1) cargo = self.state['Cargo']
if self.state['Cargo'][commodity] <= 0: cargo[commodity] -= entry.get('Count', 1)
self.state['Cargo'].pop(commodity) if cargo[commodity] <= 0:
cargo.pop(commodity)
elif entry['event'] == 'SearchAndRescue': elif event_type == 'SearchAndRescue':
for item in entry.get('Items', []): for item in entry.get('Items', []):
commodity = self.canonicalise(item['Name']) commodity = self.canonicalise(item['Name'])
self.state['Cargo'][commodity] -= item.get('Count', 1) cargo = self.state['Cargo']
if self.state['Cargo'][commodity] <= 0: cargo[commodity] -= item.get('Count', 1)
self.state['Cargo'].pop(commodity) if cargo[commodity] <= 0:
cargo.pop(commodity)
elif entry['event'] == 'Materials': elif event_type == 'Materials':
for category in ('Raw', 'Manufactured', 'Encoded'): for category in ('Raw', 'Manufactured', 'Encoded'):
self.state[category] = defaultdict(int) self.state[category] = defaultdict(int)
self.state[category].update({ self.state[category].update({
self.canonicalise(x['Name']): x['Count'] for x in entry.get(category, []) self.canonicalise(x['Name']): x['Count'] for x in entry.get(category, [])
}) })
elif entry['event'] == 'MaterialCollected': elif event_type == 'MaterialCollected':
material = self.canonicalise(entry['Name']) material = self.canonicalise(entry['Name'])
self.state[entry['Category']][material] += entry['Count'] self.state[entry['Category']][material] += entry['Count']
elif entry['event'] in ('MaterialDiscarded', 'ScientificResearch'): elif event_type in ('MaterialDiscarded', 'ScientificResearch'):
material = self.canonicalise(entry['Name']) material = self.canonicalise(entry['Name'])
self.state[entry['Category']][material] -= entry['Count'] state_category = self.state[entry['Category']]
if self.state[entry['Category']][material] <= 0: state_category[material] -= entry['Count']
self.state[entry['Category']].pop(material) if state_category[material] <= 0:
state_category.pop(material)
elif entry['event'] == 'Synthesis': elif event_type == 'Synthesis':
for category in ('Raw', 'Manufactured', 'Encoded'): for category in ('Raw', 'Manufactured', 'Encoded'):
for x in entry['Materials']: for x in entry['Materials']:
material = self.canonicalise(x['Name']) material = self.canonicalise(x['Name'])
@ -622,17 +634,21 @@ class EDLogs(FileSystemEventHandler):
if self.state[category][material] <= 0: if self.state[category][material] <= 0:
self.state[category].pop(material) self.state[category].pop(material)
elif entry['event'] == 'MaterialTrade': elif event_type == 'MaterialTrade':
category = self.category(entry['Paid']['Category']) category = self.category(entry['Paid']['Category'])
self.state[category][entry['Paid']['Material']] -= entry['Paid']['Quantity'] state_category = self.state[category]
if self.state[category][entry['Paid']['Material']] <= 0: paid = entry['Paid']
self.state[category].pop(entry['Paid']['Material']) received = entry['Received']
category = self.category(entry['Received']['Category']) state_category[paid['Material']] -= paid['Quantity']
self.state[category][entry['Received']['Material']] += entry['Received']['Quantity'] if state_category[paid['Material']] <= 0:
state_category.pop(paid['Material'])
elif entry['event'] == 'EngineerCraft' or ( category = self.category(received['Category'])
entry['event'] == 'EngineerLegacyConvert' and not entry.get('IsPreview') state_category[received['Material']] += received['Quantity']
elif event_type == 'EngineerCraft' or (
event_type == 'EngineerLegacyConvert' and not entry.get('IsPreview')
): ):
for category in ('Raw', 'Manufactured', 'Encoded'): for category in ('Raw', 'Manufactured', 'Encoded'):
@ -663,7 +679,7 @@ class EDLogs(FileSystemEventHandler):
module['Engineering'].pop('ExperimentalEffect', None) module['Engineering'].pop('ExperimentalEffect', None)
module['Engineering'].pop('ExperimentalEffect_Localised', None) module['Engineering'].pop('ExperimentalEffect_Localised', None)
elif entry['event'] == 'MissionCompleted': elif event_type == 'MissionCompleted':
for reward in entry.get('CommodityReward', []): for reward in entry.get('CommodityReward', []):
commodity = self.canonicalise(reward['Name']) commodity = self.canonicalise(reward['Name'])
self.state['Cargo'][commodity] += reward.get('Count', 1) self.state['Cargo'][commodity] += reward.get('Count', 1)
@ -674,7 +690,7 @@ class EDLogs(FileSystemEventHandler):
material = self.canonicalise(reward['Name']) material = self.canonicalise(reward['Name'])
self.state[category][material] += reward.get('Count', 1) self.state[category][material] += reward.get('Count', 1)
elif entry['event'] == 'EngineerContribution': elif event_type == 'EngineerContribution':
commodity = self.canonicalise(entry.get('Commodity')) commodity = self.canonicalise(entry.get('Commodity'))
if commodity: if commodity:
self.state['Cargo'][commodity] -= entry['Quantity'] self.state['Cargo'][commodity] -= entry['Quantity']
@ -689,7 +705,7 @@ class EDLogs(FileSystemEventHandler):
if self.state[category][material] <= 0: if self.state[category][material] <= 0:
self.state[category].pop(material) self.state[category].pop(material)
elif entry['event'] == 'TechnologyBroker': elif event_type == 'TechnologyBroker':
for thing in entry.get('Ingredients', []): # 3.01 for thing in entry.get('Ingredients', []): # 3.01
for category in ('Cargo', 'Raw', 'Manufactured', 'Encoded'): for category in ('Cargo', 'Raw', 'Manufactured', 'Encoded'):
item = self.canonicalise(thing['Name']) item = self.canonicalise(thing['Name'])
@ -711,7 +727,7 @@ class EDLogs(FileSystemEventHandler):
if self.state[category][material] <= 0: if self.state[category][material] <= 0:
self.state[category].pop(material) self.state[category].pop(material)
elif entry['event'] == 'JoinACrew': elif event_type == 'JoinACrew':
self.state['Captain'] = entry['Captain'] self.state['Captain'] = entry['Captain']
self.state['Role'] = 'Idle' self.state['Role'] = 'Idle'
self.planet = None self.planet = None
@ -723,10 +739,10 @@ class EDLogs(FileSystemEventHandler):
self.coordinates = None self.coordinates = None
self.systemaddress = None self.systemaddress = None
elif entry['event'] == 'ChangeCrewRole': elif event_type == 'ChangeCrewRole':
self.state['Role'] = entry['Role'] self.state['Role'] = entry['Role']
elif entry['event'] == 'QuitACrew': elif event_type == 'QuitACrew':
self.state['Captain'] = None self.state['Captain'] = None
self.state['Role'] = None self.state['Role'] = None
self.planet = None self.planet = None
@ -738,7 +754,7 @@ class EDLogs(FileSystemEventHandler):
self.coordinates = None self.coordinates = None
self.systemaddress = None self.systemaddress = None
elif entry['event'] == 'Friends': elif event_type == 'Friends':
if entry['Status'] in ('Online', 'Added'): if entry['Status'] in ('Online', 'Added'):
self.state['Friends'].add(entry['Name']) self.state['Friends'].add(entry['Name'])