From d8dd7af2e22db2e426a91ebff04d6562dd204439 Mon Sep 17 00:00:00 2001 From: Jonathan Harris Date: Sat, 10 Feb 2018 17:10:03 +0000 Subject: [PATCH] Adjust batching for new startup event order --- monitor.py | 4 ++-- plugins/edsm.py | 38 ++++++++++++++++++++++++-------------- plugins/inara.py | 14 +++++++------- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/monitor.py b/monitor.py index 9b626681..b60eca34 100644 --- a/monitor.py +++ b/monitor.py @@ -328,8 +328,9 @@ class EDLogs(FileSystemEventHandler): 'ShipName' : None, 'ShipType' : None, } + elif entry['event'] == 'Commander': + self.live = True # First event in 3.0 elif entry['event'] == 'LoadGame': - self.live = True self.cmdr = entry['Commander'] self.mode = entry.get('GameMode') # 'Open', 'Solo', 'Group', or None for CQC (and Training - but no LoadGame event) self.group = entry.get('Group') @@ -413,7 +414,6 @@ class EDLogs(FileSystemEventHandler): self.state['Rank'][k] = (self.state['Rank'][k][0], min(v, 100)) # perhaps not taken promotion mission yet elif entry['event'] == 'Cargo': - self.live = True # First event in 2.3 self.state['Cargo'] = defaultdict(int) self.state['Cargo'].update({ self.canonicalise(x['Name']): x['Count'] for x in entry['Inventory'] }) elif entry['event'] in ['CollectCargo', 'MarketBuy', 'BuyDrones', 'MiningRefined']: diff --git a/plugins/edsm.py b/plugins/edsm.py index d4ce4d05..5cb0b824 100644 --- a/plugins/edsm.py +++ b/plugins/edsm.py @@ -39,6 +39,8 @@ this.lastlookup = False # whether the last lookup succeeded # Game state this.multicrew = False # don't send captain's ship info to EDSM while on a crew this.coordinates = None +this.newgame = False # starting up - batch initial burst of events +this.newgame_docked = False # starting up while docked def plugin_start(): # Can't be earlier since can only call PhotoImage after window is created @@ -198,6 +200,16 @@ def journal_entry(cmdr, is_beta, system, station, entry, state): elif entry['event'] == 'LoadGame': this.coordinates = None + if entry['event'] in ['LoadGame', 'Commander', 'NewCommander']: + this.newgame = True + this.newgame_docked = False + elif entry['event'] == 'StartUp': + this.newgame = False + this.newgame_docked = False + elif entry['event'] == 'Location': + this.newgame = True + this.newgame_docked = entry.get('Docked', False) + # Send interesting events to EDSM if config.getint('edsm_out') and not is_beta and not this.multicrew and credentials(cmdr) and entry['event'] not in this.discardedEvents: # Introduce transient states into the event @@ -210,15 +222,7 @@ def journal_entry(cmdr, is_beta, system, station, entry, state): entry.update(transient) if entry['event'] == 'LoadGame': - # Synthesise Cargo and Materials events on LoadGame since we will have missed them because Cmdr was unknown - cargo = { - 'timestamp': entry['timestamp'], - 'event': 'Cargo', - 'Inventory': [ { 'Name': k, 'Count': v } for k,v in state['Cargo'].iteritems() ], - } - cargo.update(transient) - this.queue.put((cmdr, cargo)) - + # Synthesise Materials events on LoadGame since we will have missed it materials = { 'timestamp': entry['timestamp'], 'event': 'Materials', @@ -311,7 +315,7 @@ def worker(): print('EDSM\t%s %s\t%s' % (msgnum, msg, json.dumps(pending, separators = (',', ': ')))) plug.show_error(_('Error: EDSM {MSG}').format(MSG=msg)) else: - for e, r in zip(pending, reply): + for e, r in zip(pending, reply['events']): if not closing and e['event'] in ['StartUp', 'Location', 'FSDJump']: # Update main window's system status this.lastlookup = r @@ -337,10 +341,16 @@ def worker(): # Whether any of the entries should be sent immediately def should_send(entries): for entry in entries: - if (entry['event'] not in ['CommunityGoal', # Spammed periodically - 'Cargo', 'Loadout', 'Materials', 'LoadGame', 'Rank', 'Progress', # Will be followed by 'Docked' or 'Location' - 'ShipyardBuy', 'ShipyardNew', 'ShipyardSwap'] and # " - not (entry['event'] == 'Location' and entry.get('Docked'))): # " + if (entry['event'] == 'Cargo' and not this.newgame_docked) or entry['event'] == 'Docked': + # Cargo is the last event on startup, unless starting when docked in which case Docked is the last event + this.newgame = False + this.newgame_docked = False + return True + elif this.newgame: + pass + elif entry['event'] not in ['CommunityGoal', # Spammed periodically + 'ModuleBuy', 'ModuleSell', 'ModuleSwap', # will be shortly followed by "Loadout" + 'ShipyardBuy', 'ShipyardNew', 'ShipyardSwap']: # " return True return False diff --git a/plugins/inara.py b/plugins/inara.py index d0d731f2..e5392f6b 100644 --- a/plugins/inara.py +++ b/plugins/inara.py @@ -36,7 +36,7 @@ this.cmdr = None this.multicrew = False # don't send captain's ship info to Inara while on a crew this.newuser = False # just entered API Key this.undocked = False # just undocked -this.suppress_docked = False # Skip Docked event after Location if started docked +this.suppress_docked = False # Skip initial Docked event if started docked this.cargo = None this.materials = None this.lastcredits = 0 # Send credit update soon after Startup / new game @@ -163,7 +163,7 @@ def journal_entry(cmdr, is_beta, system, station, entry, state): this.suppress_docked = True - # Send location and status on new game or StartUp. Assumes Location is the last event on a new game (other than Docked). + # Send location and status on new game or StartUp. Assumes Cargo is the last event on a new game (other than Docked). # Always send an update on Docked, FSDJump, Undocked+SuperCruise, Promotion and EngineerProgress. # Also send material and cargo (if changed) whenever we send an update. @@ -172,7 +172,7 @@ def journal_entry(cmdr, is_beta, system, station, entry, state): old_events = len(this.events) # Will only send existing events if we add a new event below # Send rank info to Inara on startup or change - if (entry['event'] in ['StartUp', 'Location'] or this.newuser) and state['Rank']: + if (entry['event'] in ['StartUp', 'Cargo'] or this.newuser): for k,v in state['Rank'].iteritems(): if v is not None: add_event('setCommanderRankPilot', entry['timestamp'], @@ -227,7 +227,7 @@ def journal_entry(cmdr, is_beta, system, station, entry, state): ])) # Update ship - if (entry['event'] in ['StartUp', 'Location', 'ShipyardNew'] or + if (entry['event'] in ['StartUp', 'Cargo'] or (entry['event'] == 'Loadout' and this.shipswap) or this.newuser): if entry['event'] == 'ShipyardNew': @@ -247,7 +247,7 @@ def journal_entry(cmdr, is_beta, system, station, entry, state): this.shipswap = False # Update location - if (entry['event'] in ['StartUp', 'Location'] or this.newuser) and system: + if (entry['event'] in ['StartUp', 'Cargo'] or this.newuser) and system: this.undocked = False add_event('setCommanderTravelLocation', entry['timestamp'], OrderedDict([ @@ -262,7 +262,7 @@ def journal_entry(cmdr, is_beta, system, station, entry, state): # Undocked and now docking again. Don't send. this.undocked = False elif this.suppress_docked: - # Don't send Docked event on new game - i.e. following 'Location' event + # Don't send initial Docked event on new game this.suppress_docked = False else: add_event('addCommanderTravelDock', entry['timestamp'], @@ -603,7 +603,7 @@ def worker(): # Log individual errors and warnings for data_event, reply_event in zip(data['events'], reply['events']): if reply_event['eventStatus'] != 200: - print 'Inara\t%s %s\t%s' % (reply_event['eventStatus'], reply_event.get('eventStatusText', ''), json.dumps(data_event, separators = (',', ': '))) + print 'Inara\t%s %s\t%s' % (reply_event['eventStatus'], reply_event.get('eventStatusText', ''), json.dumps(data_event)) if reply_event['eventStatus'] // 100 != 2: plug.show_error(_('Error: Inara {MSG}').format(MSG = '%s, %s' % (data_event['eventName'], reply_event.get('eventStatusText', reply_event['eventStatus'])))) if data_event['eventName'] in ['addCommanderTravelDock', 'addCommanderTravelFSDJump', 'setCommanderTravelLocation']: