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

Merge branch 'release-final-python27' into python3

This commit is contained in:
Athanasius 2020-06-21 16:43:02 +01:00
commit 259bb3bbd6
11 changed files with 102 additions and 13 deletions

View File

@ -300,6 +300,15 @@ class AppWindow(object):
self.postprefs(False) # Companion login happens in callback from monitor self.postprefs(False) # Companion login happens in callback from monitor
plugins_not_py3_last = config.getint('plugins_not_py3_last') or int(time())
if (plugins_not_py3_last + 86400) < int(time()) and len(plug.PLUGINS_not_py3):
import tkMessageBox
tkMessageBox.showinfo('Plugins Without Python 3.x Support',
"One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the 'Plugins' tab of 'File' > 'Settings'. You should check if there is an updated version available, else alert the developer that they will need to update the code when EDMC moves to Python 3.x"
)
config.set('plugins_not_py3_last', int(time()))
# callback after the Preferences dialog is applied # callback after the Preferences dialog is applied
def postprefs(self, dologin=True): def postprefs(self, dologin=True):
self.prefsdialog = None self.prefsdialog = None
@ -575,6 +584,10 @@ class AppWindow(object):
return # Startup or in CQC return # Startup or in CQC
if entry['event'] in ['StartUp', 'LoadGame'] and monitor.started: if entry['event'] in ['StartUp', 'LoadGame'] and monitor.started:
# Disable WinSparkle automatic update checks, IFF configured to do so when in-game
if config.getint('disable_autoappupdatecheckingame') and 1:
self.updater.setAutomaticUpdatesCheck(False)
print 'Monitor: Disable WinSparkle automatic update checks'
# Can start dashboard monitoring # Can start dashboard monitoring
if not dashboard.start(self.w, monitor.started): if not dashboard.start(self.w, monitor.started):
print("Can't start Status monitoring") print("Can't start Status monitoring")
@ -594,6 +607,12 @@ class AppWindow(object):
if entry['event'] in ['StartUp', 'Location', 'Docked'] and monitor.station and not config.getint('output') & config.OUT_MKT_MANUAL and config.getint('output') & config.OUT_STATION_ANY and companion.session.state != companion.Session.STATE_AUTH: if entry['event'] in ['StartUp', 'Location', 'Docked'] and monitor.station and not config.getint('output') & config.OUT_MKT_MANUAL and config.getint('output') & config.OUT_STATION_ANY and companion.session.state != companion.Session.STATE_AUTH:
self.w.after(int(SERVER_RETRY * 1000), self.getandsend) self.w.after(int(SERVER_RETRY * 1000), self.getandsend)
if entry['event'] == 'ShutDown':
# Enable WinSparkle automatic update checks
# NB: Do this blindly, in case option got changed whilst in-game
self.updater.setAutomaticUpdatesCheck(True)
print 'Monitor: Enable WinSparkle automatic update checks'
# cAPI auth # cAPI auth
def auth(self, event=None): def auth(self, event=None):
try: try:

View File

@ -27,7 +27,9 @@ holdoff = 60 # be nice
timeout = 10 # requests timeout timeout = 10 # requests timeout
auth_timeout = 30 # timeout for initial auth auth_timeout = 30 # timeout for initial auth
CLIENT_ID = os.getenv('CLIENT_ID') or '227cd239-ab8c-4728-9d3c-d8f588f247bd' # Obtain from https://auth.frontierstore.net/client/signup # Currently the "Elite Dangerous Market Connector (EDCD/Athanasius)" one in
# Athanasius' Frontier account
CLIENT_ID = os.getenv('CLIENT_ID') or 'fb88d428-9110-475f-a3d2-dc151c2b9c7a' # Obtain from https://auth.frontierstore.net/client/signup
SERVER_AUTH = 'https://auth.frontierstore.net' SERVER_AUTH = 'https://auth.frontierstore.net'
URL_AUTH = '/auth' URL_AUTH = '/auth'
URL_TOKEN = '/token' URL_TOKEN = '/token'

View File

@ -8,10 +8,10 @@ from sys import platform
appname = 'EDMarketConnector' appname = 'EDMarketConnector'
applongname = 'E:D Market Connector' applongname = 'E:D Market Connector'
appcmdname = 'EDMC' appcmdname = 'EDMC'
appversion = '3.5.0.0' appversion = '3.5.1.0'
update_feed = 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml' update_feed = 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml'
update_interval = 47*60*60 update_interval = 8*60*60
if platform=='darwin': if platform=='darwin':

@ -1 +1 @@
Subproject commit cee78b312a862df6b8ef9c1eff077108f24a0b9e Subproject commit bb1e5ba89acb940465714363b12c250ba399b5b9

View File

@ -431,8 +431,8 @@ class EDLogs(FileSystemEventHandler):
self.station = None self.station = None
self.stationtype = None self.stationtype = None
self.stationservices = None self.stationservices = None
elif entry['event'] in ['Location', 'FSDJump', 'Docked']: elif entry['event'] in ['Location', 'FSDJump', 'Docked', 'CarrierJump']:
if entry['event'] == 'Location': if entry['event'] in ('Location', 'CarrierJump'):
self.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None self.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None
elif entry['event'] == 'FSDJump': elif entry['event'] == 'FSDJump':
self.planet = None self.planet = None

11
plug.py
View File

@ -67,6 +67,7 @@ GuiFocusCodex = 11
# List of loaded Plugins # List of loaded Plugins
PLUGINS = [] PLUGINS = []
PLUGINS_not_py3 = []
# For asynchronous error display # For asynchronous error display
last_error = { last_error = {
@ -196,6 +197,16 @@ def load_plugins(master):
pass pass
PLUGINS.extend(sorted(found, key = lambda p: operator.attrgetter('name')(p).lower())) PLUGINS.extend(sorted(found, key = lambda p: operator.attrgetter('name')(p).lower()))
#########################################################
# Detect plugins that aren't yet ready for Python 3.x
#########################################################
for p in PLUGINS:
if p.module and p.folder and not p._get_func('plugin_start3'):
PLUGINS_not_py3.append(p)
#########################################################
imp.release_lock()
def provides(fn_name): def provides(fn_name):
""" """
Find plugins that provide a function Find plugins that provide a function

View File

@ -396,8 +396,8 @@ def journal_entry(cmdr, is_beta, system, station, entry, state):
return filtered return filtered
# Track location # Track location
if entry['event'] in ['Location', 'FSDJump', 'Docked']: if entry['event'] in ['Location', 'FSDJump', 'Docked', 'CarrierJump']:
if entry['event'] == 'Location': if entry['event'] in ('Location', 'CarrierJump'):
this.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None this.planet = entry.get('Body') if entry.get('BodyType') == 'Planet' else None
elif entry['event'] == 'FSDJump': elif entry['event'] == 'FSDJump':
this.planet = None this.planet = None
@ -413,7 +413,7 @@ def journal_entry(cmdr, is_beta, system, station, entry, state):
# Send interesting events to EDDN, but not when on a crew # Send interesting events to EDDN, but not when on a crew
if (config.getint('output') & config.OUT_SYS_EDDN and not state['Captain'] and if (config.getint('output') & config.OUT_SYS_EDDN and not state['Captain'] and
(entry['event'] in ('Location', 'FSDJump', 'Docked', 'Scan', 'SAASignalsFound')) and (entry['event'] in ('Location', 'FSDJump', 'Docked', 'Scan', 'SAASignalsFound', 'CarrierJump')) and
('StarPos' in entry or this.coordinates)): ('StarPos' in entry or this.coordinates)):
# strip out properties disallowed by the schema # strip out properties disallowed by the schema
for thing in ['ActiveFine', 'CockpitBreach', 'BoostUsed', 'FuelLevel', 'FuelUsed', 'JumpDist', 'Latitude', 'Longitude', 'Wanted']: for thing in ['ActiveFine', 'CockpitBreach', 'BoostUsed', 'FuelLevel', 'FuelUsed', 'JumpDist', 'Latitude', 'Longitude', 'Wanted']:

View File

@ -300,7 +300,7 @@ def worker():
plug.show_error(_('Error: EDSM {MSG}').format(MSG=msg)) plug.show_error(_('Error: EDSM {MSG}').format(MSG=msg))
else: else:
for e, r in zip(pending, reply['events']): for e, r in zip(pending, reply['events']):
if not closing and e['event'] in ['StartUp', 'Location', 'FSDJump']: if not closing and e['event'] in ['StartUp', 'Location', 'FSDJump', 'CarrierJump']:
# Update main window's system status # Update main window's system status
this.lastlookup = r this.lastlookup = r
this.system.event_generate('<<EDSMStatus>>', when="tail") # calls update_status in main thread this.system.event_generate('<<EDSMStatus>>', when="tail") # calls update_status in main thread
@ -347,13 +347,13 @@ def should_send(entries):
return False return False
# Call edsm_notify_system() in this and other interested plugins with EDSM's response to a 'StartUp', 'Location' or 'FSDJump' event # Call edsm_notify_system() in this and other interested plugins with EDSM's response to a 'StartUp', 'Location', 'FSDJump' or 'CarrierJump' event
def update_status(event=None): def update_status(event=None):
for plugin in plug.provides('edsm_notify_system'): for plugin in plug.provides('edsm_notify_system'):
plug.invoke(plugin, None, 'edsm_notify_system', this.lastlookup) plug.invoke(plugin, None, 'edsm_notify_system', this.lastlookup)
# Called with EDSM's response to a 'StartUp', 'Location' or 'FSDJump' event. https://www.edsm.net/en/api-journal-v1 # Called with EDSM's response to a 'StartUp', 'Location', 'FSDJump' or 'CarrierJump' event. https://www.edsm.net/en/api-journal-v1
# msgnum: 1xx = OK, 2xx = fatal error, 3xx = error, 4xx = ignorable errors. # msgnum: 1xx = OK, 2xx = fatal error, 3xx = error, 4xx = ignorable errors.
def edsm_notify_system(reply): def edsm_notify_system(reply):
if not reply: if not reply:

View File

@ -377,6 +377,26 @@ def journal_entry(cmdr, is_beta, system, station, entry, state):
('minorfactionReputation', f['MyReputation']/100.0), ('minorfactionReputation', f['MyReputation']/100.0),
]) for f in entry['Factions'] ]) for f in entry['Factions']
]) ])
elif entry['event'] == 'CarrierJump':
this.system = None
add_event('addCommanderTravelCarrierJump', entry['timestamp'],
OrderedDict([
('starsystemName', entry['StarSystem']),
('stationName', entry['StationName']),
('marketID', entry['MarketID']),
('shipType', state['ShipType']),
('shipGameID', state['ShipID']),
]))
if entry.get('Factions'):
add_event('setCommanderReputationMinorFaction', entry['timestamp'],
[
OrderedDict([
('minorfactionName', f['Name']),
('minorfactionReputation', f['MyReputation']/100.0),
]) for f in entry['Factions']
])
# Ignore the following 'Docked' event
this.suppress_docked = True
# Override standard URL functions # Override standard URL functions
if config.get('system_provider') == 'Inara': if config.get('system_provider') == 'Inara':
@ -826,7 +846,7 @@ def worker():
print('Inara\t%s %s\t%s' % (reply_event['eventStatus'], reply_event.get('eventStatusText', ''), json.dumps(data_event))) print('Inara\t%s %s\t%s' % (reply_event['eventStatus'], reply_event.get('eventStatusText', ''), json.dumps(data_event)))
if reply_event['eventStatus'] // 100 != 2: 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'])))) 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']: if data_event['eventName'] in ['addCommanderTravelCarrierJump', 'addCommanderTravelDock', 'addCommanderTravelFSDJump', 'setCommanderTravelLocation']:
this.lastlocation = reply_event.get('eventData', {}) this.lastlocation = reply_event.get('eventData', {})
this.system_link.event_generate('<<InaraLocation>>', when="tail") # calls update_location in main thread this.system_link.event_generate('<<InaraLocation>>', when="tail") # calls update_location in main thread
elif data_event['eventName'] in ['addCommanderShip', 'setCommanderShip']: elif data_event['eventName'] in ['addCommanderShip', 'setCommanderShip']:

View File

@ -183,6 +183,13 @@ class PreferencesDialog(tk.Toplevel):
self.hotkey_play_btn = nb.Checkbutton(configframe, text=_('Play sound'), variable=self.hotkey_play, state = self.hotkey_code and tk.NORMAL or tk.DISABLED) # Hotkey/Shortcut setting self.hotkey_play_btn = nb.Checkbutton(configframe, text=_('Play sound'), variable=self.hotkey_play, state = self.hotkey_code and tk.NORMAL or tk.DISABLED) # Hotkey/Shortcut setting
self.hotkey_play_btn.grid(columnspan=4, padx=PADX, sticky=tk.W) self.hotkey_play_btn.grid(columnspan=4, padx=PADX, sticky=tk.W)
# Option to disabled Automatic Check For Updates whilst in-game
ttk.Separator(configframe, orient=tk.HORIZONTAL).grid(columnspan=4, padx=PADX, pady=PADY*4, sticky=tk.EW)
self.disable_autoappupdatecheckingame = tk.IntVar(value = config.getint('disable_autoappupdatecheckingame'))
self.disable_autoappupdatecheckingame_btn = nb.Checkbutton(configframe, text=_('Disable Automatic Application Updates Check when in-game'), variable=self.disable_autoappupdatecheckingame, command=self.disable_autoappupdatecheckingame_changed)
self.disable_autoappupdatecheckingame_btn.grid(columnspan=4, padx=PADX, sticky=tk.W)
ttk.Separator(configframe, orient=tk.HORIZONTAL).grid(columnspan=4, padx=PADX, pady=PADY*4, sticky=tk.EW) ttk.Separator(configframe, orient=tk.HORIZONTAL).grid(columnspan=4, padx=PADX, pady=PADY*4, sticky=tk.EW)
nb.Label(configframe, text=_('Preferred websites')).grid(row=30, columnspan=4, padx=PADX, sticky=tk.W) # Settings prompt for preferred ship loadout, system and station info websites nb.Label(configframe, text=_('Preferred websites')).grid(row=30, columnspan=4, padx=PADX, sticky=tk.W) # Settings prompt for preferred ship loadout, system and station info websites
@ -272,6 +279,20 @@ class PreferencesDialog(tk.Toplevel):
label = nb.Label(plugsframe, text='%s (%s)' % (plugin.folder, plugin.name)) label = nb.Label(plugsframe, text='%s (%s)' % (plugin.folder, plugin.name))
label.grid(columnspan=2, padx=PADX*2, sticky=tk.W) label.grid(columnspan=2, padx=PADX*2, sticky=tk.W)
############################################################
# Show which plugins don't have Python 3.x support
############################################################
if len(plug.PLUGINS_not_py3):
ttk.Separator(plugsframe, orient=tk.HORIZONTAL).grid(columnspan=3, padx=PADX, pady=PADY * 8, sticky=tk.EW)
nb.Label(plugsframe, text=_('Plugins Without Python 3.x Support:')+':').grid(padx=PADX, sticky=tk.W)
for plugin in plug.PLUGINS_not_py3:
if plugin.folder: # 'system' ones have this set to None to suppress listing in Plugins prefs tab
nb.Label(plugsframe, text=plugin.name).grid(columnspan=2, padx=PADX*2, sticky=tk.W)
HyperlinkLabel(plugsframe, text=_('Information on migrating plugins'), background=nb.Label().cget('background'), url='https://github.com/EDCD/EDMarketConnector/blob/master/PLUGINS.md#migration-to-python-37', underline=True).grid(columnspan=2, padx=PADX, sticky=tk.W)
############################################################
disabled_plugins = [x for x in plug.PLUGINS if x.folder and not x.module] disabled_plugins = [x for x in plug.PLUGINS if x.folder and not x.module]
if len(disabled_plugins): if len(disabled_plugins):
ttk.Separator(plugsframe, orient=tk.HORIZONTAL).grid(columnspan=3, padx=PADX, pady=PADY * 8, sticky=tk.EW) ttk.Separator(plugsframe, orient=tk.HORIZONTAL).grid(columnspan=3, padx=PADX, pady=PADY * 8, sticky=tk.EW)
@ -418,6 +439,11 @@ class PreferencesDialog(tk.Toplevel):
self.logdir.set(config.default_journal_dir) self.logdir.set(config.default_journal_dir)
self.outvarchanged() self.outvarchanged()
def disable_autoappupdatecheckingame_changed(self):
config.set('disable_autoappupdatecheckingame', self.disable_autoappupdatecheckingame.get())
# If it's now False, re-enable WinSparkle ? Need access to the AppWindow.updater variable to call down
def themecolorbrowse(self, index): def themecolorbrowse(self, index):
(rgb, color) = tkColorChooser.askcolor(self.theme_colors[index], title=self.theme_prompts[index], parent=self.parent) (rgb, color) = tkColorChooser.askcolor(self.theme_colors[index], title=self.theme_prompts[index], parent=self.parent)
if color: if color:

View File

@ -20,6 +20,9 @@ if not getattr(sys, 'frozen', False):
def __init__(self, master): def __init__(self, master):
self.root = master self.root = master
def setAutomaticUpdatesCheck(self, onoroff):
return
def checkForUpdates(self): def checkForUpdates(self):
thread = threading.Thread(target = self.worker, name = 'update worker') thread = threading.Thread(target = self.worker, name = 'update worker')
thread.daemon = True thread.daemon = True
@ -58,6 +61,10 @@ elif sys.platform=='darwin':
print_exc() print_exc()
self.updater = None self.updater = None
def setAutomaticUpdatesCheck(self, onoroff):
if self.updater:
self.updater.win_sparkle_set_automatic_check_for_updates(onoroff)
def checkForUpdates(self): def checkForUpdates(self):
if self.updater: if self.updater:
self.updater.checkForUpdates_(None) self.updater.checkForUpdates_(None)
@ -98,6 +105,10 @@ elif sys.platform=='win32':
print_exc() print_exc()
self.updater = None self.updater = None
def setAutomaticUpdatesCheck(self, onoroff):
if self.updater:
self.updater.win_sparkle_set_automatic_check_for_updates(onoroff)
def checkForUpdates(self): def checkForUpdates(self):
if self.updater: if self.updater:
self.updater.win_sparkle_check_update_with_ui() self.updater.win_sparkle_check_update_with_ui()