1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-04-14 08:17:13 +03:00

Automatically make a log entry on entering a system.

This commit is contained in:
Jonathan Harris 2015-11-01 14:06:00 +00:00
parent d485a73243
commit de1b790d44
5 changed files with 87 additions and 23 deletions

View File

@ -369,12 +369,28 @@ class AppWindow:
except:
pass
def system_change(self, system, timestamp):
def system_change(self, timestamp, system):
if self.system['text'] != system:
# TODO: EDSM lookup and csv and/or EDSM log
self.system['text'] = system
self.station['text'] = EDDB.system(system) and self.STATION_UNDOCKED or ''
self.status['text'] = strftime(_('Last updated at {HH}:{MM}:{SS}').format(HH='%H', MM='%M', SS='%S').encode('utf-8'), localtime(timestamp)).decode('utf-8')
try:
self.system['text'] = system
self.system['image'] = ''
self.station['text'] = EDDB.system(system) and self.STATION_UNDOCKED or ''
if config.getint('output') & config.OUT_LOG_FILE:
flightlog.writelog(timestamp, system)
if config.getint('output') & config.OUT_LOG_EDSM:
self.status['text'] = _('Sending data to EDSM...')
self.w.update_idletasks()
edsm.writelog(timestamp, system, lambda:self.edsm.lookup(system, EDDB.system(system))) # Do EDSM lookup during EDSM export
else:
self.edsm.start_lookup(system, EDDB.system(system))
self.edsmpoll()
self.status['text'] = strftime(_('Last updated at {HH}:{MM}:{SS}').format(HH='%H', MM='%M', SS='%S').encode('utf-8'), localtime(timestamp)).decode('utf-8')
except Exception as e:
if __debug__: print_exc()
self.status['text'] = unicode(e)
if not config.getint('hotkey_mute'):
hotkeymgr.play_bad()
def edsmpoll(self):
result = self.edsm.result
@ -412,6 +428,7 @@ class AppWindow:
self.w.clipboard_append(self.station['text'] == self.STATION_UNDOCKED and self.system['text'] or '%s,%s' % (self.system['text'], self.station['text']))
def onexit(self, event=None):
flightlog.close()
if platform!='darwin' or self.w.winfo_rooty()>0: # http://core.tcl.tk/tk/tktview/c84f660833546b1b84e7
config.set('geometry', '+{1}+{2}'.format(*self.w.geometry().split('+')))
config.close()

View File

@ -109,11 +109,16 @@ def export(data, edsmlookupfn):
querytime = config.getint('querytime') or int(time.time())
writelog(querytime, data['lastSystem']['name'], edsmlookupfn)
def writelog(timestamp, system, edsmlookupfn):
try:
# Look up the system before adding it to the log, since adding it to the log has the side-effect of creating it
edsmlookupfn()
r = requests.get('http://www.edsm.net/api-logs-v1/set-log?commanderName=%s&apiKey=%s&systemName=%s&dateVisited=%s' % (urllib.quote(config.get('edsm_cmdrname')), urllib.quote(config.get('edsm_apikey')), urllib.quote(data['lastSystem']['name']), urllib.quote(time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(querytime)))), timeout=EDSM._TIMEOUT)
r = requests.get('http://www.edsm.net/api-logs-v1/set-log?commanderName=%s&apiKey=%s&systemName=%s&dateVisited=%s' % (urllib.quote(config.get('edsm_cmdrname')), urllib.quote(config.get('edsm_apikey')), urllib.quote(system), urllib.quote(time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(timestamp)))), timeout=EDSM._TIMEOUT)
r.raise_for_status()
reply = r.json()
(msgnum, msg) = reply['msgnum'], reply['msg']

View File

@ -12,6 +12,8 @@ from companion import ship_map, commodity_map
logfile = None
last_timestamp = last_system = last_ship = None
last_commodities = {}
def openlog():
@ -41,24 +43,55 @@ def export(data):
querytime = config.getint('querytime') or int(time.time())
openlog()
commodities = defaultdict(int)
for item in data['ship'].get('cargo',{}).get('items',[]):
if item['commodity'] != 'drones':
commodities[commodity_map.get(item['commodity'], item['commodity'])] += item['qty']
writelog(querytime,
data['lastSystem']['name'],
data['commander']['docked'] and data['lastStarport']['name'],
ship_map.get(data['ship']['name'].lower(), data['ship']['name']),
commodities)
def writelog(timestamp, system, station=None, ship=None, commodities={}):
global last_timestamp, last_system, last_ship, last_commodities
if last_system and last_system != system:
_writelog(last_timestamp, last_system, None, last_ship, last_commodities)
if not station:
# If not docked, hold off writing log entry until docked or until system changes
last_timestamp, last_system, last_ship, last_commodities = timestamp, system, ship, commodities
else:
last_system = None
_writelog(timestamp, system, station, ship, commodities)
def _writelog(timestamp, system, station=None, ship=None, commodities={}):
openlog()
logfile.write('%s,%s,%s,%s,%s,%s\r\n' % (
time.strftime('%Y-%m-%d', time.localtime(querytime)),
time.strftime('%H:%M:%S', time.localtime(querytime)),
data['lastSystem']['name'],
data['commander']['docked'] and data['lastStarport']['name'] or '',
ship_map.get(data['ship']['name'].lower(), data['ship']['name']),
time.strftime('%Y-%m-%d', time.localtime(timestamp)),
time.strftime('%H:%M:%S', time.localtime(timestamp)),
system,
station or '',
ship or '',
','.join([('%d %s' % (commodities[k], k)) for k in sorted(commodities)])))
logfile.flush()
def close():
global last_timestamp, last_system
if last_system:
_writelog(last_timestamp, last_system, None, last_ship, last_commodities)
last_system = None
# return log as list of (timestamp, system_name)
def logs():
entries = []

View File

@ -133,17 +133,21 @@ class EDLogs:
return False
def start(self):
self.stop()
if not self.logdir or not self.callback:
self.stop()
return False
if self.running():
return True
self.observer = threading.Thread(target = self.worker, name = 'netLog worker')
self.observer.daemon = True
self.observer.start()
return True
def stop(self):
if self.observer:
self.observer.stop()
self.observer = None
self.observer = None # Orphan the worker thread
def running(self):
return self.observer and self.observer.is_alive()
def worker(self):
regexp = re.compile('{(.+)} System:[^\(]*\(([^\)]+)')
@ -158,6 +162,10 @@ class EDLogs:
loghandle = None
while True:
# Check whether we're still supposed to be running
if threading.current_thread() != self.observer:
return # Terminate
# Check whether new log file started, e.g. client restarted. Assumes logs sort alphabetically.
logfiles = sorted([x for x in listdir(self.logdir) if x.startswith('netLog.')])
newlogfile = logfiles and logfiles[-1] or None
@ -183,9 +191,9 @@ class EDLogs:
now = localtime()
if now.tm_hour == 0 and visited_struct.tm_hour == 23:
# Crossed midnight between timestamp and poll
now = localtime(time()-60)
datetime_struct = datetime(now.tm_year, now.tm_mon, now.tm_mday, visited_struct.tm_hour, visited_struct.tm_min, visited_struct.tm_sec).timetuple() # still local time
self.callback(system, mktime(datetime_struct))
now = localtime(time()-12*60%60) # yesterday
time_struct = datetime(now.tm_year, now.tm_mon, now.tm_mday, visited_struct.tm_hour, visited_struct.tm_min, visited_struct.tm_sec).timetuple() # still local time
self.callback(mktime(time_struct), system)
sleep(10) # New system gets posted to log file before hyperspace ends, so don't need to poll too often

View File

@ -199,9 +199,8 @@ class PreferencesDialog(tk.Toplevel):
# Selectively disable buttons depending on output settings
self.outvarchanged()
# disable hotkey and log monitoring for the duration
# disable hotkey for the duration
hotkeymgr.unregister()
monitor.stop()
# wait for window to appear on screen before calling grab_set
self.wait_visibility()
@ -224,7 +223,7 @@ class PreferencesDialog(tk.Toplevel):
self.out_log_auto_text['text'] = "Can't enable automatic logging!" # Shouldn't happen - don't translate
self.out_log_auto_text.grid(row=10, padx=(25,5), sticky=tk.EW)
elif monitor.restart_required():
self.out_log_auto_text['text'] = _('Re-start Elite: Dangerous for automatic logging') # Output settings prompt
self.out_log_auto_text['text'] = _('Re-start Elite: Dangerous to use this feature') # Output settings prompt
self.out_log_auto_text.grid(row=10, padx=(25,5), sticky=tk.EW)
@ -337,6 +336,8 @@ class PreferencesDialog(tk.Toplevel):
if (config.getint('output') & config.OUT_LOG_AUTO) and (config.getint('output') & (config.OUT_LOG_AUTO|config.OUT_LOG_EDSM)):
monitor.enable_logging()
monitor.start()
else:
monitor.stop()
self.destroy()
if platform == 'darwin':