1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-04-19 18:37:39 +03:00

shiplocker: Implement ShipLocker.json load/decoding retries

* Currently a maximum of 5 attempts, 10ms apart.
* I was going to blank `entry = {}` for this, but there's a chance the
  file load would fail when at startup and Embark the in-Journal event
  actually has all the data.  So we cross our fingers and hope that's
  the case if loading fails.
* Changed the "not all the categories" logging to WARN to call out the
  failure.
* Removed old comment about not touching Backpack here.
This commit is contained in:
Athanasius 2021-08-07 14:38:03 +01:00
parent 292b508985
commit dc953b49a6
No known key found for this signature in database
GPG Key ID: AE3E527847057C7D

View File

@ -866,29 +866,38 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
elif event_type == 'shiplocker':
# As of 4.0.0.400 (2021-06-10)
# "ShipLocker" will be a full list written to the journal at startup/boarding/disembarking, and also
# "ShipLocker" will be a full list written to the journal at startup/boarding, and also
# written to a separate shiplocker.json file - other updates will just update that file and mention it
# has changed with an empty shiplocker event in the main journal.
# Always attempt loading of this.
# Confirmed filename for 4.0.0.400
# Always attempt loading of this, but if it fails we'll hope this was
# a startup/boarding version and thus `entry` contains
# the data anyway.
currentdir_path = pathlib.Path(str(self.currentdir))
shiplocker_filename = currentdir_path / 'ShipLocker.json'
try:
with open(shiplocker_filename, 'rb') as h: # type: ignore
entry = json.load(h, object_pairs_hook=OrderedDict)
self.state['ShipLockerJSON'] = entry
shiplocker_max_attempts = 5
shiplocker_fail_sleep = 0.01
attempts = 0
while attempts < shiplocker_max_attempts:
attempts += 1
try:
with open(shiplocker_filename, 'rb') as h: # type: ignore
entry = json.load(h, object_pairs_hook=OrderedDict)
self.state['ShipLockerJSON'] = entry
break
except FileNotFoundError:
logger.warning('ShipLocker event but no ShipLocker.json file')
pass
except FileNotFoundError:
logger.warning('ShipLocker event but no ShipLocker.json file')
sleep(shiplocker_fail_sleep)
pass
except json.JSONDecodeError as e:
logger.warning(f'ShipLocker.json failed to decode:\n{e!r}\n')
pass
except json.JSONDecodeError as e:
logger.warning(f'ShipLocker.json failed to decode:\n{e!r}\n')
sleep(shiplocker_fail_sleep)
pass
if not all(t in entry for t in ('Components', 'Consumables', 'Data', 'Items')):
logger.trace('ShipLocker event is an empty one (missing at least one data type)')
logger.warning('ShipLocker event is missing at least one category')
# This event has the current totals, so drop any current data
self.state['Component'] = defaultdict(int)
@ -896,10 +905,6 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.state['Item'] = defaultdict(int)
self.state['Data'] = defaultdict(int)
# 4.0.0.400 - No longer zeroing out the BackPack in this event,
# as we should now always get either `Backpack` event/file or
# `BackpackChange` as needed.
clean_components = self.coalesce_cargo(entry['Components'])
self.state['Component'].update(
{self.canonicalise(x['Name']): x['Count'] for x in clean_components}