1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-04-18 09:57:40 +03:00

Option to delay sending body data until docked

This commit is contained in:
Jonathan Harris 2016-09-06 01:54:13 +01:00
parent 38d348544a
commit db543c2901
5 changed files with 68 additions and 4 deletions

View File

@ -309,6 +309,12 @@ class AppWindow:
if __debug__: print_exc() if __debug__: print_exc()
self.status['text'] = unicode(e) self.status['text'] = unicode(e)
# Try to obtain exclusive lock on journal cache, even if we don't need it yet
try:
eddn.load()
except Exception as e:
self.status['text'] = unicode(e)
if not getattr(sys, 'frozen', False): if not getattr(sys, 'frozen', False):
self.updater.checkForUpdates() # Sparkle / WinSparkle does this automatically for packaged apps self.updater.checkForUpdates() # Sparkle / WinSparkle does this automatically for packaged apps
@ -620,6 +626,7 @@ class AppWindow:
if platform!='darwin' or self.w.winfo_rooty()>0: # http://core.tcl.tk/tk/tktview/c84f660833546b1b84e7 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.set('geometry', '+{1}+{2}'.format(*self.w.geometry().split('+')))
config.close() config.close()
eddn.close()
self.updater.close() self.updater.close()
self.session.close() self.session.close()
self.w.destroy() self.w.destroy()

View File

@ -77,6 +77,7 @@ Some options work by reading the Elite: Dangerous game's “journal” files. If
* Sends station commodity market, outfitting and shipyard data to “[EDDN](http://eddn-gateway.elite-markets.net/)” from where you and others can use it via online trading tools such as [eddb](http://eddb.io/), [Elite Trade Net](http://etn.io/), [Inara](http://inara.cz), [ED-TD](http://ed-td.space/), [Thrudd's Trading Tools](http://www.elitetradingtool.co.uk/), [Roguey's](http://roguey.co.uk/elite-dangerous/), etc. * Sends station commodity market, outfitting and shipyard data to “[EDDN](http://eddn-gateway.elite-markets.net/)” from where you and others can use it via online trading tools such as [eddb](http://eddb.io/), [Elite Trade Net](http://etn.io/), [Inara](http://inara.cz), [ED-TD](http://ed-td.space/), [Thrudd's Trading Tools](http://www.elitetradingtool.co.uk/), [Roguey's](http://roguey.co.uk/elite-dangerous/), etc.
* System and scan data * System and scan data
* Sends general system information and the results of your detailed planet scans to “[EDDN](http://eddn-gateway.elite-markets.net/)” from where you and others can use it via online prospecting tools such as [eddb](http://eddb.io/), [Inara](http://inara.cz), etc. * Sends general system information and the results of your detailed planet scans to “[EDDN](http://eddn-gateway.elite-markets.net/)” from where you and others can use it via online prospecting tools such as [eddb](http://eddb.io/), [Inara](http://inara.cz), etc.
* You can choose to delay sending this information to EDDN until you're next safely docked at a station. Otherwise the information is sent as soon as you enter a system or perform a scan.
### EDSM ### EDSM

View File

@ -95,6 +95,7 @@ class Config:
# OUT_SYS_AUTO = 512 # Now always automatic # OUT_SYS_AUTO = 512 # Now always automatic
OUT_MKT_MANUAL = 1024 OUT_MKT_MANUAL = 1024
OUT_SYS_EDDN = 2048 OUT_SYS_EDDN = 2048
OUT_SYS_DELAY = 4096
if platform=='darwin': if platform=='darwin':

57
eddn.py
View File

@ -4,12 +4,20 @@ from collections import OrderedDict
import hashlib import hashlib
import json import json
import numbers import numbers
from os import SEEK_SET, SEEK_CUR, SEEK_END
from os.path import exists, join
from platform import system from platform import system
import re import re
import requests import requests
from sys import platform from sys import platform
import time import time
if platform != 'win32':
from fcntl import lockf, LOCK_EX, LOCK_NB
if __debug__:
from traceback import print_exc
from config import applongname, appversion, config from config import applongname, appversion, config
from companion import category_map from companion import category_map
@ -25,6 +33,38 @@ class _EDDN:
def __init__(self): def __init__(self):
self.session = requests.Session() self.session = requests.Session()
self.replayfile = None # For delayed messages
def load(self):
# Try to obtain exclusive access to the journal cache
filename = join(config.app_dir, 'replay.jsonl')
try:
try:
# Try to open existing file
self.replayfile = open(filename, 'r+')
except:
if exists(filename):
raise # Couldn't open existing file
else:
self.replayfile = open(filename, 'w+') # Create file
if platform != 'win32': # open for writing is automatically exclusive on Windows
lockf(self.replayfile, LOCK_EX|LOCK_NB)
except:
if __debug__: print_exc()
if self.replayfile:
self.replayfile.close()
self.replayfile = None
raise Exception("Error: Is another copy of this app already running?") # Shouldn't happen - don't bother localizing
def flush(self):
self.replayfile.seek(0, SEEK_SET)
for line in self.replayfile:
self.send(*json.loads(line, object_pairs_hook=OrderedDict))
self.replayfile.truncate(0)
def close(self):
if self.replayfile:
self.replayfile.close()
def send(self, cmdr, msg): def send(self, cmdr, msg):
msg['header'] = { msg['header'] = {
@ -96,10 +136,19 @@ class _EDDN:
}) })
def export_journal_entry(self, cmdr, is_beta, entry): def export_journal_entry(self, cmdr, is_beta, entry):
self.send(cmdr, { if config.getint('output') & config.OUT_SYS_DELAY and self.replayfile and entry['event'] != 'Docked':
'$schemaRef' : 'http://schemas.elite-markets.net/eddn/journal/1' + (is_beta and '/test' or ''), self.replayfile.seek(0, SEEK_END)
'message' : entry self.replayfile.write('%s\n' % json.dumps([cmdr.encode('utf-8'), {
}) '$schemaRef' : 'http://schemas.elite-markets.net/eddn/journal/1' + (is_beta and '/test' or ''),
'message' : entry
}]))
self.replayfile.flush()
else:
self.flush()
self.send(cmdr, {
'$schemaRef' : 'http://schemas.elite-markets.net/eddn/journal/1' + (is_beta and '/test' or ''),
'message' : entry
})
# singleton # singleton
eddn = _EDDN() eddn = _EDDN()

View File

@ -11,6 +11,7 @@ from ttkHyperlinkLabel import HyperlinkLabel
import myNotebook as nb import myNotebook as nb
from config import applongname, config from config import applongname, config
from eddn import eddn
from hotkey import hotkeymgr from hotkey import hotkeymgr
from l10n import Translations from l10n import Translations
from monitor import monitor from monitor import monitor
@ -157,6 +158,9 @@ class PreferencesDialog(tk.Toplevel):
self.eddn_system = tk.IntVar(value = (output & config.OUT_SYS_EDDN) and 1) self.eddn_system = tk.IntVar(value = (output & config.OUT_SYS_EDDN) and 1)
self.eddn_system_button = nb.Checkbutton(eddnframe, text=_('Send system and scan data to the Elite Dangerous Data Network'), variable=self.eddn_system, command=self.outvarchanged) # Output setting new in E:D 2.2 self.eddn_system_button = nb.Checkbutton(eddnframe, text=_('Send system and scan data to the Elite Dangerous Data Network'), variable=self.eddn_system, command=self.outvarchanged) # Output setting new in E:D 2.2
self.eddn_system_button.grid(padx=BUTTONX, pady=(5,0), sticky=tk.W) self.eddn_system_button.grid(padx=BUTTONX, pady=(5,0), sticky=tk.W)
self.eddn_delay= tk.IntVar(value = (output & config.OUT_SYS_DELAY) and 1)
self.eddn_delay_button = nb.Checkbutton(eddnframe, text=_('Delay sending until docked'), variable=self.eddn_delay, command=self.outvarchanged) # Output setting under 'Send system and scan data to the Elite Dangerous Data Network' new in E:D 2.2
self.eddn_delay_button.grid(padx=BUTTONX, sticky=tk.W)
notebook.add(eddnframe, text='EDDN') # Not translated notebook.add(eddnframe, text='EDDN') # Not translated
@ -318,6 +322,7 @@ class PreferencesDialog(tk.Toplevel):
self.eddn_auto_button['state'] = self.eddn_station.get() and logvalid and tk.NORMAL or tk.DISABLED self.eddn_auto_button['state'] = self.eddn_station.get() and logvalid and tk.NORMAL or tk.DISABLED
self.eddn_system_button['state']= logvalid and tk.NORMAL or tk.DISABLED self.eddn_system_button['state']= logvalid and tk.NORMAL or tk.DISABLED
self.eddn_delay_button['state'] = logvalid and eddn.replayfile and self.eddn_system.get() and tk.NORMAL or tk.DISABLED
self.edsm_log_button['state'] = logvalid and tk.NORMAL or tk.DISABLED self.edsm_log_button['state'] = logvalid and tk.NORMAL or tk.DISABLED
edsm_state = logvalid and self.edsm_log.get() and tk.NORMAL or tk.DISABLED edsm_state = logvalid and self.edsm_log.get() and tk.NORMAL or tk.DISABLED
@ -449,6 +454,7 @@ class PreferencesDialog(tk.Toplevel):
(self.out_ship_coriolis.get() and config.OUT_SHIP_CORIOLIS) + (self.out_ship_coriolis.get() and config.OUT_SHIP_CORIOLIS) +
(self.eddn_station.get() and config.OUT_MKT_EDDN) + (self.eddn_station.get() and config.OUT_MKT_EDDN) +
(self.eddn_system.get() and config.OUT_SYS_EDDN) + (self.eddn_system.get() and config.OUT_SYS_EDDN) +
(self.eddn_delay.get() and config.OUT_SYS_DELAY) +
(self.edsm_log.get() and config.OUT_SYS_EDSM)) (self.edsm_log.get() and config.OUT_SYS_EDSM))
config.set('outdir', self.outdir.get().startswith('~') and join(config.home, self.outdir.get()[2:]) or self.outdir.get()) config.set('outdir', self.outdir.get().startswith('~') and join(config.home, self.outdir.get()[2:]) or self.outdir.get())