mirror of
https://github.com/EDCD/EDMarketConnector.git
synced 2025-06-08 11:22:10 +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:
parent
292b508985
commit
dc953b49a6
41
monitor.py
41
monitor.py
@ -866,29 +866,38 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
|
|||||||
|
|
||||||
elif event_type == 'shiplocker':
|
elif event_type == 'shiplocker':
|
||||||
# As of 4.0.0.400 (2021-06-10)
|
# 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
|
# 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.
|
# has changed with an empty shiplocker event in the main journal.
|
||||||
|
|
||||||
# Always attempt loading of this.
|
# Always attempt loading of this, but if it fails we'll hope this was
|
||||||
# Confirmed filename for 4.0.0.400
|
# a startup/boarding version and thus `entry` contains
|
||||||
|
# the data anyway.
|
||||||
currentdir_path = pathlib.Path(str(self.currentdir))
|
currentdir_path = pathlib.Path(str(self.currentdir))
|
||||||
shiplocker_filename = currentdir_path / 'ShipLocker.json'
|
shiplocker_filename = currentdir_path / 'ShipLocker.json'
|
||||||
try:
|
shiplocker_max_attempts = 5
|
||||||
with open(shiplocker_filename, 'rb') as h: # type: ignore
|
shiplocker_fail_sleep = 0.01
|
||||||
entry = json.load(h, object_pairs_hook=OrderedDict)
|
attempts = 0
|
||||||
self.state['ShipLockerJSON'] = entry
|
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:
|
except FileNotFoundError:
|
||||||
logger.warning('ShipLocker event but no ShipLocker.json file')
|
logger.warning('ShipLocker event but no ShipLocker.json file')
|
||||||
pass
|
sleep(shiplocker_fail_sleep)
|
||||||
|
pass
|
||||||
|
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
logger.warning(f'ShipLocker.json failed to decode:\n{e!r}\n')
|
logger.warning(f'ShipLocker.json failed to decode:\n{e!r}\n')
|
||||||
pass
|
sleep(shiplocker_fail_sleep)
|
||||||
|
pass
|
||||||
|
|
||||||
if not all(t in entry for t in ('Components', 'Consumables', 'Data', 'Items')):
|
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
|
# This event has the current totals, so drop any current data
|
||||||
self.state['Component'] = defaultdict(int)
|
self.state['Component'] = defaultdict(int)
|
||||||
@ -896,10 +905,6 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
|
|||||||
self.state['Item'] = defaultdict(int)
|
self.state['Item'] = defaultdict(int)
|
||||||
self.state['Data'] = 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'])
|
clean_components = self.coalesce_cargo(entry['Components'])
|
||||||
self.state['Component'].update(
|
self.state['Component'].update(
|
||||||
{self.canonicalise(x['Name']): x['Count'] for x in clean_components}
|
{self.canonicalise(x['Name']): x['Count'] for x in clean_components}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user