Skip to content

Commit

Permalink
Update_live_stats.py remove some globals, cleanup, fix level stats, p…
Browse files Browse the repository at this point in the history
…ep8 (#5267)

* Update_live_stats.py remove some globals, cleanup, fix level stats

* Tests update

* Fix test metrics

* Some additional exception check

* cleanup
  • Loading branch information
sohje authored and solderzzc committed Sep 8, 2016
1 parent eb81ef0 commit 9a6ebfe
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 101 deletions.
150 changes: 51 additions & 99 deletions pokemongo_bot/cell_workers/update_live_stats.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
import ctypes
import json
import os
import logging

from sys import stdout, platform as _platform
from datetime import datetime, timedelta

from pokemongo_bot.base_task import BaseTask
from pokemongo_bot.worker_result import WorkerResult
from pokemongo_bot.tree_config_builder import ConfigException
from pokemongo_bot.base_dir import _base_dir
from pokemongo_bot import inventory

# XP file
import json

class FileIOException(Exception):
pass


class UpdateLiveStats(BaseTask):
"""
Expand Down Expand Up @@ -73,8 +68,6 @@ class UpdateLiveStats(BaseTask):
"""
SUPPORTED_TASK_API_VERSION = 1

global xp_per_level

def __init__(self, bot, config):
"""
Initializes the worker.
Expand All @@ -95,22 +88,22 @@ def __init__(self, bot, config):
self.bot.event_manager.register_event('log_stats', parameters=('stats', 'stats_raw'))

# init xp_per_level
global xp_per_level
self.xp_per_level = None
# If xp_level file exists, load variables from json
# file name should not be hard coded either
xpfile = "data/xp_per_level.json"
try:
with open(xpfile, 'rb') as data:
xp_per_level = json.load(data)
except ValueError:
self.xp_per_level = json.load(data)
except (ValueError, IOError):
# log somme warning message
self.emit_event(
'log_stats',
level='info',
formatted="Unable to read XP level file"
)
# load default valuesto supplement unknown current_level_xp
xp_per_level = [[1, 0, 0],
self.xp_per_level = [[1, 0, 0],
[2, 1000, 1000],
[3, 2000, 3000],
[4, 3000, 6000],
Expand Down Expand Up @@ -149,9 +142,9 @@ def __init__(self, bot, config):
[37, 2000000, 9500000],
[38, 2500000, 12000000],
[39, 3000000, 15000000],
[40, 5000000, 20000000]]

[40, 5000000, 20000000]
]

def initialize(self):
pass

Expand All @@ -163,13 +156,13 @@ def work(self):
"""
if not self._should_display():
return WorkerResult.SUCCESS

player_stats = inventory.player().player_stats
line = self._get_stats_line(player_stats)
line = self._get_stats_line(self._get_stats(player_stats))
# If line is empty, it couldn't be generated.
if not line:
return WorkerResult.SUCCESS

if self.terminal_title:
self._update_title(line, _platform)

Expand All @@ -183,7 +176,7 @@ def _should_display(self):
:return: True if the stats should be displayed; otherwise, False.
:rtype: bool
"""
if not self.terminal_title and not self.terminal_log:
if not self.terminal_title and not self.terminal_log or not self.displayed_stats:
return False
return self.next_update is None or datetime.now() >= self.next_update

Expand Down Expand Up @@ -245,10 +238,9 @@ def _update_title(self, title, platform):
self.terminal_title = False

self._compute_next_update()

def _get_stats(self, player_stats):

global xp_per_level
""" Some data """
metrics = self.bot.metrics
metrics.capture_stats()
runtime = metrics.runtime()
Expand All @@ -257,18 +249,18 @@ def _get_stats(self, player_stats):
username = player_data.get('username', '?')
distance_travelled = metrics.distance_travelled()
current_level = int(player_stats.get('level', 0))
prev_level_xp = int(xp_per_level[current_level-1][2])
prev_level_xp = int(self.xp_per_level[current_level - 1][2])
next_level_xp = int(player_stats.get('next_level_xp', 0))
experience = player_stats.get('experience', 0)
experience = int(player_stats.get('experience', 0))
current_level_xp = experience - prev_level_xp
whole_level_xp = next_level_xp - prev_level_xp
level_completion_percentage = (current_level_xp * 100) / whole_level_xp
experience_per_hour = metrics.xp_per_hour()
level_completion_percentage = int((current_level_xp * 100) / whole_level_xp)
experience_per_hour = int(metrics.xp_per_hour())
xp_earned = metrics.xp_earned()
stops_visited = metrics.visits['latest'] - metrics.visits['start']
pokemon_encountered = metrics.num_encounters()
pokemon_caught = metrics.num_captures()
captures_per_hour = metrics.captures_per_hour()
captures_per_hour = int(metrics.captures_per_hour())
pokemon_released = metrics.releases
pokemon_evolved = metrics.num_evolutions()
pokemon_unseen = metrics.num_new_mons()
Expand All @@ -291,7 +283,7 @@ def _get_stats(self, player_stats):
'km_walked': distance_travelled,
'level': current_level,
'experience': experience,
'current_level_xp': whole_level_xp,
'current_level_xp': current_level_xp,
'whole_level_xp': whole_level_xp,
'level_completion_percentage': level_completion_percentage,
'xp_per_hour': experience_per_hour,
Expand Down Expand Up @@ -323,79 +315,40 @@ def _get_stats_line(self, player_stats):
# No player stats available, won't be able to gather all informations.
if player_stats is None:
return ''
# No stats to display, avoid any useless overhead.
if not self.displayed_stats:
return ''

global xp_per_level

# Gather stats values.
metrics = self.bot.metrics
metrics.capture_stats()
runtime = metrics.runtime()
login = self.bot.config.username
player_data = self.bot.player_data
username = player_data.get('username', '?')
distance_travelled = metrics.distance_travelled()
current_level = int(player_stats.get('level', 0))
prev_level_xp = int(xp_per_level[current_level-1][2])
next_level_xp = int(player_stats.get('next_level_xp', 0))
experience = int(player_stats.get('experience', 0))
current_level_xp = experience - prev_level_xp
whole_level_xp = next_level_xp - prev_level_xp
level_completion_percentage = int((current_level_xp * 100) / whole_level_xp)
experience_per_hour = int(metrics.xp_per_hour())
xp_earned = metrics.xp_earned()
stops_visited = metrics.visits['latest'] - metrics.visits['start']
pokemon_encountered = metrics.num_encounters()
pokemon_caught = metrics.num_captures()
captures_per_hour = int(metrics.captures_per_hour())
pokemon_released = metrics.releases
pokemon_evolved = metrics.num_evolutions()
pokemon_unseen = metrics.num_new_mons()
pokeballs_thrown = metrics.num_throws()
stardust_earned = metrics.earned_dust()
highest_cp_pokemon = metrics.highest_cp['desc']
if not highest_cp_pokemon:
highest_cp_pokemon = "None"
most_perfect_pokemon = metrics.most_perfect['desc']
if not most_perfect_pokemon:
most_perfect_pokemon = "None"
next_egg_hatching = metrics.next_hatching_km(0)
hatched_eggs = metrics.hatched_eggs(0)

# Create stats strings.
available_stats = {
'login': login,
'username': username,
'uptime': 'Uptime : {}'.format(runtime),
'km_walked': '{:,.2f}km walked'.format(distance_travelled),
'level': 'Level {}'.format(current_level),
'level_completion': '{:,} / {:,} XP ({}%)'.format(current_level_xp, whole_level_xp,
level_completion_percentage),
'level_stats': 'Level {} ({:,} / {:,}, {}%)'.format(current_level, current_level_xp,
whole_level_xp,
level_completion_percentage),
'xp_per_hour': '{:,} XP/h'.format(experience_per_hour),
'xp_earned': '+{:,} XP'.format(xp_earned),
'stops_visited': 'Visited {:,} stops'.format(stops_visited),
'pokemon_encountered': 'Encountered {:,} pokemon'.format(pokemon_encountered),
'pokemon_caught': 'Caught {:,} pokemon'.format(pokemon_caught),
'captures_per_hour': '{:,} pokemon/h'.format(captures_per_hour),
'pokemon_released': 'Released {:,} pokemon'.format(pokemon_released),
'pokemon_evolved': 'Evolved {:,} pokemon'.format(pokemon_evolved),
'pokemon_unseen': 'Encountered {} new pokemon'.format(pokemon_unseen),
'pokemon_stats': 'Encountered {:,} pokemon, {:,} caught, {:,} released, {:,} evolved, '
'{} never seen before'.format(pokemon_encountered, pokemon_caught,
pokemon_released, pokemon_evolved,
pokemon_unseen),
'pokeballs_thrown': 'Threw {:,} pokeballs'.format(pokeballs_thrown),
'stardust_earned': 'Earned {:,} Stardust'.format(stardust_earned),
'highest_cp_pokemon': 'Highest CP pokemon : {}'.format(highest_cp_pokemon),
'most_perfect_pokemon': 'Most perfect pokemon : {}'.format(most_perfect_pokemon),
'location': 'Location : ({}, {})'.format(self.bot.position[0], self.bot.position[1]),
'next_egg_hatching': 'Next egg hatches in : {:.2f} km'.format(float(next_egg_hatching)),
'hatched_eggs': 'Hatched {} eggs.'.format(hatched_eggs)
'login': player_stats['login'],
'username': player_stats['username'],
'uptime': 'Uptime : {}'.format(player_stats['uptime']),
'km_walked': '{:,.2f}km walked'.format(player_stats['km_walked']),
'level': 'Level {}'.format(player_stats['level']),
'level_completion': '{:,} / {:,} XP ({}%)'.format(
player_stats['current_level_xp'], player_stats['whole_level_xp'],
player_stats['level_completion_percentage']),
'level_stats': 'Level {} ({:,} / {:,}, {}%)'.format(
player_stats['level'], player_stats['current_level_xp'],
player_stats['whole_level_xp'], player_stats['level_completion_percentage']),
'xp_per_hour': '{:,} XP/h'.format(player_stats['xp_per_hour']),
'xp_earned': '+{:,} XP'.format(player_stats['xp_earned']),
'stops_visited': 'Visited {:,} stops'.format(player_stats['stops_visited']),
'pokemon_encountered': 'Encountered {:,} pokemon'.format(player_stats['pokemon_encountered']),
'pokemon_caught': 'Caught {:,} pokemon'.format(player_stats['pokemon_caught']),
'captures_per_hour': '{:,} pokemon/h'.format(player_stats['captures_per_hour']),
'pokemon_released': 'Released {:,} pokemon'.format(player_stats['pokemon_released']),
'pokemon_evolved': 'Evolved {:,} pokemon'.format(player_stats['pokemon_evolved']),
'pokemon_unseen': 'Encountered {} new pokemon'.format(player_stats['pokemon_unseen']),
'pokemon_stats': 'Encountered {:,} pokemon, {:,} caught, {:,} released, {:,} evolved, {} never seen before'.format(
player_stats['pokemon_encountered'], player_stats['pokemon_caught'],
player_stats['pokemon_released'], player_stats['pokemon_evolved'], player_stats['pokemon_unseen']
),
'pokeballs_thrown': 'Threw {:,} pokeballs'.format(player_stats['pokeballs_thrown']),
'stardust_earned': 'Earned {:,} Stardust'.format(player_stats['stardust_earned']),
'highest_cp_pokemon': 'Highest CP pokemon : {}'.format(player_stats['highest_cp_pokemon']),
'most_perfect_pokemon': 'Most perfect pokemon : {}'.format(player_stats['most_perfect_pokemon']),
'location': 'Location : ({}, {})'.format(*player_stats['location']),
'next_egg_hatching': 'Next egg hatches in : {:.2f} km'.format(player_stats['next_egg_hatching']),
'hatched_eggs': 'Hatched {} eggs.'.format(player_stats['hatched_eggs'])
}

def get_stat(stat):
Expand All @@ -416,4 +369,3 @@ def get_stat(stat):
line = ' | '.join(map(get_stat, self.displayed_stats))

return line

6 changes: 4 additions & 2 deletions tests/update_live_stats_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,15 +164,17 @@ def test_get_stats_line_player_stats_none(self):
self.assertEqual(line, '')

def test_get_stats_line_no_displayed_stats(self):
self.mock_metrics()

self.worker.displayed_stats = []
line = self.worker._get_stats_line(self.player_stats)
line = self.worker._get_stats_line(self.worker._get_stats(self.player_stats))

self.assertEqual(line, '')

def test_get_stats_line(self):
self.mock_metrics()

line = self.worker._get_stats_line(self.player_stats)
line = self.worker._get_stats_line(self.worker._get_stats(self.player_stats))
expected = 'Login | Username | Evolved 12 pokemon | Encountered 130 pokemon | ' \
'Uptime : 15:42:13 | Caught 120 pokemon | Visited 220 stops | ' \
'42.05km walked | Level 25 | Earned 24,069 Stardust | ' \
Expand Down

0 comments on commit 9a6ebfe

Please sign in to comment.