1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-06-02 16:41:04 +03:00

Code much more defensively.

Fixes #10.
This commit is contained in:
Jonathan Harris 2015-06-23 17:12:16 +01:00
parent d28bf65e2b
commit 61d152b44c

280
stats.py
View File

@ -108,6 +108,7 @@ class StatsDialog(tk.Toplevel):
self.title('Cmdr ' + data['commander']['name']) self.title('Cmdr ' + data['commander']['name'])
self.status.grid_forget() self.status.grid_forget()
CR = 'CR'
notebook = ttk.Notebook(self.frame) notebook = ttk.Notebook(self.frame)
notebook.grid(padx=10, pady=10, sticky=tk.NSEW) notebook.grid(padx=10, pady=10, sticky=tk.NSEW)
@ -115,154 +116,154 @@ class StatsDialog(tk.Toplevel):
page = self.addpage(notebook) page = self.addpage(notebook)
self.addranking(page, data, 'combat') self.addranking(page, data, 'combat')
self.addpagespacer(page) self.addpagespacer(page)
try: self.addpageheader(page, ['Statistics'])
self.addpageheader(page, ['Statistics']) for thing in [
for thing, value in [ ('Bounties claimed', ['stats', 'combat', 'bounty', 'qty']),
('Bounties claimed', str(data['stats']['combat']['bounty']['qty'])), ('Profit from bounties', ['stats', 'combat', 'bounty', 'value'], CR),
('Profit from bounties', data['stats']['combat']['bounty']['value']), ('Combat bonds', ['stats', 'combat', 'bond', 'qty']),
('Combat bonds', str(data['stats']['combat']['bond']['qty'])), ('Profit from combat bonds', ['stats', 'combat', 'bond', 'value'], CR),
('Profit from combat bonds', data['stats']['combat']['bond']['value']), ('Assassinations', ['stats', 'missions', 'assassin', 'missionsCompleted']),
('Assassinations', str(data['stats']['missions']['assassin']['missionsCompleted'])), ('Profit from assassinations', ['stats', 'missions', 'assassin', 'creditsEarned'], CR),
('Profit from assassinations', data['stats']['missions']['assassin']['creditsEarned']), ('Highest single assassination', ['stats', 'missions', 'assassin', 'highestEarnings', 'value'], CR),
('Highest single assassination', data['stats']['missions']['assassin']['highestEarnings']['value']), ('Bounty hunting', ['stats', 'missions', 'bountyHunter', 'missionsCompleted']),
('Bounty hunting', str(data['stats']['missions']['bountyHunter']['missionsCompleted'])), ('Profit from bounty hunting', ['stats', 'missions', 'bountyHunter', 'creditsEarned'], CR),
('Profit from bounty hunting', data['stats']['missions']['bountyHunter']['creditsEarned']), ('Highest single bounty', ['stats', 'missions', 'bountyHunter', 'highestEarnings', 'value'], CR),
('Highest single bounty', data['stats']['missions']['bountyHunter']['highestEarnings']['value']), ]:
]: self.addstat(page, data, *thing)
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value])
except:
if __debug__: print_exc()
notebook.add(page, text='Combat') notebook.add(page, text='Combat')
page = self.addpage(notebook) page = self.addpage(notebook)
self.addranking(page, data, 'trade') self.addranking(page, data, 'trade')
self.addpagespacer(page) self.addpagespacer(page)
try: for thing in [
self.addpageheader(page, ['Trading']) ('Market network', ['stats', 'trade', 'marketIds'], len),
for thing, value in [ ('Trading profit', ['stats', 'trade', 'profit'], CR),
('Market network', str(len(data['stats']['trade']['marketIds']))), ('Commodities traded', ['stats', 'trade', 'qty']),
('Trading profit', data['stats']['trade']['profit']), ('Average profit', (['stats', 'trade', 'profit'], ['stats', 'trade', 'count']), CR),
('Commodities traded', str(data['stats']['trade']['qty'])), ('Highest single transaction', ['stats', 'trade', 'largestProfit', 'value'], CR),
('Average profit', data['stats']['trade']['profit'] / data['stats']['trade']['count']),
('Highest single transaction', data['stats']['trade']['largestProfit']['value']),
('', data['stats']['trade']['largestProfit']['qty'] and '%d %s' % (data['stats']['trade']['largestProfit']['qty'], companion.commodity_map.get(data['stats']['trade']['largestProfit']['commodity'], data['stats']['trade']['largestProfit']['commodity'])) or ''),
]: ]:
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value]) self.addstat(page, data, *thing)
except:
if __debug__: print_exc()
try: try:
self.addpageheader(page, ['Smuggling']) if not data['stats']['trade']['largestProfit']['qty']: raise Exception()
for thing, value in [ self.addpagerow(page, ['', '%d %s' % (data['stats']['trade']['largestProfit']['qty'], companion.commodity_map.get(data['stats']['trade']['largestProfit']['commodity'], data['stats']['trade']['largestProfit']['commodity']))])
('Black Market network', str(len(data['stats']['blackMarket']['marketIds']))),
('Black Market profit', data['stats']['blackMarket']['profit']),
('Commodities smuggled', str(data['stats']['blackMarket']['qty'])),
('Average profit', data['stats']['blackMarket']['profit'] / data['stats']['blackMarket']['count']),
('Highest single transaction', data['stats']['blackMarket']['largestProfit']['value']),
('', data['stats']['blackMarket']['largestProfit']['qty'] and '%d %s' % (data['stats']['blackMarket']['largestProfit']['qty'], companion.commodity_map.get(data['stats']['blackMarket']['largestProfit']['commodity'], data['stats']['blackMarket']['largestProfit']['commodity'])) or ''),
]:
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value])
except: except:
if __debug__: print_exc() self.addpagespacer(page)
self.addpageheader(page, ['Smuggling'])
for thing in [
('Black Market network', ['stats', 'blackMarket', 'marketIds'], len),
('Black Market profit', ['stats', 'blackMarket', 'profit'], CR),
('Commodities smuggled', ['stats', 'blackMarket', 'qty']),
('Average profit', (['stats', 'blackMarket', 'profit'], ['stats', 'blackMarket', 'count']), CR),
('Highest single transaction', ['stats', 'blackMarket', 'largestProfit', 'value'], CR),
]:
self.addstat(page, data, *thing)
try: try:
self.addpageheader(page, ['Mining']) if not data['stats']['blackMarket']['largestProfit']['qty']: raise Exception()
for thing, value in [ self.addpagerow(page, ['', '%d %s' % (data['stats']['blackMarket']['largestProfit']['qty'], companion.commodity_map.get(data['stats']['blackMarket']['largestProfit']['commodity'], data['stats']['blackMarket']['largestProfit']['commodity']))])
('Profit from mining', data['stats']['mining']['profit']),
('Fragments mined', str(data['stats']['mining']['qty'])),
('Converted', str(data['stats']['mining']['converted']['qty'])),
]:
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value])
except: except:
if __debug__: print_exc() self.addpagespacer(page)
self.addpageheader(page, ['Mining'])
for thing in [
('Profit from mining', ['stats', 'mining', 'profit'], CR),
('Fragments mined', ['stats', 'mining', 'qty']),
('Converted', ['stats', 'mining', 'converted', 'qty']),
]:
self.addstat(page, data, *thing)
notebook.add(page, text='Trade') notebook.add(page, text='Trade')
page = self.addpage(notebook) page = self.addpage(notebook)
self.addranking(page, data, 'explore') self.addranking(page, data, 'explore')
self.addpagespacer(page) self.addpagespacer(page)
try: self.addpageheader(page, ['Statistics'])
self.addpageheader(page, ['Statistics']) for thing in [
for thing, value in [ ('Systems visited', ['stats', 'explore', 'visited', 'starsystem'], len),
('Systems visited', str(len(data['stats']['explore']['visited']['starsystem']))), ('Profits from exploration', ['stats', 'explore', 'creditsEarned'], CR),
('Profits from exploration', data['stats']['explore']['creditsEarned']), ('Discovery scans', ['stats', 'explore', 'scanSoldLevels', 'lev_0']),
('Discovery scans', str(data['stats']['explore']['scanSoldLevels']['lev_0'])), ('Level 2 detailed scans', ['stats', 'explore', 'scanSoldLevels', 'lev_1']),
('Level 2 detailed scans', str(data['stats']['explore']['scanSoldLevels']['lev_1'])), ('Level 3 detailed scans', ['stats', 'explore', 'scanSoldLevels', 'lev_2']),
('Level 3 detailed scans', str(data['stats']['explore']['scanSoldLevels']['lev_2'])), ('Bodies first discovered', ['stats', 'explore', 'bodiesFirstDiscovered']),
('Bodies first discovered', str(data['stats']['explore']['bodiesFirstDiscovered'])), ('Highest single transaction', ['stats', 'explore', 'highestPayout'], CR),
('Highest single transaction', data['stats']['explore']['highestPayout']), ('Hyperspace jumps', ['stats', 'explore', 'hyperspaceJumps']),
('Hyperspace jumps', str(data['stats']['explore']['hyperspaceJumps'])), ('Distance travelled', ['stats', 'explore', 'totalHyperspaceDistance'], 'Ly'),
('Distance travelled', '{:,} Ly'.format(int(data['stats']['explore']['totalHyperspaceDistance']))), ('Farthest distance from home', ['stats', 'explore', 'greatestDistanceFromStart'], 'Ly'),
('Farthest distance from home', '{:,} Ly'.format(int(data['stats']['explore']['greatestDistanceFromStart']))), ]:
]: self.addstat(page, data, *thing)
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value])
except:
if __debug__: print_exc()
notebook.add(page, text='Explorer') notebook.add(page, text='Explorer')
page = self.addpage(notebook, ['Faction', 'Rank'], align=tk.W) page = self.addpage(notebook, ['Faction', 'Rank'], align=tk.W)
for category in ['federation', 'empire', 'power']:
self.addpagerow(page, [category.capitalize(), self.ranktitle(category, data['commander']['rank'].get(category))], align=tk.W)
self.addpagespacer(page)
try: try:
self.addpageheader(page, ['Crime']) for category in ['federation', 'empire', 'power']:
for thing, value in [ self.addpagerow(page, [category.capitalize(), self.ranktitle(category, data['commander']['rank'][category])], align=tk.W)
('Fines issued', str(data['stats']['crime']['fine']['qty'])),
('Lifetime fines value', data['stats']['crime']['fine']['value']),
('Bounties claimed', str(data['stats']['crime']['bounty']['qty'])),
('Lifetime bounty value', data['stats']['crime']['bounty']['value']),
('Highest bounty issued', data['stats']['crime']['bounty']['highest']['value']),
('Commodities stolen', str(data['stats']['crime']['stolenCargo']['qty'])),
('Profit from stolen commodities', data['stats']['crime']['stolenCargo']['value']),
]:
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value])
except: except:
if __debug__: print_exc() if __debug__: print_exc()
self.addpagespacer(page)
self.addpageheader(page, ['Crime'])
for thing in [
('Fines issued', ['stats', 'crime', 'fine', 'qty']),
('Lifetime fines value', ['stats', 'crime', 'fine', 'value'], CR),
('Bounties claimed', ['stats', 'crime', 'bounty', 'qty']),
('Lifetime bounty value', ['stats', 'crime', 'bounty', 'value'], CR),
('Highest bounty issued', ['stats', 'crime', 'bounty', 'highest', 'value'], CR),
('Commodities stolen', ['stats', 'crime', 'stolenCargo', 'qty']),
('Profit from stolen commodities',['stats', 'crime', 'stolenCargo', 'value'], CR),
]:
self.addstat(page, data, *thing)
notebook.add(page, text='Rep') notebook.add(page, text='Rep')
page = self.addpage(notebook, ['Ship', 'System', 'Station'], align=tk.W)
try: try:
page = self.addpage(notebook, ['Ship', 'System', 'Station'], align=tk.W) if isinstance(data['ships'], list):
current = data['commander'].get('currentShipId') for ship in data['ships']:
for key in sorted(data['ships'].keys(), key=int): self.addpagerow(page, [companion.ship_map.get(ship['name'], ship['name']),
ship = data['ships'][key] ship['starsystem']['name'], ship['station']['name']], align=tk.W)
self.addpagerow(page, [companion.ship_map.get(ship['name'], ship['name']) + (int(key)==current and ' *' or ''), else:
ship['starsystem']['name'], ship['station']['name']], align=tk.W) current = data['commander'].get('currentShipId')
notebook.add(page, text='Ships') for key in sorted(data['ships'].keys(), key=int):
ship = data['ships'][key]
self.addpagerow(page, [companion.ship_map.get(ship['name'], ship['name']) + (int(key)==current and ' *' or ''),
ship['starsystem']['name'], ship['station']['name']], align=tk.W)
except: except:
if __debug__: print_exc() if __debug__: print_exc()
notebook.add(page, text='Ships')
page = self.addpage(notebook, ['Rank', 'NPC', 'PVP'])
try: try:
page = self.addpage(notebook, ['Rank', 'NPC', 'PVP'])
npc = data['stats']['NPC']['kills']['ranks'] npc = data['stats']['NPC']['kills']['ranks']
pvp = data['stats']['PVP']['kills']['ranks'] pvp = data['stats']['PVP']['kills']['ranks']
self.addpagerow(page, ['Capital', npc.get('rArray', 0), pvp.get('rArray', 0)]) self.addpagerow(page, ['Capital', npc.get('rArray', 0), pvp.get('rArray', 0)])
for rank in range(len(self.RANKS['combat'])-1, -1, -1): for rank in range(len(self.RANKS['combat'])-1, -1, -1):
self.addpagerow(page, [self.RANKS['combat'][rank], npc.get('r%d' % rank, 0), pvp.get('r%d' % rank, 0)]) self.addpagerow(page, [self.RANKS['combat'][rank], npc.get('r%d' % rank, 0), pvp.get('r%d' % rank, 0)])
notebook.add(page, text='Kills')
except: except:
if __debug__: print_exc() if __debug__: print_exc()
notebook.add(page, text='Kills')
page = self.addpage(notebook, ['Finance'])
for thing in [
('Highest balance', ['stats', 'wealth', 'maxCredits'], CR),
('Current balance', ['commander', 'credits'], CR),
('Current loan', ['commander', 'debt'], CR),
]:
self.addstat(page, data, *thing)
self.addpagespacer(page)
self.addpageheader(page, ['Statistics'])
try: try:
page = self.addpage(notebook, ['Finance']) self.addpagerow(page, ['Current assets', '{:,} CR'.format(int(data['commander']['credits'] + data['ship']['value']['total']))])
for thing, value in [
('Highest balance', data['stats']['wealth']['maxCredits']),
('Current balance', data['commander']['credits']),
('Current loan', data['commander']['debt']),
]:
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value])
self.addpagespacer(page)
self.addpageheader(page, ['Statistics'])
for thing, value in [
('Current assets', data['commander']['credits'] + data['ship']['value']['total']),
('Credits spent on ships', data['stats']['ship']['spend']['ships']),
('Credits spent on outfitting', data['stats']['ship']['spend']['modules']),
('Credits spent on repairs', data['stats']['ship']['spend']['repair']),
('Credits spent on fuel', data['stats']['ship']['spend']['fuel']),
('Credits spent on munitions', data['stats']['ship']['spend']['ammo']),
('Insurance claims', str(data['stats']['ship']['insurance']['claims'])),
('Total claim costs', data['stats']['ship']['insurance']['value']),
]:
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value])
notebook.add(page, text='Balance')
except: except:
if __debug__: print_exc() if __debug__: print_exc()
for thing in [
('Credits spent on ships', ['stats', 'ship', 'spend', 'ships'], CR),
('Credits spent on outfitting', ['stats', 'ship', 'spend', 'modules'], CR),
('Credits spent on repairs', ['stats', 'ship', 'spend', 'repair'], CR),
('Credits spent on fuel', ['stats', 'ship', 'spend', 'fuel'], CR),
('Credits spent on munitions', ['stats', 'ship', 'spend', 'ammo'], CR),
('Insurance claims', ['stats', 'ship', 'insurance', 'claims']),
('Total claim costs', ['stats', 'ship', 'insurance', 'value'], CR),
]:
self.addstat(page, data, *thing)
notebook.add(page, text='Balance')
if platform!='darwin': if platform!='darwin':
buttonframe = ttk.Frame(self.frame) buttonframe = ttk.Frame(self.frame)
@ -273,21 +274,52 @@ class StatsDialog(tk.Toplevel):
def addranking(self, parent, data, category): def addranking(self, parent, data, category):
rank = data['commander']['rank'].get(category) try:
progress = list(data['stats']['ranks'].get(category, [])) # shallow copy rank = data['commander']['rank'].get(category)
if not rank or not progress: progress = list(data['stats']['ranks'].get(category, [])) # shallow copy
self.addpageheader(parent, ['Rank']) if not rank or not progress:
self.addpagerow(parent, [self.ranktitle(category, rank)]) self.addpageheader(parent, ['Rank'])
else: self.addpagerow(parent, [self.ranktitle(category, rank)])
self.addpageheader(parent, ['Rank', 'Achieved', 'Elapsed']) else:
while rank > 0: self.addpageheader(parent, ['Rank', 'Achieved', 'Elapsed'])
if rank>=len(progress) or not progress[rank]['ts']: while rank > 0:
self.addpagerow(parent, [self.ranktitle(category, rank)]) if rank>=len(progress) or not progress[rank]['ts']:
else: self.addpagerow(parent, [self.ranktitle(category, rank)])
self.addpagerow(parent, [self.ranktitle(category, rank), else:
time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(progress[rank]['ts'])), self.addpagerow(parent, [self.ranktitle(category, rank),
self.elapsed(progress[rank]['gt'])]) time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(progress[rank]['ts'])),
rank -= 1 self.elapsed(progress[rank]['gt'])])
rank -= 1
except:
if __debug__: print_exc()
def addstat(self, parent, data, category, content, transform=None):
# category can be a simple type, a list of keys into data, or a (dividend,divsior) pair of lists of keys
try:
if isinstance(content, list):
value = data
for key in content:
value = value[key]
elif isinstance(content, tuple):
dividend = data
divisor = data
for key in content[0]:
dividend = dividend[key]
for key in content[1]:
divisor = divisor[key]
value = dividend / divisor
else:
value = content
if transform is None:
value = '{:,}'.format(value)
elif isinstance(transform, basestring):
value = '{:,}'.format(value) + ' ' + transform
else:
value = '{:,}'.format(int(transform(value)))
except:
assert False, content
value = isinstance(transform, basestring) and '0 '+transform or '0'
self.addpagerow(parent, [category, value])
def addpage(self, parent, content=[], align=tk.E): def addpage(self, parent, content=[], align=tk.E):
if platform in ['darwin', 'win32']: if platform in ['darwin', 'win32']: