diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 8d2f9ae4..ec552501 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -498,6 +498,20 @@ class AppWindow: self.station['text'] = monitor.station or (EDDB.system(monitor.system) and self.STATION_UNDOCKED or '') if system_changed or station_changed: self.status['text'] = '' + + if config.getint('output') & config.OUT_SYS_EDSM and not monitor.is_beta and monitor.ranks and (not entry or entry['event'] in ['Progress', 'Promotion']): + # Send rank info to EDSM on startup or change + try: + self.status['text'] = _('Sending data to EDSM...') + self.w.update_idletasks() + self.edsm.setranks(monitor.ranks) + self.status['text'] = '' + except Exception as e: + if __debug__: print_exc() + self.status['text'] = unicode(e) + if not config.getint('hotkey_mute'): + hotkeymgr.play_bad() + if not entry or not monitor.mode: return # Fake event or in CQC diff --git a/edsm.py b/edsm.py index 0ba3f0ee..ede7087a 100644 --- a/edsm.py +++ b/edsm.py @@ -143,3 +143,27 @@ class EDSM: else: self.result['img'] = EDSM._IMG_KNOWN self.syscache.add(system_name) + + def setranks(self, ranks): + if not ranks: + return + + try: + url = 'https://www.edsm.net/api-commander-v1/set-ranks?commanderName=%s&apiKey=%s&fromSoftware=%s&fromSoftwareVersion=%s' % ( + urllib2.quote(config.get('edsm_cmdrname').encode('utf-8')), + urllib2.quote(config.get('edsm_apikey')), + urllib2.quote(applongname), + urllib2.quote(appversion) + ) + for k,v in ranks.iteritems(): + if v is not None: + url += '&%s=%s' % (k, urllib2.quote('%d;%d' % v)) + r = self.opener.open(url, timeout=EDSM._TIMEOUT) + reply = json.loads(r.read()) + (msgnum, msg) = reply['msgnum'], reply['msg'] + except: + if __debug__: print_exc() + raise Exception(_("Error: Can't connect to EDSM")) + + if msgnum // 100 not in (1,4): + raise Exception(_('Error: EDSM {MSG}').format(MSG=msg)) diff --git a/monitor.py b/monitor.py index 547368e4..affade34 100644 --- a/monitor.py +++ b/monitor.py @@ -80,6 +80,7 @@ class EDLogs(FileSystemEventHandler): self.system = None self.station = None self.coordinates = None + self.ranks = None def set_callback(self, name, callback): if name in self.callbacks: @@ -214,9 +215,11 @@ class EDLogs(FileSystemEventHandler): if entry['event'] == 'Fileheader': self.version = entry['gameversion'] self.is_beta = 'beta' in entry['gameversion'].lower() + self.ranks = None elif entry['event'] == 'LoadGame': self.cmdr = entry['Commander'] self.mode = entry.get('GameMode') # 'Open', 'Solo', 'Group', or None for CQC + self.ranks = { "Combat": None, "Trade": None, "Explore": None, "Empire": None, "Federation": None, "CQC": None } elif entry['event'] == 'NewCommander': self.cmdr = entry['Name'] elif entry['event'] in ['Undocked']: @@ -228,6 +231,14 @@ class EDLogs(FileSystemEventHandler): self.coordinates = None # Docked event doesn't include coordinates self.system = entry['StarSystem'] == 'ProvingGround' and 'CQC' or entry['StarSystem'] self.station = entry.get('StationName') # May be None + elif entry['event'] in ['Rank', 'Promotion'] and self.ranks: + for k,v in entry.iteritems(): + if k in self.ranks: + self.ranks[k] = (v,0) + elif entry['event'] == 'Progress' and self.ranks: + for k,v in entry.iteritems(): + if self.ranks.get(k) is not None: + self.ranks[k] = (self.ranks[k][0], min(v, 100)) # perhaps not taken promotion mission yet return entry except: if __debug__: