1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-04-14 16:27:13 +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()
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):
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
config.set('geometry', '+{1}+{2}'.format(*self.w.geometry().split('+')))
config.close()
eddn.close()
self.updater.close()
self.session.close()
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.
* 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.
* 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

View File

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

57
eddn.py
View File

@ -4,12 +4,20 @@ from collections import OrderedDict
import hashlib
import json
import numbers
from os import SEEK_SET, SEEK_CUR, SEEK_END
from os.path import exists, join
from platform import system
import re
import requests
from sys import platform
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 companion import category_map
@ -25,6 +33,38 @@ class _EDDN:
def __init__(self):
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):
msg['header'] = {
@ -96,10 +136,19 @@ class _EDDN:
})
def export_journal_entry(self, cmdr, is_beta, entry):
self.send(cmdr, {
'$schemaRef' : 'http://schemas.elite-markets.net/eddn/journal/1' + (is_beta and '/test' or ''),
'message' : entry
})
if config.getint('output') & config.OUT_SYS_DELAY and self.replayfile and entry['event'] != 'Docked':
self.replayfile.seek(0, SEEK_END)
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
eddn = _EDDN()

View File

@ -11,6 +11,7 @@ from ttkHyperlinkLabel import HyperlinkLabel
import myNotebook as nb
from config import applongname, config
from eddn import eddn
from hotkey import hotkeymgr
from l10n import Translations
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_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_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
@ -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_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
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.eddn_station.get() and config.OUT_MKT_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))
config.set('outdir', self.outdir.get().startswith('~') and join(config.home, self.outdir.get()[2:]) or self.outdir.get())