diff --git a/pokemongo_bot/__init__.py b/pokemongo_bot/__init__.py index 971f1ea0b6..de996f3df3 100644 --- a/pokemongo_bot/__init__.py +++ b/pokemongo_bot/__init__.py @@ -1247,6 +1247,8 @@ def heartbeat(self): 'level': badgelevel} ) human_behaviour.action_delay(3, 10) + + inventory.refresh_inventory() try: self.web_update_queue.put_nowait(True) # do this outside of thread every tick diff --git a/pokemongo_bot/cell_workers/incubate_eggs.py b/pokemongo_bot/cell_workers/incubate_eggs.py index 2bf147d5ab..5cc8e7f7e3 100644 --- a/pokemongo_bot/cell_workers/incubate_eggs.py +++ b/pokemongo_bot/cell_workers/incubate_eggs.py @@ -125,7 +125,6 @@ def _apply_incubators(self, available_eggs, available_incubators): def _check_inventory(self, lookup_ids=[]): inv = {} - response_dict = self.bot.api.get_inventory() matched_pokemon = [] temp_eggs = [] temp_used_incubators = [] @@ -134,7 +133,7 @@ def _check_inventory(self, lookup_ids=[]): inv = reduce( dict.__getitem__, ["responses", "GET_INVENTORY", "inventory_delta", "inventory_items"], - response_dict + inventory.jsonify_inventory() ) for inv_data in inv: inv_data = inv_data.get("inventory_item_data", {}) diff --git a/pokemongo_bot/cell_workers/update_live_stats.py b/pokemongo_bot/cell_workers/update_live_stats.py index 743e3b9f19..e6689e3e4c 100644 --- a/pokemongo_bot/cell_workers/update_live_stats.py +++ b/pokemongo_bot/cell_workers/update_live_stats.py @@ -10,6 +10,7 @@ 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 @@ -163,14 +164,12 @@ def work(self): if not self._should_display(): return WorkerResult.SUCCESS - player_stats = self._get_player_stats() + player_stats = inventory.player().player_stats line = self._get_stats_line(player_stats) # If line is empty, it couldn't be generated. if not line: return WorkerResult.SUCCESS - - self.update_web_stats(player_stats) - + if self.terminal_title: self._update_title(line, _platform) @@ -209,7 +208,7 @@ def _log_on_terminal(self, stats): formatted="{stats}", data={ 'stats': stats, - 'stats_raw': self._get_stats(self._get_player_stats()) + 'stats_raw': self._get_stats(inventory.player().player_stats) } ) self._compute_next_update() @@ -332,7 +331,6 @@ def _get_stats_line(self, player_stats): # Gather stats values. metrics = self.bot.metrics - metrics.capture_stats() runtime = metrics.runtime() login = self.bot.config.username player_data = self.bot.player_data @@ -417,39 +415,4 @@ def get_stat(stat): line = ' | '.join(map(get_stat, self.displayed_stats)) return line - - def _get_player_stats(self): - """ - Helper method parsing the bot inventory object and returning the player stats object. - :return: The player stats object. - :rtype: dict - """ - # TODO : find a better solution than calling the api - return self.bot.metrics.player_stats - - def update_web_stats(self,player_data): - web_inventory = os.path.join(_base_dir, "web", "inventory-%s.json" % self.bot.config.username) - - try: - with open(web_inventory, "r") as infile: - json_stats = json.load(infile) - except (IOError, ValueError): - # Unable to read json from web inventory - # File may be corrupt. Create a new one. - self.bot.logger.info('[x] Error while opening inventory file for read: %s' % e, 'red') - json_stats = [] - except: - raise FileIOException("Unexpected error loading information from json.") - - json_stats = [x for x in json_stats if not x.get("inventory_item_data", {}).get("player_stats", None)] - - json_stats.append({"inventory_item_data": {"player_stats": player_data}}) - - try: - with open(web_inventory, "w") as outfile: - json.dump(json_stats, outfile) - except (IOError, ValueError): - self.bot.logger.info('[x] Error while opening inventory file for write: %s' % e, 'red') - pass - except: - raise FileIOException("Unexpected error writing to {}".web_inventory) + \ No newline at end of file diff --git a/pokemongo_bot/cell_workers/update_web_inventory.py b/pokemongo_bot/cell_workers/update_web_inventory.py index 02b82128f3..34c5186981 100644 --- a/pokemongo_bot/cell_workers/update_web_inventory.py +++ b/pokemongo_bot/cell_workers/update_web_inventory.py @@ -1,5 +1,8 @@ +import json +import os from pokemongo_bot.base_task import BaseTask from pokemongo_bot import inventory +from pokemongo_bot.base_dir import _base_dir class UpdateWebInventory(BaseTask): @@ -9,4 +12,4 @@ def initialize(self): pass def work(self): - inventory.update_web_inventory() + inventory.update_web_inventory() \ No newline at end of file diff --git a/pokemongo_bot/inventory.py b/pokemongo_bot/inventory.py index 2a858b6c11..d4a2efc5f3 100644 --- a/pokemongo_bot/inventory.py +++ b/pokemongo_bot/inventory.py @@ -95,6 +95,7 @@ def __init__(self, bot, ttl=3): self.pokemons_captured = None self.poke_stop_visits = None self.last_lvl_up_reward = time.time() # ts of last lvl_up_reward api call + self.player_stats = None super(_BaseInventoryComponent, self).__init__() @property @@ -123,6 +124,9 @@ def exp(self, value): self._exp = value + def refresh(self,inventory): + self.player_stats = self.retrieve_data(inventory) + def parse(self, item): self.exp = item['experience'] self.level = item['level'] @@ -1170,7 +1174,7 @@ def __init__(self, bot): self.candy = Candies() self.items = Items() self.pokemons = Pokemons() - self.player = Player(bot=self.bot) # include inventory inside Player? + self.player = Player(self.bot) # include inventory inside Player? self.refresh() self.item_inventory_size = None self.pokemon_inventory_size = None @@ -1202,23 +1206,7 @@ def update_web_inventory(self): if not os.path.exists(web_inventory): self.init_inventory_outfile() - try: - with open(web_inventory, "r") as infile: - json_inventory = json.load(infile) - except (IOError, ValueError): - # Unable to read json from web inventory - # File may be corrupt. Create a new one. - self.bot.logger.info('[x] Error while opening inventory file for read: %s' % e, 'red') - json_inventory = [] - except: - raise FileIOException("Unexpected error reading from {}".web_inventory) - - json_inventory = [x for x in json_inventory if not x.get("inventory_item_data", {}).get("pokedex_entry", None)] - json_inventory = [x for x in json_inventory if not x.get("inventory_item_data", {}).get("candy", None)] - json_inventory = [x for x in json_inventory if not x.get("inventory_item_data", {}).get("item", None)] - json_inventory = [x for x in json_inventory if not x.get("inventory_item_data", {}).get("pokemon_data", None)] - - json_inventory = json_inventory + self.jsonify_inventory() + json_inventory = self.jsonify_inventory() try: with open(web_inventory, "w") as outfile: @@ -1231,7 +1219,9 @@ def update_web_inventory(self): def jsonify_inventory(self): json_inventory = [] - + + json_inventory.append({"inventory_item_data": {"player_stats": self.player.player_stats}}) + for pokedex in self.pokedex.all(): json_inventory.append({"inventory_item_data": {"pokedex_entry": pokedex}}) @@ -1344,7 +1334,9 @@ def refresh_inventory(data=None): """ _inventory.refresh(data) - +def jsonify_inventory(): + return _inventory.jsonify_inventory() + def update_web_inventory(): _inventory.update_web_inventory() diff --git a/pokemongo_bot/metrics.py b/pokemongo_bot/metrics.py index 147fbc9927..111dab9d26 100644 --- a/pokemongo_bot/metrics.py +++ b/pokemongo_bot/metrics.py @@ -1,6 +1,7 @@ import time from datetime import timedelta from pokemongo_bot.inventory import Pokemons, refresh_inventory +from pokemongo_bot import inventory class Metrics(object): @@ -26,7 +27,6 @@ def __init__(self, bot): self.uniq_pokemons_list = None self.player_stats = [] - self.inventory_data = [] def runtime(self): return timedelta(seconds=round(time.time() - self.start_time)) @@ -104,10 +104,9 @@ def capture_stats(self): except AttributeError: return - request.get_inventory() request.get_player() response_dict = request.call() - refresh_inventory(response_dict) + try: uniq_pokemon_list = set() @@ -115,7 +114,9 @@ def capture_stats(self): if self.dust['start'] < 0: self.dust['start'] = self.dust['latest'] - for item in response_dict['responses']['GET_INVENTORY']['inventory_delta']['inventory_items']: + inventory.refresh_inventory() + json_inventory = inventory.jsonify_inventory() + for item in json_inventory: if 'inventory_item_data' in item: if 'player_stats' in item['inventory_item_data']: playerdata = item['inventory_item_data']['player_stats']