tradedangerous 11.5.3__py3-none-any.whl → 12.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of tradedangerous might be problematic. Click here for more details.
- tradedangerous/cache.py +567 -395
- tradedangerous/cli.py +2 -2
- tradedangerous/commands/TEMPLATE.py +25 -26
- tradedangerous/commands/__init__.py +8 -16
- tradedangerous/commands/buildcache_cmd.py +40 -10
- tradedangerous/commands/buy_cmd.py +57 -46
- tradedangerous/commands/commandenv.py +0 -2
- tradedangerous/commands/export_cmd.py +78 -50
- tradedangerous/commands/import_cmd.py +67 -31
- tradedangerous/commands/market_cmd.py +52 -19
- tradedangerous/commands/olddata_cmd.py +120 -107
- tradedangerous/commands/rares_cmd.py +122 -110
- tradedangerous/commands/run_cmd.py +118 -66
- tradedangerous/commands/sell_cmd.py +52 -45
- tradedangerous/commands/shipvendor_cmd.py +49 -234
- tradedangerous/commands/station_cmd.py +55 -485
- tradedangerous/commands/update_cmd.py +56 -420
- tradedangerous/csvexport.py +173 -162
- tradedangerous/db/__init__.py +27 -0
- tradedangerous/db/adapter.py +191 -0
- tradedangerous/db/config.py +95 -0
- tradedangerous/db/engine.py +246 -0
- tradedangerous/db/lifecycle.py +332 -0
- tradedangerous/db/locks.py +208 -0
- tradedangerous/db/orm_models.py +455 -0
- tradedangerous/db/paths.py +112 -0
- tradedangerous/db/utils.py +661 -0
- tradedangerous/gui.py +2 -2
- tradedangerous/plugins/eddblink_plug.py +387 -251
- tradedangerous/plugins/spansh_plug.py +2488 -821
- tradedangerous/prices.py +124 -142
- tradedangerous/templates/TradeDangerous.sql +6 -6
- tradedangerous/tradecalc.py +1227 -1109
- tradedangerous/tradedb.py +533 -384
- tradedangerous/tradeenv.py +12 -1
- tradedangerous/version.py +1 -1
- {tradedangerous-11.5.3.dist-info → tradedangerous-12.0.1.dist-info}/METADATA +11 -7
- {tradedangerous-11.5.3.dist-info → tradedangerous-12.0.1.dist-info}/RECORD +42 -38
- {tradedangerous-11.5.3.dist-info → tradedangerous-12.0.1.dist-info}/WHEEL +1 -1
- tradedangerous/commands/update_gui.py +0 -721
- tradedangerous/jsonprices.py +0 -254
- tradedangerous/plugins/edapi_plug.py +0 -1071
- tradedangerous/plugins/journal_plug.py +0 -537
- tradedangerous/plugins/netlog_plug.py +0 -316
- {tradedangerous-11.5.3.dist-info → tradedangerous-12.0.1.dist-info}/entry_points.txt +0 -0
- {tradedangerous-11.5.3.dist-info → tradedangerous-12.0.1.dist-info/licenses}/LICENSE +0 -0
- {tradedangerous-11.5.3.dist-info → tradedangerous-12.0.1.dist-info}/top_level.txt +0 -0
|
@@ -1,537 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import json
|
|
3
|
-
import pathlib
|
|
4
|
-
from datetime import datetime, timezone
|
|
5
|
-
|
|
6
|
-
from .. import csvexport
|
|
7
|
-
from . import PluginException, ImportPluginBase
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def snapToGrid32(val):
|
|
11
|
-
try:
|
|
12
|
-
val = float(val)
|
|
13
|
-
corr = -0.5 if val < 0 else 0.5
|
|
14
|
-
pos = int(val*32+corr)/32
|
|
15
|
-
except:
|
|
16
|
-
pos = None
|
|
17
|
-
pass
|
|
18
|
-
return pos
|
|
19
|
-
|
|
20
|
-
def getYNfromService(obj, key):
|
|
21
|
-
return "Y" if key in obj else "N"
|
|
22
|
-
|
|
23
|
-
class JournalStation:
|
|
24
|
-
__slots__ = (
|
|
25
|
-
'lsFromStar', 'blackMarket', 'maxPadSize',
|
|
26
|
-
'market', 'shipyard', 'outfitting',
|
|
27
|
-
'rearm', 'refuel', 'repair',
|
|
28
|
-
'planetary', 'modified'
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
def __init__(
|
|
32
|
-
self, lsFromStar=0, blackMarket='?', maxPadSize='?',
|
|
33
|
-
market='?', shipyard='?', outfitting='?',
|
|
34
|
-
rearm='?', refuel='?', repair='?',
|
|
35
|
-
planetary='?', modified='now'
|
|
36
|
-
):
|
|
37
|
-
self.lsFromStar = lsFromStar
|
|
38
|
-
self.blackMarket = blackMarket
|
|
39
|
-
self.maxPadSize = maxPadSize
|
|
40
|
-
self.market = market
|
|
41
|
-
self.shipyard = shipyard
|
|
42
|
-
self.outfitting = outfitting
|
|
43
|
-
self.rearm = rearm
|
|
44
|
-
self.refuel = refuel
|
|
45
|
-
self.repair = repair
|
|
46
|
-
self.planetary = planetary
|
|
47
|
-
self.modified = modified
|
|
48
|
-
|
|
49
|
-
def __str__(self):
|
|
50
|
-
return "{}ls Pad:{} Mkt:{} Blk:{} Shp:{} Out:{} Arm:{} Ref:{} Rep:{} Plt:{}".format(
|
|
51
|
-
self.lsFromStar, self.maxPadSize, self.market,
|
|
52
|
-
self.blackMarket, self.shipyard, self.outfitting,
|
|
53
|
-
self.rearm, self.refuel, self.repair, self.planetary
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
class ImportPlugin(ImportPluginBase):
|
|
57
|
-
"""
|
|
58
|
-
Plugin that parses the Journal file and add or update systems and stations.
|
|
59
|
-
"""
|
|
60
|
-
|
|
61
|
-
logGlob = "Journal.*.log"
|
|
62
|
-
ADDED_NAME = 'Journal'
|
|
63
|
-
LOGDIR_NAME = "FDEVJRNDIR"
|
|
64
|
-
DATE_FORMATS = {
|
|
65
|
-
2: ("%y", "YY", "%y"),
|
|
66
|
-
4: ("%Y", "YYYY", "%y"),
|
|
67
|
-
5: ("%y-%m", "YY-MM", "%y%m"),
|
|
68
|
-
7: ("%Y-%m", "YYYY-MM", "%y%m"),
|
|
69
|
-
8: ("%y-%m-%d", "YY-MM-DD", "%y%m%d"),
|
|
70
|
-
10: ("%Y-%m-%d", "YYYY-MM-DD", "%y%m%d"),
|
|
71
|
-
}
|
|
72
|
-
ignoreSysNames = [
|
|
73
|
-
'TRAINING',
|
|
74
|
-
'DESTINATION',
|
|
75
|
-
]
|
|
76
|
-
pluginOptions = {
|
|
77
|
-
'show': "Only show the system or station. Don't update the DB.",
|
|
78
|
-
'last': "Only parse the last (newest) Journal file.",
|
|
79
|
-
'date': "Only parse Journal files from date, format=[YY]YY[-MM[-DD]].",
|
|
80
|
-
}
|
|
81
|
-
filePathList = []
|
|
82
|
-
sysList = {}
|
|
83
|
-
stnList = {}
|
|
84
|
-
blkList = []
|
|
85
|
-
|
|
86
|
-
planetTypeList = (
|
|
87
|
-
"SURFACESTATION",
|
|
88
|
-
"CRATERPORT",
|
|
89
|
-
"CRATEROUTPOST",
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
def __init__(self, tdb, tdenv):
|
|
93
|
-
super().__init__(tdb, tdenv)
|
|
94
|
-
|
|
95
|
-
logDirName = os.getenv(self.LOGDIR_NAME, None)
|
|
96
|
-
if not logDirName:
|
|
97
|
-
raise PluginException(
|
|
98
|
-
"Environment variable '{}' not set "
|
|
99
|
-
"(see 'README.md' for help)."
|
|
100
|
-
.format(self.LOGDIR_NAME)
|
|
101
|
-
)
|
|
102
|
-
tdenv.NOTE("{}={}", self.LOGDIR_NAME, logDirName)
|
|
103
|
-
|
|
104
|
-
self.logPath = pathlib.Path(logDirName)
|
|
105
|
-
if not self.logPath.is_dir():
|
|
106
|
-
raise PluginException(
|
|
107
|
-
"{}: is not a directory.".format(
|
|
108
|
-
str(self.logPath)
|
|
109
|
-
)
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
def getJournalDirList(self):
|
|
113
|
-
"""
|
|
114
|
-
get all Journal files
|
|
115
|
-
"""
|
|
116
|
-
tdenv = self.tdenv
|
|
117
|
-
optDate = self.getOption("date")
|
|
118
|
-
logLast = self.getOption("last")
|
|
119
|
-
|
|
120
|
-
logDate = None
|
|
121
|
-
if isinstance(optDate, str):
|
|
122
|
-
fmtLen = len(optDate)
|
|
123
|
-
fmtDate = self.DATE_FORMATS.get(fmtLen, None)
|
|
124
|
-
if fmtDate:
|
|
125
|
-
tdenv.DEBUG0("date format: {}", fmtDate[0])
|
|
126
|
-
try:
|
|
127
|
-
logDate = datetime.strptime(optDate, fmtDate[0])
|
|
128
|
-
except ValueError:
|
|
129
|
-
logDate = None
|
|
130
|
-
pass
|
|
131
|
-
if logDate:
|
|
132
|
-
globDat = logDate.strftime(fmtDate[2])
|
|
133
|
-
self.logGlob = "Journal." + globDat + "*.log"
|
|
134
|
-
tdenv.NOTE("using date: {}", logDate.strftime(fmtDate[0]))
|
|
135
|
-
else:
|
|
136
|
-
raise PluginException(
|
|
137
|
-
"Wrong date '{}' format. Must be in the form of '{}'"
|
|
138
|
-
.format(
|
|
139
|
-
optDate,
|
|
140
|
-
"','".join([d[1] for d in self.DATE_FORMATS.values()])
|
|
141
|
-
)
|
|
142
|
-
)
|
|
143
|
-
tdenv.NOTE("using pattern: {}", self.logGlob)
|
|
144
|
-
|
|
145
|
-
for filePath in sorted(self.logPath.glob(self.logGlob)):
|
|
146
|
-
tdenv.DEBUG0("logfile: {}", str(filePath))
|
|
147
|
-
self.filePathList.append(filePath)
|
|
148
|
-
|
|
149
|
-
listLen = len(self.filePathList)
|
|
150
|
-
if listLen == 0:
|
|
151
|
-
raise PluginException("No journal file found.")
|
|
152
|
-
elif listLen == 1:
|
|
153
|
-
tdenv.NOTE("Found one journal file.")
|
|
154
|
-
else:
|
|
155
|
-
tdenv.NOTE("Found {} journal files.", listLen)
|
|
156
|
-
|
|
157
|
-
if logLast and listLen > 1:
|
|
158
|
-
del self.filePathList[:-1]
|
|
159
|
-
|
|
160
|
-
def parseJournalDirList(self):
|
|
161
|
-
"""
|
|
162
|
-
parse Journal files
|
|
163
|
-
see: https://forums.frontier.co.uk/showthread.php/275151-Commanders-log-manual-and-data-sample
|
|
164
|
-
"""
|
|
165
|
-
tdenv = self.tdenv
|
|
166
|
-
|
|
167
|
-
logSysList = {}
|
|
168
|
-
stnSysList = {}
|
|
169
|
-
blkStnList = []
|
|
170
|
-
for filePath in self.filePathList:
|
|
171
|
-
tdenv.NOTE("parsing '{}'", filePath.name)
|
|
172
|
-
aktStation = False
|
|
173
|
-
inMultiCrew = False
|
|
174
|
-
sysCount = stnCount = blkCount = 0
|
|
175
|
-
with filePath.open() as logFile:
|
|
176
|
-
lineCount = 0
|
|
177
|
-
statHeader = True
|
|
178
|
-
for line in logFile:
|
|
179
|
-
lineCount += 1
|
|
180
|
-
try:
|
|
181
|
-
# parse the json-event-line of the journal
|
|
182
|
-
event = json.loads(line)
|
|
183
|
-
if inMultiCrew:
|
|
184
|
-
# ignore all events in multicrew except
|
|
185
|
-
if event["event"] == "QuitACrew":
|
|
186
|
-
inMultiCrew = False
|
|
187
|
-
else:
|
|
188
|
-
tdenv.DEBUG1("event '{}' ignored (multicrew)", event["event"])
|
|
189
|
-
continue
|
|
190
|
-
logDate = datetime.strptime(
|
|
191
|
-
event["timestamp"], "%Y-%m-%dT%H:%M:%SZ"
|
|
192
|
-
).replace(tzinfo=timezone.utc)
|
|
193
|
-
if statHeader:
|
|
194
|
-
# check the first line
|
|
195
|
-
statHeader = False
|
|
196
|
-
if event["event"] == "Fileheader":
|
|
197
|
-
if "beta" in event["gameversion"].lower():
|
|
198
|
-
# don't parse data from beta versions
|
|
199
|
-
tdenv.NOTE("Ignoring Beta-Version.")
|
|
200
|
-
break
|
|
201
|
-
# ignore the header-event
|
|
202
|
-
continue
|
|
203
|
-
else:
|
|
204
|
-
# don't stop parsing if it's not the header-line
|
|
205
|
-
tdenv.WARN("Doesn't seem do be a FDEV Journal file")
|
|
206
|
-
if event["event"] == "Location":
|
|
207
|
-
# convert event before the if-elif starts
|
|
208
|
-
if event.get("Docked", False):
|
|
209
|
-
event["event"] = "Docked"
|
|
210
|
-
tdenv.DEBUG0(" EVENT: Changed Location to Docked")
|
|
211
|
-
# if-elif starts here
|
|
212
|
-
if event["event"] == "FSDJump":
|
|
213
|
-
sysCount += 1
|
|
214
|
-
sysDate = logDate
|
|
215
|
-
sysName = event["StarSystem"]
|
|
216
|
-
sysPosA = event["StarPos"]
|
|
217
|
-
sysPosX, sysPosY, sysPosZ = sysPosA[0], sysPosA[1], sysPosA[2]
|
|
218
|
-
sysPosX = snapToGrid32(sysPosX)
|
|
219
|
-
sysPosY = snapToGrid32(sysPosY)
|
|
220
|
-
sysPosZ = snapToGrid32(sysPosZ)
|
|
221
|
-
tdenv.DEBUG0(
|
|
222
|
-
" SYSTEM: {} {} {} {} {}",
|
|
223
|
-
sysDate, sysName, sysPosX, sysPosY, sysPosZ
|
|
224
|
-
)
|
|
225
|
-
logSysList[sysName] = (sysPosX, sysPosY, sysPosZ, sysDate)
|
|
226
|
-
elif event["event"] == "Docked":
|
|
227
|
-
stnCount += 1
|
|
228
|
-
sysName = event["StarSystem"]
|
|
229
|
-
stnList = stnSysList.get(sysName, None)
|
|
230
|
-
if not stnList:
|
|
231
|
-
stnList = stnSysList[sysName] = {}
|
|
232
|
-
stnDate = logDate
|
|
233
|
-
stnName = event["StationName"]
|
|
234
|
-
jrnStation = JournalStation(modified=stnDate)
|
|
235
|
-
jrnStation.lsFromStar = int(event.get("DistFromStarLS", 0) + 0.5)
|
|
236
|
-
stnType = event.get("StationType", None)
|
|
237
|
-
if stnType:
|
|
238
|
-
# conclusions from the stationtype
|
|
239
|
-
jrnStation.planetary = "Y" if stnType.upper() in self.planetTypeList else "N"
|
|
240
|
-
jrnStation.maxPadSize = "M" if stnType.startswith("Outpost") else "L"
|
|
241
|
-
stnServices = event.get("StationServices", None)
|
|
242
|
-
if stnServices:
|
|
243
|
-
# station services since ED update 2.4
|
|
244
|
-
jrnStation.blackMarket = getYNfromService(stnServices, 'BlackMarket')
|
|
245
|
-
jrnStation.market = getYNfromService(stnServices, 'Commodities')
|
|
246
|
-
jrnStation.shipyard = getYNfromService(stnServices, 'Shipyard')
|
|
247
|
-
jrnStation.outfitting = getYNfromService(stnServices, 'Outfitting')
|
|
248
|
-
jrnStation.rearm = getYNfromService(stnServices, 'Rearm')
|
|
249
|
-
jrnStation.refuel = getYNfromService(stnServices, 'Refuel')
|
|
250
|
-
jrnStation.repair = getYNfromService(stnServices, 'Repair')
|
|
251
|
-
tdenv.DEBUG0(
|
|
252
|
-
" STATION: {} {}/{} {}",
|
|
253
|
-
stnDate, sysName, stnName, str(jrnStation)
|
|
254
|
-
)
|
|
255
|
-
stnList[stnName] = jrnStation
|
|
256
|
-
aktStation = True
|
|
257
|
-
sysPosA = event.get("StarPos", None)
|
|
258
|
-
if sysPosA:
|
|
259
|
-
# we got system data inside a docking event
|
|
260
|
-
# use it (changed Location or maybe EDDN capture)
|
|
261
|
-
sysCount += 1
|
|
262
|
-
sysDate = logDate
|
|
263
|
-
sysPosX, sysPosY, sysPosZ = sysPosA[0], sysPosA[1], sysPosA[2]
|
|
264
|
-
sysPosX = snapToGrid32(sysPosX)
|
|
265
|
-
sysPosY = snapToGrid32(sysPosY)
|
|
266
|
-
sysPosZ = snapToGrid32(sysPosZ)
|
|
267
|
-
tdenv.DEBUG0(" SYSTEM: {} {} {} {} {}", sysDate, sysName, sysPosX, sysPosY, sysPosZ)
|
|
268
|
-
logSysList[sysName] = (sysPosX, sysPosY, sysPosZ, sysDate)
|
|
269
|
-
elif event["event"] == "MarketSell" and aktStation:
|
|
270
|
-
# check for BlackMarket
|
|
271
|
-
if event.get("BlackMarket", False):
|
|
272
|
-
stnBlackMarket = (sysName, stnName)
|
|
273
|
-
if stnBlackMarket not in blkStnList:
|
|
274
|
-
tdenv.DEBUG0("B/MARKET: {}/{}", sysName, stnName)
|
|
275
|
-
blkCount += 1
|
|
276
|
-
blkStnList.append(stnBlackMarket)
|
|
277
|
-
elif event["event"] == "Undocked":
|
|
278
|
-
aktStation = False
|
|
279
|
-
elif event["event"] == "JoinACrew":
|
|
280
|
-
inMultiCrew = True
|
|
281
|
-
else:
|
|
282
|
-
tdenv.DEBUG1("event '{}' ignored", event["event"])
|
|
283
|
-
except:
|
|
284
|
-
tdenv.WARN("Something wrong with line {} (skipped it).", lineCount)
|
|
285
|
-
|
|
286
|
-
tdenv.NOTE(
|
|
287
|
-
"Found {} System{}, {} Station{} and {} BlackMarket{}.",
|
|
288
|
-
sysCount, "" if sysCount == 1 else "s",
|
|
289
|
-
stnCount, "" if stnCount == 1 else "s",
|
|
290
|
-
blkCount, "" if blkCount == 1 else "s",
|
|
291
|
-
)
|
|
292
|
-
self.sysList = logSysList
|
|
293
|
-
self.stnList = stnSysList
|
|
294
|
-
self.blkList = blkStnList
|
|
295
|
-
|
|
296
|
-
def updateJournalSysList(self):
|
|
297
|
-
"""
|
|
298
|
-
check the found systems and add them to the DB if new.
|
|
299
|
-
"""
|
|
300
|
-
tdb, tdenv = self.tdb, self.tdenv
|
|
301
|
-
optShow = self.getOption("show")
|
|
302
|
-
|
|
303
|
-
if not optShow:
|
|
304
|
-
try:
|
|
305
|
-
idJournal = tdb.lookupAdded(self.ADDED_NAME)
|
|
306
|
-
tdenv.DEBUG1("idjournal = {}", idJournal)
|
|
307
|
-
except KeyError:
|
|
308
|
-
tdenv.WARN("Entry '{}' not found in 'Added' table.", self.ADDED_NAME)
|
|
309
|
-
tdenv.WARN("Trying to add it myself.")
|
|
310
|
-
db = tdb.getDB()
|
|
311
|
-
cur = db.cursor()
|
|
312
|
-
cur.execute(
|
|
313
|
-
"INSERT INTO Added(name) VALUES(?)",
|
|
314
|
-
[self.ADDED_NAME]
|
|
315
|
-
)
|
|
316
|
-
db.commit()
|
|
317
|
-
tdenv.NOTE("Export Table 'Added'")
|
|
318
|
-
_, path = csvexport.exportTableToFile(tdb, tdenv, "Added")
|
|
319
|
-
pass
|
|
320
|
-
|
|
321
|
-
addCount = oldCount = newCount = 0
|
|
322
|
-
for sysName in sorted(self.sysList):
|
|
323
|
-
sysPosX, sysPosY, sysPosZ, sysDate = self.sysList[sysName]
|
|
324
|
-
utcDate = sysDate.astimezone(timezone.utc).strftime('%Y-%m-%d %H:%M:%S')
|
|
325
|
-
tdenv.DEBUG0(
|
|
326
|
-
"log system '{}' ({}, {}, {}, '{}')",
|
|
327
|
-
sysName, sysPosX, sysPosY, sysPosZ, utcDate
|
|
328
|
-
)
|
|
329
|
-
if sysName.upper() in self.ignoreSysNames:
|
|
330
|
-
tdenv.NOTE("Ignoring system: '{}'", sysName)
|
|
331
|
-
continue
|
|
332
|
-
systemTD = tdb.systemByName.get(sysName.upper(), None)
|
|
333
|
-
if systemTD:
|
|
334
|
-
# we allready know the system, check coords
|
|
335
|
-
tdenv.DEBUG0(
|
|
336
|
-
"Old system '{}' ({}, {}, {})",
|
|
337
|
-
systemTD.dbname, systemTD.posX, systemTD.posY, systemTD.posZ
|
|
338
|
-
)
|
|
339
|
-
oldCount += 1
|
|
340
|
-
if not (systemTD.posX == sysPosX and
|
|
341
|
-
systemTD.posY == sysPosY and
|
|
342
|
-
systemTD.posZ == sysPosZ):
|
|
343
|
-
tdenv.WARN("System '{}' has different coordinates:", sysName)
|
|
344
|
-
tdenv.WARN(" database: {}, {}, {}", systemTD.posX, systemTD.posY, systemTD.posZ)
|
|
345
|
-
tdenv.WARN(" Journal: {}, {}, {}", sysPosX, sysPosY, sysPosZ)
|
|
346
|
-
else:
|
|
347
|
-
# it's a new system
|
|
348
|
-
newCount += 1
|
|
349
|
-
if optShow:
|
|
350
|
-
# display only
|
|
351
|
-
tdenv.NOTE(
|
|
352
|
-
"New system '{}' ({}, {}, {}, '{}')",
|
|
353
|
-
sysName, sysPosX, sysPosY, sysPosZ, utcDate
|
|
354
|
-
)
|
|
355
|
-
else:
|
|
356
|
-
# add it to the database
|
|
357
|
-
# the function will output something
|
|
358
|
-
tdb.addLocalSystem(
|
|
359
|
-
sysName.upper(),
|
|
360
|
-
sysPosX, sysPosY, sysPosZ,
|
|
361
|
-
added=self.ADDED_NAME,
|
|
362
|
-
modified=utcDate,
|
|
363
|
-
commit=False
|
|
364
|
-
)
|
|
365
|
-
addCount += 1
|
|
366
|
-
|
|
367
|
-
# output statistics
|
|
368
|
-
allCount = oldCount + newCount
|
|
369
|
-
tdenv.NOTE(
|
|
370
|
-
"Found {:>3} System{} altogether.",
|
|
371
|
-
allCount, "" if allCount == 1 else "s",
|
|
372
|
-
)
|
|
373
|
-
for iCount, iText in [
|
|
374
|
-
(oldCount, "old"), (newCount, "new"), (addCount, "added"),
|
|
375
|
-
]:
|
|
376
|
-
tdenv.NOTE(" {:>3} {}", iCount, iText)
|
|
377
|
-
if addCount:
|
|
378
|
-
tdb.getDB().commit()
|
|
379
|
-
tdenv.NOTE("Export Table 'System'")
|
|
380
|
-
_, path = csvexport.exportTableToFile(tdb, tdenv, "System")
|
|
381
|
-
|
|
382
|
-
def updateJournalStnList(self):
|
|
383
|
-
"""
|
|
384
|
-
check the found stations and
|
|
385
|
-
add them to the DB if new or
|
|
386
|
-
update them in the DB if changed.
|
|
387
|
-
"""
|
|
388
|
-
tdb, tdenv = self.tdb, self.tdenv
|
|
389
|
-
optShow = self.getOption("show")
|
|
390
|
-
|
|
391
|
-
addCount = oldCount = newCount = updCount = 0
|
|
392
|
-
for sysName in sorted(self.stnList):
|
|
393
|
-
if sysName.upper() in self.ignoreSysNames:
|
|
394
|
-
tdenv.NOTE("Ignoring system: '{}'", sysName)
|
|
395
|
-
continue
|
|
396
|
-
system = tdb.systemByName.get(sysName.upper(), None)
|
|
397
|
-
if not (system or optShow):
|
|
398
|
-
# only warn if we are not in show mode
|
|
399
|
-
# otherwise we could have addded the system before
|
|
400
|
-
tdenv.WARN("System '{}' unknown.", sysName)
|
|
401
|
-
continue
|
|
402
|
-
for stnName in sorted(self.stnList[sysName]):
|
|
403
|
-
jrnStation = self.stnList[sysName][stnName]
|
|
404
|
-
utcDate = jrnStation.modified.astimezone(timezone.utc).strftime('%Y-%m-%d %H:%M:%S')
|
|
405
|
-
station = None
|
|
406
|
-
if system:
|
|
407
|
-
# system could be None in show mode and the lookup
|
|
408
|
-
# function would try very hard to find the station
|
|
409
|
-
try:
|
|
410
|
-
station = tdb.lookupStation(stnName, system)
|
|
411
|
-
except LookupError:
|
|
412
|
-
pass
|
|
413
|
-
|
|
414
|
-
if (sysName, stnName) in self.blkList:
|
|
415
|
-
# BlackMarket found
|
|
416
|
-
jrnStation.blackMarket = "Y"
|
|
417
|
-
elif station:
|
|
418
|
-
if jrnStation.blackMarket == "?":
|
|
419
|
-
# don't change current value if new one is unknown
|
|
420
|
-
jrnStation.blackMarket = station.blackMarket
|
|
421
|
-
|
|
422
|
-
tdenv.DEBUG0(
|
|
423
|
-
"log station '{}/{}' ({}, '{}')",
|
|
424
|
-
sysName, stnName, str(jrnStation), utcDate
|
|
425
|
-
)
|
|
426
|
-
|
|
427
|
-
if not station:
|
|
428
|
-
# must be a new station
|
|
429
|
-
newCount += 1
|
|
430
|
-
if optShow:
|
|
431
|
-
# display only
|
|
432
|
-
tdenv.NOTE(
|
|
433
|
-
"New station '{}/{}' ({}, '{}')",
|
|
434
|
-
sysName, stnName, str(jrnStation), utcDate
|
|
435
|
-
)
|
|
436
|
-
else:
|
|
437
|
-
# add it to the database
|
|
438
|
-
# the function will output something
|
|
439
|
-
station = tdb.addLocalStation(
|
|
440
|
-
system=system,
|
|
441
|
-
name=stnName,
|
|
442
|
-
lsFromStar=jrnStation.lsFromStar,
|
|
443
|
-
blackMarket=jrnStation.blackMarket,
|
|
444
|
-
maxPadSize=jrnStation.maxPadSize,
|
|
445
|
-
market=jrnStation.market,
|
|
446
|
-
shipyard=jrnStation.shipyard,
|
|
447
|
-
outfitting=jrnStation.outfitting,
|
|
448
|
-
rearm=jrnStation.rearm,
|
|
449
|
-
refuel=jrnStation.refuel,
|
|
450
|
-
repair=jrnStation.repair,
|
|
451
|
-
planetary=jrnStation.planetary,
|
|
452
|
-
modified=utcDate,
|
|
453
|
-
commit=False,
|
|
454
|
-
)
|
|
455
|
-
addCount += 1
|
|
456
|
-
else:
|
|
457
|
-
oldCount += 1
|
|
458
|
-
tdenv.DEBUG0(
|
|
459
|
-
"Old station '{}' ({}ls Pad:{} Mkt:{} Blk:{} Shp:{} Out:{} Arm:{} Ref:{} Rep:{} Plt:{})",
|
|
460
|
-
station.name(), station.lsFromStar, station.maxPadSize, station.market,
|
|
461
|
-
station.blackMarket, station.shipyard, station.outfitting,
|
|
462
|
-
station.rearm, station.refuel, station.repair, station.planetary
|
|
463
|
-
)
|
|
464
|
-
if not optShow:
|
|
465
|
-
if (station.lsFromStar != jrnStation.lsFromStar and
|
|
466
|
-
station.blackMarket == jrnStation.blackMarket and
|
|
467
|
-
station.maxPadSize == jrnStation.maxPadSize and
|
|
468
|
-
station.market == jrnStation.market and
|
|
469
|
-
station.shipyard == jrnStation.shipyard and
|
|
470
|
-
station.outfitting == jrnStation.outfitting and
|
|
471
|
-
station.rearm == jrnStation.rearm and
|
|
472
|
-
station.refuel == jrnStation.refuel and
|
|
473
|
-
station.repair == jrnStation.repair and
|
|
474
|
-
station.planetary == jrnStation.planetary
|
|
475
|
-
):
|
|
476
|
-
# ignore 15% deviation if it's the only change
|
|
477
|
-
lsMin = int(station.lsFromStar * 0.85)
|
|
478
|
-
lsMax = int(station.lsFromStar*1.15 + 1)
|
|
479
|
-
if lsMin <= jrnStation.lsFromStar <= lsMax:
|
|
480
|
-
tdenv.DEBUG0(
|
|
481
|
-
"ignore 15% deviation ({}ls ~ {}ls)",
|
|
482
|
-
jrnStation.lsFromStar, station.lsFromStar
|
|
483
|
-
)
|
|
484
|
-
jrnStation.lsFromStar = station.lsFromStar
|
|
485
|
-
# the function will do it's own check and output
|
|
486
|
-
# something if the station is updated
|
|
487
|
-
if tdb.updateLocalStation(
|
|
488
|
-
station=station,
|
|
489
|
-
lsFromStar=jrnStation.lsFromStar,
|
|
490
|
-
blackMarket=jrnStation.blackMarket,
|
|
491
|
-
maxPadSize=jrnStation.maxPadSize,
|
|
492
|
-
market=jrnStation.market,
|
|
493
|
-
shipyard=jrnStation.shipyard,
|
|
494
|
-
outfitting=jrnStation.outfitting,
|
|
495
|
-
rearm=jrnStation.rearm,
|
|
496
|
-
refuel=jrnStation.refuel,
|
|
497
|
-
repair=jrnStation.repair,
|
|
498
|
-
planetary=jrnStation.planetary,
|
|
499
|
-
modified=utcDate,
|
|
500
|
-
commit=False,
|
|
501
|
-
):
|
|
502
|
-
updCount += 1
|
|
503
|
-
|
|
504
|
-
# output statistics
|
|
505
|
-
allCount = oldCount + newCount
|
|
506
|
-
tdenv.NOTE(
|
|
507
|
-
"Found {:>3} Station{} altogether.",
|
|
508
|
-
allCount, "" if allCount == 1 else "s",
|
|
509
|
-
)
|
|
510
|
-
for iCount, iText in [
|
|
511
|
-
(oldCount, "old"), (updCount, "updated"),
|
|
512
|
-
(newCount, "new"), (addCount, "added"),
|
|
513
|
-
]:
|
|
514
|
-
tdenv.NOTE(" {:>3} {}", iCount, iText)
|
|
515
|
-
if (updCount+addCount) > 0:
|
|
516
|
-
tdb.getDB().commit()
|
|
517
|
-
tdenv.NOTE("Export Table 'Station'")
|
|
518
|
-
_, path = csvexport.exportTableToFile(tdb, tdenv, "Station")
|
|
519
|
-
|
|
520
|
-
def run(self):
|
|
521
|
-
tdb, tdenv = self.tdb, self.tdenv
|
|
522
|
-
|
|
523
|
-
tdenv.DEBUG0("show: {}", self.getOption("show"))
|
|
524
|
-
tdenv.DEBUG0("last: {}", self.getOption("last"))
|
|
525
|
-
tdenv.DEBUG0("date: {}", self.getOption("date"))
|
|
526
|
-
|
|
527
|
-
# Ensure the cache is built and reloaded.
|
|
528
|
-
tdb.reloadCache()
|
|
529
|
-
tdb.load(maxSystemLinkLy=tdenv.maxSystemLinkLy)
|
|
530
|
-
|
|
531
|
-
self.getJournalDirList()
|
|
532
|
-
self.parseJournalDirList()
|
|
533
|
-
self.updateJournalSysList()
|
|
534
|
-
self.updateJournalStnList()
|
|
535
|
-
|
|
536
|
-
# We did all the work
|
|
537
|
-
return False
|