forked from EDCD/EDMarketConnector
-
Notifications
You must be signed in to change notification settings - Fork 0
/
collate.py
executable file
·190 lines (158 loc) · 6.71 KB
/
collate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#!/usr/bin/python
#
# Script for collating lists of seen commodities, modules and ships from dumps of the Companion API output
#
import csv
import json
import os
from os.path import exists, isfile
import sys
from traceback import print_exc
import companion
import outfitting
# keep a summary of commodities found using in-game names
# Assumes that the commodity data has already been 'fixed up'
def addcommodities(data):
if not data['lastStarport'].get('commodities'): return
commodityfile = 'commodity.csv'
commodities = {}
# slurp existing
if isfile(commodityfile):
with open(commodityfile) as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
commodities[int(row['id'])] = row # index by int for easier lookup and sorting
size_pre = len(commodities)
for commodity in data['lastStarport'].get('commodities'):
key = int(commodity['id'])
new = {
'id' : commodity['id'],
'symbol' : commodity['name'],
'category' : companion.category_map.get(commodity['categoryname']) or commodity['categoryname'],
'name' : commodity.get('locName') or 'Limpets',
}
old = commodities.get(key)
if old and companion.category_map.get(commodity['categoryname'], True):
if new['symbol'] != old['symbol'] or new['name'] != old['name']:
raise AssertionError('%s: "%s"!="%s"' % (key, new, old))
commodities[key] = new
if len(commodities) > size_pre:
if isfile(commodityfile):
if isfile(commodityfile+'.bak'):
os.unlink(commodityfile+'.bak')
os.rename(commodityfile, commodityfile+'.bak')
with open(commodityfile, 'wb') as csvfile:
writer = csv.DictWriter(csvfile, ['id', 'symbol', 'category', 'name'])
writer.writeheader()
for key in sorted(commodities):
writer.writerow(commodities[key])
print 'Added %d new commodities' % (len(commodities) - size_pre)
# keep a summary of modules found
def addmodules(data):
if not data['lastStarport'].get('modules'): return
outfile = 'outfitting.csv'
modules = {}
fields = ['id', 'symbol', 'category', 'name', 'mount', 'guidance', 'ship', 'class', 'rating', 'entitlement']
# slurp existing
if isfile(outfile):
with open(outfile) as csvfile:
reader = csv.DictReader(csvfile, restval='')
for row in reader:
modules[int(row['id'])] = row # index by int for easier lookup and sorting
size_pre = len(modules)
for key,module in data['lastStarport'].get('modules').iteritems():
# sanity check
if int(key) != module.get('id'): raise AssertionError('id: %s!=%s' % (key, module['id']))
try:
new = outfitting.lookup(module, companion.ship_map, True)
except:
print '%d, %s:' % (module['id'], module['name'])
print_exc(0)
new = None
if new:
old = modules.get(int(key))
if old:
# check consistency with existing data
for thing in fields:
if not old.get(thing) and new.get(thing):
size_pre -= 1
elif str(new.get(thing,'')) != old.get(thing):
raise AssertionError('%s: %s "%s"!="%s"' % (key, thing, new.get(thing), old.get(thing)))
modules[int(key)] = new
if len(modules) > size_pre:
if isfile(outfile):
if isfile(outfile+'.bak'):
os.unlink(outfile+'.bak')
os.rename(outfile, outfile+'.bak')
with open(outfile, 'wb') as csvfile:
writer = csv.DictWriter(csvfile, fields, extrasaction='ignore')
writer.writeheader()
for key in sorted(modules):
writer.writerow(modules[key])
print 'Added %d new modules' % (len(modules) - size_pre)
# keep a summary of ships found
def addships(data):
if not data['lastStarport'].get('ships'): return
shipfile = 'shipyard.csv'
ships = {}
fields = ['id', 'symbol', 'name']
# slurp existing
if isfile(shipfile):
with open(shipfile) as csvfile:
reader = csv.DictReader(csvfile, restval='')
for row in reader:
ships[int(row['id'])] = row # index by int for easier lookup and sorting
size_pre = len(ships)
for ship in (data['lastStarport']['ships'].get('shipyard_list') or {}).values() + data['lastStarport']['ships'].get('unavailable_list'):
# sanity check
key = ship['id']
new = { 'id': int(key), 'symbol': ship['name'], 'name': companion.ship_map.get(ship['name'].lower()) }
if new:
old = ships.get(int(key))
if old:
# check consistency with existing data
for thing in fields:
if not old.get(thing) and new.get(thing):
ships[int(key)] = new
size_pre -= 1
elif str(new.get(thing,'')) != old.get(thing):
raise AssertionError('%s: %s "%s"!="%s"' % (key, thing, new.get(thing), old.get(thing)))
ships[int(key)] = new
if len(ships) > size_pre:
if isfile(shipfile):
if isfile(shipfile+'.bak'):
os.unlink(shipfile+'.bak')
os.rename(shipfile, shipfile+'.bak')
with open(shipfile, 'wb') as csvfile:
writer = csv.DictWriter(csvfile, ['id', 'symbol', 'name'])
writer.writeheader()
for key in sorted(ships):
writer.writerow(ships[key])
print 'Added %d new ships' % (len(ships) - size_pre)
if __name__ == "__main__":
if len(sys.argv) <= 1:
print 'Usage: collate.py [dump.json]'
else:
# read from dumped json file(s)
session = companion.Session()
for f in sys.argv[1:]:
with open(f) as h:
print f
data = json.load(h)
if not data['commander'].get('docked'):
print 'Not docked!'
elif not data.get('lastStarport'):
print 'No starport!'
else:
if data['lastStarport'].get('commodities'):
addcommodities(data)
else:
print 'No market'
if data['lastStarport'].get('modules'):
addmodules(data)
else:
print 'No outfitting'
if data['lastStarport'].get('ships'):
addships(data)
else:
print 'No shipyard'