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

Merge pull request #1186 from A-UNDERSCORE-D/enhancement/odyssey-update-5

Enhancement/odyssey update 5
This commit is contained in:
Athanasius 2021-07-29 15:05:34 +01:00 committed by GitHub
commit 2098600aa8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 16 deletions

View File

@ -571,6 +571,20 @@ edmc_suit_symbol_localised = {
},
}
# WORKAROUND 2021-07-03 | 4.0.0.600 Update 5: duplicates of `fileheader` keys in `LoadGame`,
# but the GameLanguage in the latter has doubled up the `\`, so cater for either here.
# This is sourced from what the game is passed by the launcher, caveat emptor. It was mentioned that / is also
# an option
# This is only run once when this file is imported by something, no runtime cost or repeated expansions will occur
__keys = list(edmc_suit_symbol_localised.keys())
for lang in __keys:
new_lang = lang.replace('\\', r'\\')
new_lang_2 = lang.replace('\\', '/')
edmc_suit_symbol_localised[new_lang] = edmc_suit_symbol_localised[lang]
edmc_suit_symbol_localised[new_lang_2] = edmc_suit_symbol_localised[lang]
# Local webserver for debugging. See implementation in debug_webserver.py
DEBUG_WEBSERVER_HOST = '127.0.0.1'
DEBUG_WEBSERVER_PORT = 9090

View File

@ -182,9 +182,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
if journal_dir == '' or journal_dir is None:
journal_dir = config.default_journal_dir
# TODO(A_D): this is ignored for type checking due to all the different types config.get returns
# When that is refactored, remove the magic comment
logdir = expanduser(journal_dir) # type: ignore # config is weird
logdir = expanduser(journal_dir)
if not logdir or not isdir(logdir):
logger.error(f'Journal Directory is invalid: "{logdir}"')
@ -201,11 +199,11 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# Do this before setting up the observer in case the journal directory has gone away
try: # TODO: This should be replaced with something specific ONLY wrapping listdir
logfiles = sorted(
(x for x in listdir(self.currentdir) if self._RE_LOGFILE.search(x)), # type: ignore # config is weird
(x for x in listdir(self.currentdir) if self._RE_LOGFILE.search(x)),
key=lambda x: x.split('.')[1:]
)
self.logfile = join(self.currentdir, logfiles[-1]) if logfiles else None # type: ignore # config is weird
self.logfile = join(self.currentdir, logfiles[-1]) if logfiles else None
except Exception:
logger.exception('Failed to find latest logfile')
@ -492,8 +490,6 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
event_type = entry['event'].lower()
if event_type == 'fileheader':
self.live = False
self.version = entry['gameversion']
self.is_beta = any(v in entry['gameversion'].lower() for v in ('alpha', 'beta'))
self.cmdr = None
self.mode = None
@ -508,15 +504,17 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
self.systemaddress = None
self.started = None
self.__init_state()
# In self.state as well, as that's what plugins get
self.state['GameLanguage'] = entry['language']
self.state['GameVersion'] = entry['gameversion']
self.state['GameBuild'] = entry['build']
# Do this AFTER __init_state() lest our nice new state entries be None
self.populate_version_info(entry)
elif event_type == 'commander':
self.live = True # First event in 3.0
elif event_type == 'loadgame':
# Odyssey Release Update 5 -- This contains data that doesn't match the format used in FileHeader above
self.populate_version_info(entry, suppress=True)
# alpha4
# Odyssey: bool
self.cmdr = entry['Commander']
@ -914,7 +912,11 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
logger.warning(f'We have a BackPackMaterials event, defunct since > 4.0.0.102 ?:\n{entry}\n')
pass
elif event_type == 'backpack':
elif event_type in ('backpack', 'resupply'):
# as of v4.0.0.600, a `resupply` event is dropped when resupplying your suit at your ship.
# This event writes the same data as a backpack event. It will also be followed by a ShipLocker
# but that follows normal behaviour in its handler.
# TODO: v31 doc says this is`backpack.json` ... but Howard Chalkley
# said it's `Backpack.json`
backpack_file = pathlib.Path(str(self.currentdir)) / 'Backpack.json'
@ -1110,7 +1112,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
'edmcName': self.suit_sane_name(loc_name),
'id': None, # Is this an FDev ID for suit type ?
'suitId': entry['SuitID'],
'slots': [],
'mods': entry['SuitMods'], # Suits can (rarely) be bought with modules installed
}
# update credits
@ -1175,6 +1177,8 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
'id': None,
'weaponrackId': entry['SuitModuleID'],
'locDescription': '',
'class': entry['Class'],
'mods': entry['WeaponMods']
}
except KeyError:
@ -1573,6 +1577,22 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
logger.debug(f'Invalid journal entry:\n{line!r}\n', exc_info=ex)
return {'event': None}
def populate_version_info(self, entry: MutableMapping[str, str], suppress: bool = False):
"""
Update game version information stored locally.
:param entry: Either a Fileheader or LoadGame event
"""
try:
self.state['GameLanguage'] = entry['language']
self.state['GameVersion'] = entry['gameversion']
self.state['GameBuild'] = entry['build']
self.version = self.state['GameVersion']
self.is_beta = any(v in self.version.lower() for v in ('alpha', 'beta'))
except KeyError:
if not suppress:
raise
def backpack_set_empty(self):
"""Set the BackPack contents to be empty."""
self.state['BackPack']['Component'] = defaultdict(int)
@ -1647,10 +1667,14 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
suit = {
'edmcName': edmc_suitname,
'locName': suitname,
'suitId': entry['SuitID'],
'name': entry['SuitName'],
}
# Overwrite with latest data, just in case, as this can be from CAPI which may or may not have had
# all the data we wanted
suit['suitId'] = entry['SuitID']
suit['name'] = entry['SuitName']
suit['mods'] = entry['SuitMods']
suitloadout_slotid = self.suit_loadout_id_from_loadoutid(entry['LoadoutID'])
# Make the new loadout, in the CAPI format
new_loadout = {
@ -1664,7 +1688,6 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
# Now add in the extra fields for new_suit to be a 'full' Suit structure
suit['id'] = suit.get('id') # Not available in 4.0.0.100 journal event
suit['slots'] = new_loadout['slots'] # 'slots', not 'Modules', to match CAPI
# Ensure the suit is in self.state['Suits']
self.state['Suits'][f"{suitid}"] = suit
@ -2097,6 +2120,8 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below
'weaponrackId': loadout_slots[s]['SuitModuleID'],
'locName': loadout_slots[s].get('ModuleName_Localised', loadout_slots[s]['ModuleName']),
'locDescription': '',
'class': loadout_slots[s]['Class'],
'mods': loadout_slots[s]['WeaponMods'],
}
return slots

View File

@ -341,6 +341,8 @@ def journal_entry( # noqa: C901, CCR001
elif (ks := killswitch.get_disabled(f'plugins.inara.journal.event.{entry["event"]}')).disabled:
logger.warning(f'event {entry["event"]} processing has been disabled via killswitch: {ks.reason}')
# this can and WILL break state, but if we're concerned about it sending bad data, we'd disable globally anyway
return ''
this.on_foot = state['OnFoot']
event_name: str = entry['event']