1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-04-14 16:27:13 +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.status.grid_forget()
CR = 'CR'
notebook = ttk.Notebook(self.frame)
notebook.grid(padx=10, pady=10, sticky=tk.NSEW)
@ -115,154 +116,154 @@ class StatsDialog(tk.Toplevel):
page = self.addpage(notebook)
self.addranking(page, data, 'combat')
self.addpagespacer(page)
try:
self.addpageheader(page, ['Statistics'])
for thing, value in [
('Bounties claimed', str(data['stats']['combat']['bounty']['qty'])),
('Profit from bounties', data['stats']['combat']['bounty']['value']),
('Combat bonds', str(data['stats']['combat']['bond']['qty'])),
('Profit from combat bonds', data['stats']['combat']['bond']['value']),
('Assassinations', str(data['stats']['missions']['assassin']['missionsCompleted'])),
('Profit from assassinations', data['stats']['missions']['assassin']['creditsEarned']),
('Highest single assassination', data['stats']['missions']['assassin']['highestEarnings']['value']),
('Bounty hunting', str(data['stats']['missions']['bountyHunter']['missionsCompleted'])),
('Profit from bounty hunting', data['stats']['missions']['bountyHunter']['creditsEarned']),
('Highest single bounty', data['stats']['missions']['bountyHunter']['highestEarnings']['value']),
]:
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value])
except:
if __debug__: print_exc()
self.addpageheader(page, ['Statistics'])
for thing in [
('Bounties claimed', ['stats', 'combat', 'bounty', 'qty']),
('Profit from bounties', ['stats', 'combat', 'bounty', 'value'], CR),
('Combat bonds', ['stats', 'combat', 'bond', 'qty']),
('Profit from combat bonds', ['stats', 'combat', 'bond', 'value'], CR),
('Assassinations', ['stats', 'missions', 'assassin', 'missionsCompleted']),
('Profit from assassinations', ['stats', 'missions', 'assassin', 'creditsEarned'], CR),
('Highest single assassination', ['stats', 'missions', 'assassin', 'highestEarnings', 'value'], CR),
('Bounty hunting', ['stats', 'missions', 'bountyHunter', 'missionsCompleted']),
('Profit from bounty hunting', ['stats', 'missions', 'bountyHunter', 'creditsEarned'], CR),
('Highest single bounty', ['stats', 'missions', 'bountyHunter', 'highestEarnings', 'value'], CR),
]:
self.addstat(page, data, *thing)
notebook.add(page, text='Combat')
page = self.addpage(notebook)
self.addranking(page, data, 'trade')
self.addpagespacer(page)
try:
self.addpageheader(page, ['Trading'])
for thing, value in [
('Market network', str(len(data['stats']['trade']['marketIds']))),
('Trading profit', data['stats']['trade']['profit']),
('Commodities traded', str(data['stats']['trade']['qty'])),
('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 ''),
for thing in [
('Market network', ['stats', 'trade', 'marketIds'], len),
('Trading profit', ['stats', 'trade', 'profit'], CR),
('Commodities traded', ['stats', 'trade', 'qty']),
('Average profit', (['stats', 'trade', 'profit'], ['stats', 'trade', 'count']), CR),
('Highest single transaction', ['stats', 'trade', 'largestProfit', 'value'], CR),
]:
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value])
except:
if __debug__: print_exc()
self.addstat(page, data, *thing)
try:
self.addpageheader(page, ['Smuggling'])
for thing, value in [
('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])
if not data['stats']['trade']['largestProfit']['qty']: raise Exception()
self.addpagerow(page, ['', '%d %s' % (data['stats']['trade']['largestProfit']['qty'], companion.commodity_map.get(data['stats']['trade']['largestProfit']['commodity'], data['stats']['trade']['largestProfit']['commodity']))])
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:
self.addpageheader(page, ['Mining'])
for thing, value in [
('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])
if not data['stats']['blackMarket']['largestProfit']['qty']: raise Exception()
self.addpagerow(page, ['', '%d %s' % (data['stats']['blackMarket']['largestProfit']['qty'], companion.commodity_map.get(data['stats']['blackMarket']['largestProfit']['commodity'], data['stats']['blackMarket']['largestProfit']['commodity']))])
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')
page = self.addpage(notebook)
self.addranking(page, data, 'explore')
self.addpagespacer(page)
try:
self.addpageheader(page, ['Statistics'])
for thing, value in [
('Systems visited', str(len(data['stats']['explore']['visited']['starsystem']))),
('Profits from exploration', data['stats']['explore']['creditsEarned']),
('Discovery scans', str(data['stats']['explore']['scanSoldLevels']['lev_0'])),
('Level 2 detailed scans', str(data['stats']['explore']['scanSoldLevels']['lev_1'])),
('Level 3 detailed scans', str(data['stats']['explore']['scanSoldLevels']['lev_2'])),
('Bodies first discovered', str(data['stats']['explore']['bodiesFirstDiscovered'])),
('Highest single transaction', data['stats']['explore']['highestPayout']),
('Hyperspace jumps', str(data['stats']['explore']['hyperspaceJumps'])),
('Distance travelled', '{:,} Ly'.format(int(data['stats']['explore']['totalHyperspaceDistance']))),
('Farthest distance from home', '{:,} Ly'.format(int(data['stats']['explore']['greatestDistanceFromStart']))),
]:
self.addpagerow(page, [thing, isinstance(value, numbers.Number) and '{:,} CR'.format(value) or value])
except:
if __debug__: print_exc()
self.addpageheader(page, ['Statistics'])
for thing in [
('Systems visited', ['stats', 'explore', 'visited', 'starsystem'], len),
('Profits from exploration', ['stats', 'explore', 'creditsEarned'], CR),
('Discovery scans', ['stats', 'explore', 'scanSoldLevels', 'lev_0']),
('Level 2 detailed scans', ['stats', 'explore', 'scanSoldLevels', 'lev_1']),
('Level 3 detailed scans', ['stats', 'explore', 'scanSoldLevels', 'lev_2']),
('Bodies first discovered', ['stats', 'explore', 'bodiesFirstDiscovered']),
('Highest single transaction', ['stats', 'explore', 'highestPayout'], CR),
('Hyperspace jumps', ['stats', 'explore', 'hyperspaceJumps']),
('Distance travelled', ['stats', 'explore', 'totalHyperspaceDistance'], 'Ly'),
('Farthest distance from home', ['stats', 'explore', 'greatestDistanceFromStart'], 'Ly'),
]:
self.addstat(page, data, *thing)
notebook.add(page, text='Explorer')
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:
self.addpageheader(page, ['Crime'])
for thing, value in [
('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])
for category in ['federation', 'empire', 'power']:
self.addpagerow(page, [category.capitalize(), self.ranktitle(category, data['commander']['rank'][category])], align=tk.W)
except:
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')
page = self.addpage(notebook, ['Ship', 'System', 'Station'], align=tk.W)
try:
page = self.addpage(notebook, ['Ship', 'System', 'Station'], align=tk.W)
current = data['commander'].get('currentShipId')
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)
notebook.add(page, text='Ships')
if isinstance(data['ships'], list):
for ship in data['ships']:
self.addpagerow(page, [companion.ship_map.get(ship['name'], ship['name']),
ship['starsystem']['name'], ship['station']['name']], align=tk.W)
else:
current = data['commander'].get('currentShipId')
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:
if __debug__: print_exc()
notebook.add(page, text='Ships')
page = self.addpage(notebook, ['Rank', 'NPC', 'PVP'])
try:
page = self.addpage(notebook, ['Rank', 'NPC', 'PVP'])
npc = data['stats']['NPC']['kills']['ranks']
pvp = data['stats']['PVP']['kills']['ranks']
self.addpagerow(page, ['Capital', npc.get('rArray', 0), pvp.get('rArray', 0)])
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)])
notebook.add(page, text='Kills')
except:
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:
page = self.addpage(notebook, ['Finance'])
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')
self.addpagerow(page, ['Current assets', '{:,} CR'.format(int(data['commander']['credits'] + data['ship']['value']['total']))])
except:
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':
buttonframe = ttk.Frame(self.frame)
@ -273,21 +274,52 @@ class StatsDialog(tk.Toplevel):
def addranking(self, parent, data, category):
rank = data['commander']['rank'].get(category)
progress = list(data['stats']['ranks'].get(category, [])) # shallow copy
if not rank or not progress:
self.addpageheader(parent, ['Rank'])
self.addpagerow(parent, [self.ranktitle(category, rank)])
else:
self.addpageheader(parent, ['Rank', 'Achieved', 'Elapsed'])
while rank > 0:
if rank>=len(progress) or not progress[rank]['ts']:
self.addpagerow(parent, [self.ranktitle(category, rank)])
else:
self.addpagerow(parent, [self.ranktitle(category, rank),
time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(progress[rank]['ts'])),
self.elapsed(progress[rank]['gt'])])
rank -= 1
try:
rank = data['commander']['rank'].get(category)
progress = list(data['stats']['ranks'].get(category, [])) # shallow copy
if not rank or not progress:
self.addpageheader(parent, ['Rank'])
self.addpagerow(parent, [self.ranktitle(category, rank)])
else:
self.addpageheader(parent, ['Rank', 'Achieved', 'Elapsed'])
while rank > 0:
if rank>=len(progress) or not progress[rank]['ts']:
self.addpagerow(parent, [self.ranktitle(category, rank)])
else:
self.addpagerow(parent, [self.ranktitle(category, rank),
time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(progress[rank]['ts'])),
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):
if platform in ['darwin', 'win32']: