From c49f1ccfed98d3f862e2f04cc157833912fabf68 Mon Sep 17 00:00:00 2001 From: Gobberwart Date: Mon, 22 Aug 2016 10:52:55 +1000 Subject: [PATCH 1/9] Recycle Items schedule/force - Added ability to schedule a forced item recycle regardless of min_empty_space setting. Allows individual items to be recycled based on "keep" settings, even when bag is not nearing capacity. - Added inventory refresh to bot tick (__init.py__) to ensure web displays information correctly. --- configs/config.json.example | 5 +- configs/config.json.path.example | 5 +- pokemongo_bot/__init__.py | 10 ++ pokemongo_bot/cell_workers/recycle_items.py | 94 ++++++++++++++++--- .../event_handlers/colored_logging_handler.py | 2 + 5 files changed, 102 insertions(+), 14 deletions(-) diff --git a/configs/config.json.example b/configs/config.json.example index 5a2a7b7a83..23a9cf4b9a 100644 --- a/configs/config.json.example +++ b/configs/config.json.example @@ -111,7 +111,10 @@ "Razz Berry": { "keep" : 100 } }, "recycle_wait_min": 1, - "recycle_wait_max": 4 + "recycle_wait_max": 4, + "recycle_force": true, + "recycle_force_min": "00:00:00", + "recycle_force_max": "00:01:00" } }, { diff --git a/configs/config.json.path.example b/configs/config.json.path.example index 7612b5a264..0dbc0447ca 100644 --- a/configs/config.json.path.example +++ b/configs/config.json.path.example @@ -101,7 +101,10 @@ "Razz Berry": { "keep" : 100 } }, "recycle_wait_min": 1, - "recycle_wait_max": 4 + "recycle_wait_max": 4, + "recycle_force": true, + "recycle_force_min": "00:00:00", + "recycle_force_max": "00:01:00" } }, { diff --git a/pokemongo_bot/__init__.py b/pokemongo_bot/__init__.py index bd0a5ea102..ff8078635a 100644 --- a/pokemongo_bot/__init__.py +++ b/pokemongo_bot/__init__.py @@ -200,6 +200,15 @@ def _register_events(self): ) ) + # recycle stuff + self.event_manager.register_event( + 'next_force_recycle', + parameters=( + 'time' + ) + ) + self.event_manager.register_event('force_recycle') + # fort stuff self.event_manager.register_event( 'spun_fort', @@ -523,6 +532,7 @@ def _register_events(self): def tick(self): self.health_record.heartbeat() self.cell = self.get_meta_cell() + inventory.refresh_inventory() now = time.time() * 1000 diff --git a/pokemongo_bot/cell_workers/recycle_items.py b/pokemongo_bot/cell_workers/recycle_items.py index 1ca8bde91b..b3e1273045 100644 --- a/pokemongo_bot/cell_workers/recycle_items.py +++ b/pokemongo_bot/cell_workers/recycle_items.py @@ -8,6 +8,9 @@ from pokemongo_bot.services.item_recycle_worker import ItemRecycler from pokemongo_bot.tree_config_builder import ConfigException from pokemongo_bot.worker_result import WorkerResult +from random import uniform +from datetime import datetime as dt, timedelta + DEFAULT_MIN_EMPTY_SPACE = 6 @@ -54,7 +57,56 @@ def initialize(self): self.max_revives_keep = self.config.get('max_revives_keep', None) self.recycle_wait_min = self.config.get('recycle_wait_min', 1) self.recycle_wait_max = self.config.get('recycle_wait_max', 4) + self.recycle_force = self.config.get('recycle_force', False) + self.recycle_force_min = self.config.get('recycle_force_min', '00:01:00') + self.recycle_force_max = self.config.get('recycle_force_max', '00:10:00') + self.minInterval = self.getSeconds(self.recycle_force_min) + self.maxInterval = self.getSeconds(self.recycle_force_max) self._validate_item_filter() + + if self.recycle_force: + self._schedule_next_force() + + def getSeconds(self, strTime): + ''' + Return the duration in seconds of a time string + :param strTime: string time of format %H:%M:%S + ''' + try: + x = dt.strptime(strTime, '%H:%M:%S') + seconds = int(timedelta(hours=x.hour,minutes=x.minute,seconds=x.second).total_seconds()) + except ValueError: + seconds = 0; + + if seconds < 0: + seconds = 0; + + return seconds + + def _schedule_next_force(self): + ''' + Schedule the time aof the next forced recycle. + ''' + self._next_force = self._get_next_force_schedule() + self.emit_event( + 'next_force_recycle', + formatted="Next forced item recycle at {time}", + data={ + 'time': str(self._next_force.strftime("%H:%M:%S")) + } + ) + + def _should_force_now(self): + if dt.now() >= self._next_force: + return True + + return False + + def _get_next_force_schedule(self): + now = dt.now() + next_time = now + timedelta(seconds=int(uniform(self.minInterval, self.maxInterval))) + + return next_time def _validate_item_filter(self): """ @@ -77,6 +129,15 @@ def should_run(self): :return: True if the recycling process should be run; otherwise, False. :rtype: bool """ + + if self.recycle_force and self._should_force_now(): + self.emit_event( + 'force_recycle', + formatted="Forcing item recycle based on schedule" + ) + self._schedule_next_force() + return True + if inventory.Items.get_space_left() <= (DEFAULT_MIN_EMPTY_SPACE if self.min_empty_space is None else self.min_empty_space): return True return False @@ -91,25 +152,34 @@ def work(self): worker_result = WorkerResult.SUCCESS if self.should_run(): - if not (self.max_balls_keep is None): - worker_result = self.recycle_excess_category_max(self.max_balls_keep, [1,2,3,4]) - if not (self.max_potions_keep is None): - worker_result = self.recycle_excess_category_max(self.max_potions_keep, [101,102,103,104]) - if not (self.max_berries_keep is None): - worker_result = self.recycle_excess_category_max(self.max_berries_keep, [701,702,703,704,705]) - if not (self.max_revives_keep is None): - worker_result = self.recycle_excess_category_max(self.max_revives_keep, [201,202]) - - inventory.refresh_inventory() - for item_in_inventory in inventory.items().all(): - if self.item_should_be_recycled(item_in_inventory): # Make the bot appears more human action_delay(self.recycle_wait_min, self.recycle_wait_max) # If at any recycling process call we got an error, we consider that the result of this task is error too. if ItemRecycler(self.bot, item_in_inventory, self.get_amount_to_recycle(item_in_inventory)).work() == WorkerResult.ERROR: worker_result = WorkerResult.ERROR + + if not (self.max_balls_keep is None): + this_worker_result = self.recycle_excess_category_max(self.max_balls_keep, [1,2,3,4]) + if this_worker_result <> WorkerResult.SUCCESS: + worker_result = this_worker_result + + if not (self.max_potions_keep is None): + this_worker_result = self.recycle_excess_category_max(self.max_potions_keep, [101,102,103,104]) + if this_worker_result <> WorkerResult.SUCCESS: + worker_result = this_worker_result + + if not (self.max_berries_keep is None): + this_worker_result = self.recycle_excess_category_max(self.max_berries_keep, [701,702,703,704,705]) + if this_worker_result <> WorkerResult.SUCCESS: + worker_result = this_worker_result + + if not (self.max_revives_keep is None): + this_worker_result = self.recycle_excess_category_max(self.max_revives_keep, [201,202]) + if this_worker_result <> WorkerResult.SUCCESS: + worker_result = this_worker_result + return worker_result def recycle_excess_category_max(self, category_max, category_items_list): diff --git a/pokemongo_bot/event_handlers/colored_logging_handler.py b/pokemongo_bot/event_handlers/colored_logging_handler.py index 0bdff6d2b8..39034f5e91 100644 --- a/pokemongo_bot/event_handlers/colored_logging_handler.py +++ b/pokemongo_bot/event_handlers/colored_logging_handler.py @@ -23,6 +23,8 @@ class ColoredLoggingHandler(EventHandler): 'inventory_full': 'yellow', 'item_discard_fail': 'red', 'item_discarded': 'green', + 'next_force_recycle': 'green', + 'force_recycle': 'green', 'keep_best_release': 'green', 'level_up': 'green', 'level_up_reward': 'green', From 80acac7f24b3cbc71c2f6dd77aff009df47b4976 Mon Sep 17 00:00:00 2001 From: Gobberwart Date: Mon, 22 Aug 2016 11:27:08 +1000 Subject: [PATCH 2/9] Updated docs/configs Updated documentation and example config files to show new RecycleItems options. --- configs/config.json.cluster.example | 5 ++++- configs/config.json.map.example | 5 ++++- configs/config.json.optimizer.example | 5 ++++- configs/config.json.pokemon.example | 5 ++++- docs/configuration_files.md | 4 ++++ 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/configs/config.json.cluster.example b/configs/config.json.cluster.example index 604f4d7b36..215016f4e7 100644 --- a/configs/config.json.cluster.example +++ b/configs/config.json.cluster.example @@ -101,7 +101,10 @@ "Razz Berry": { "keep" : 100 } }, "recycle_wait_min": 1, - "recycle_wait_max": 4 + "recycle_wait_max": 4, + "recycle_force": true, + "recycle_force_min": "00:00:00", + "recycle_force_max": "00:01:00" } }, { diff --git a/configs/config.json.map.example b/configs/config.json.map.example index dab997683c..18f6f96efe 100644 --- a/configs/config.json.map.example +++ b/configs/config.json.map.example @@ -101,7 +101,10 @@ "Razz Berry": { "keep" : 100 } }, "recycle_wait_min": 1, - "recycle_wait_max": 4 + "recycle_wait_max": 4, + "recycle_force": true, + "recycle_force_min": "00:00:00", + "recycle_force_max": "00:01:00" } }, { diff --git a/configs/config.json.optimizer.example b/configs/config.json.optimizer.example index dfc84f97b4..c0c52cbf3c 100644 --- a/configs/config.json.optimizer.example +++ b/configs/config.json.optimizer.example @@ -166,7 +166,10 @@ "Razz Berry": { "keep" : 100 } }, "recycle_wait_min": 1, - "recycle_wait_max": 4 + "recycle_wait_max": 4, + "recycle_force": true, + "recycle_force_min": "00:00:00", + "recycle_force_max": "00:01:00" } }, { diff --git a/configs/config.json.pokemon.example b/configs/config.json.pokemon.example index 306893bc0b..9b7557b69c 100644 --- a/configs/config.json.pokemon.example +++ b/configs/config.json.pokemon.example @@ -101,7 +101,10 @@ "Razz Berry": { "keep" : 100 } }, "recycle_wait_min": 1, - "recycle_wait_max": 4 + "recycle_wait_max": 4, + "recycle_force": true, + "recycle_force_min": "00:00:00", + "recycle_force_max": "00:01:00" } }, { diff --git a/docs/configuration_files.md b/docs/configuration_files.md index ce78989185..c8ce06e0fa 100644 --- a/docs/configuration_files.md +++ b/docs/configuration_files.md @@ -55,6 +55,10 @@ The behaviors of the bot are configured via the `tasks` key in the `config.json` * `max_potions_keep`: Default `None` | Maximum amount of potions to keep in inventory * `max_berries_keep`: Default `None` | Maximum amount of berries to keep in inventory * `max_revives_keep`: Default `None` | Maximum amount of revives to keep in inventory + * `recycle_force`: Default `False` | Force scheduled recycle, even if min_empty_space not exceeded + * `recycle_force_min`: Default `00:01:00` | Minimum time to wait before scheduling next forced recycle + * `recycle_force_max`: Default `00:10:00` | Maximum time to wait before scheduling next forced recycle + * SpinFort * TransferPokemon * `min_free_slot`: Default `5` | Once the pokebag has less empty slots than this amount, the transfer process is triggered. | Big values (i.e 9999) will trigger the transfer process after each catch. From bc58625830001e3aeb3d27f3147c2821c56a541c Mon Sep 17 00:00:00 2001 From: Gobberwart Date: Tue, 23 Aug 2016 08:49:45 +1000 Subject: [PATCH 3/9] Update web inventory from cache Added "update web inventory" to inventory.py which dumps json to web/inventory-USERNAME.json from the cached inventory instead of calling api. Runs every tick to ensure values are as up-to-date as possible. --- pokemongo_bot/__init__.py | 2 +- pokemongo_bot/inventory.py | 30 ++++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/pokemongo_bot/__init__.py b/pokemongo_bot/__init__.py index b18a46a569..7963bd8cb3 100644 --- a/pokemongo_bot/__init__.py +++ b/pokemongo_bot/__init__.py @@ -556,7 +556,7 @@ def _register_events(self): def tick(self): self.health_record.heartbeat() self.cell = self.get_meta_cell() - inventory.refresh_inventory() + inventory.update_web_inventory() now = time.time() * 1000 diff --git a/pokemongo_bot/inventory.py b/pokemongo_bot/inventory.py index 26e4e239e7..10781d7bc9 100644 --- a/pokemongo_bot/inventory.py +++ b/pokemongo_bot/inventory.py @@ -1092,13 +1092,28 @@ def refresh(self): inventory = inventory['responses']['GET_INVENTORY']['inventory_delta']['inventory_items'] for i in (self.pokedex, self.candy, self.items, self.pokemons): i.refresh(inventory) + + self.update_web_inventory() - user_web_inventory = os.path.join(_base_dir, 'web', 'inventory-%s.json' % (self.bot.config.username)) - try: - with open(user_web_inventory, 'w') as outfile: - json.dump(inventory, outfile) - except IOError as e: - errmsg = '[x] Error while opening location file: user_web_inventory' + + def update_web_inventory(self): + web_inventory = os.path.join(_base_dir, "web", "inventory-%s.json" % self.bot.config.username) + json_inventory = [] + + for pokedex in self.pokedex.all(): + json_inventory.append({"inventory_item_data": {"pokedex_entry": pokedex}}) + + for family_id, candy in self.candy._data.items(): + json_inventory.append({"inventory_item_data": {"candy": {"family_id": family_id, "candy": candy.quantity}}}) + + for item_id, item in self.items._data.items(): + json_inventory.append({"inventory_item_data": {"item": {"item_id": item_id, "count": item.count}}}) + + for pokemon in self.pokemons.all(): + json_inventory.append({"inventory_item_data": {"pokemon_data": pokemon._data}}) + + with open(web_inventory, "w") as outfile: + json.dump(json_inventory, outfile) def retrieve_inventories_size(self): """ @@ -1197,6 +1212,9 @@ def refresh_inventory(): :rtype: None """ _inventory.refresh() + +def update_web_inventory(): + _inventory.update_web_inventory() def get_item_inventory_size(): """ From 62a5ad085c00e6efff357a57764a99746d41dfed Mon Sep 17 00:00:00 2001 From: Gobberwart Date: Tue, 23 Aug 2016 09:43:12 +1000 Subject: [PATCH 4/9] Updated comments to include new config settings Updated the comment block at the top of the file to explain/show new settings --- pokemongo_bot/cell_workers/recycle_items.py | 27 ++++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/pokemongo_bot/cell_workers/recycle_items.py b/pokemongo_bot/cell_workers/recycle_items.py index b3e1273045..922d8744e1 100644 --- a/pokemongo_bot/cell_workers/recycle_items.py +++ b/pokemongo_bot/cell_workers/recycle_items.py @@ -18,6 +18,9 @@ class RecycleItems(BaseTask): """ Recycle undesired items if there is less than five space in inventory. You can use either item's name or id. For the full list of items see ../../data/items.json + + Can also force a recycle to occur at a pseudo-random time between recycle_force_min and + recycle_force_max minutes. It's highly recommended to put this task before move_to_fort and spin_fort task in the config file so you'll most likely be able to loot. @@ -41,8 +44,14 @@ class RecycleItems(BaseTask): "Revive": {"keep": 0}, "Max Revive": {"keep": 20}, "Razz Berry": {"keep": 20} - } + }, + "recycle_wait_min": 1, + "recycle_wait_max": 4, + "recycle_force": true, + "recycle_force_min": "00:00:00", + "recycle_force_max": "00:01:00" } + } """ SUPPORTED_TASK_API_VERSION = 1 @@ -152,14 +161,6 @@ def work(self): worker_result = WorkerResult.SUCCESS if self.should_run(): - for item_in_inventory in inventory.items().all(): - if self.item_should_be_recycled(item_in_inventory): - # Make the bot appears more human - action_delay(self.recycle_wait_min, self.recycle_wait_max) - # If at any recycling process call we got an error, we consider that the result of this task is error too. - if ItemRecycler(self.bot, item_in_inventory, self.get_amount_to_recycle(item_in_inventory)).work() == WorkerResult.ERROR: - worker_result = WorkerResult.ERROR - if not (self.max_balls_keep is None): this_worker_result = self.recycle_excess_category_max(self.max_balls_keep, [1,2,3,4]) if this_worker_result <> WorkerResult.SUCCESS: @@ -179,6 +180,14 @@ def work(self): this_worker_result = self.recycle_excess_category_max(self.max_revives_keep, [201,202]) if this_worker_result <> WorkerResult.SUCCESS: worker_result = this_worker_result + + for item_in_inventory in inventory.items().all(): + if self.item_should_be_recycled(item_in_inventory): + # Make the bot appears more human + action_delay(self.recycle_wait_min, self.recycle_wait_max) + # If at any recycling process call we got an error, we consider that the result of this task is error too. + if ItemRecycler(self.bot, item_in_inventory, self.get_amount_to_recycle(item_in_inventory)).work() == WorkerResult.ERROR: + worker_result = WorkerResult.ERROR return worker_result From 2a9f345570a2fccab2d34d73395744a4ca941bf3 Mon Sep 17 00:00:00 2001 From: Gobberwart Date: Tue, 23 Aug 2016 11:38:57 +1000 Subject: [PATCH 5/9] Added player stats to web output Previous commit missed player stats. Fixed. --- pokemongo_bot/inventory.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pokemongo_bot/inventory.py b/pokemongo_bot/inventory.py index 10781d7bc9..e20fa3ad5d 100644 --- a/pokemongo_bot/inventory.py +++ b/pokemongo_bot/inventory.py @@ -1100,6 +1100,18 @@ def update_web_inventory(self): web_inventory = os.path.join(_base_dir, "web", "inventory-%s.json" % self.bot.config.username) json_inventory = [] + inventory_items = self.bot.api.get_inventory() \ + .get('responses', {}) \ + .get('GET_INVENTORY', {}) \ + .get('inventory_delta', {}) \ + .get('inventory_items', {}) + player_data = next((x["inventory_item_data"]["player_stats"] + for x in inventory_items + if x.get("inventory_item_data", {}).get("player_stats", {})), + None) + for player_stat in player_data: + json_inventory.append({"inventory_item_data": {"player_stats": player_data}}) + for pokedex in self.pokedex.all(): json_inventory.append({"inventory_item_data": {"pokedex_entry": pokedex}}) From 32f0c5d2969debd2b0b2ba1ebaa0ca6eec49fa0c Mon Sep 17 00:00:00 2001 From: Gobberwart Date: Tue, 23 Aug 2016 18:32:16 +1000 Subject: [PATCH 6/9] Removed api call for player_stats Removed api call for player_stats, and moved output of player_stats to web to update_live_stats.py --- .../cell_workers/update_live_stats.py | 25 +++++++++++++++++-- pokemongo_bot/inventory.py | 21 ++++++---------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/pokemongo_bot/cell_workers/update_live_stats.py b/pokemongo_bot/cell_workers/update_live_stats.py index f7ae1877e6..5b412cba4d 100644 --- a/pokemongo_bot/cell_workers/update_live_stats.py +++ b/pokemongo_bot/cell_workers/update_live_stats.py @@ -1,10 +1,13 @@ import ctypes +import json +import os 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 class UpdateLiveStats(BaseTask): @@ -92,11 +95,15 @@ def work(self): """ if not self._should_display(): return WorkerResult.SUCCESS - line = self._get_stats_line(self._get_player_stats()) + + player_stats = self._get_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) @@ -356,3 +363,17 @@ def _get_player_stats(self): for x in inventory_items if x.get("inventory_item_data", {}).get("player_stats", {})), None) + + def update_web_stats(self,player_data): + web_inventory = os.path.join(_base_dir, "web", "inventory-%s.json" % self.bot.config.username) + + with open(web_inventory, "r") as infile: + json_stats = json.load(infile) + + json_stats = [x for x in json_stats if not x.get("inventory_item_data", {}).get("player_stats", None)] + + for player_stat in player_data: + json_stats.append({"inventory_item_data": {"player_stats": player_data}}) + + with open(web_inventory, "w") as outfile: + json.dump(json_stats, outfile) diff --git a/pokemongo_bot/inventory.py b/pokemongo_bot/inventory.py index e20fa3ad5d..7a7c341fb1 100644 --- a/pokemongo_bot/inventory.py +++ b/pokemongo_bot/inventory.py @@ -1098,20 +1098,15 @@ def refresh(self): def update_web_inventory(self): web_inventory = os.path.join(_base_dir, "web", "inventory-%s.json" % self.bot.config.username) - json_inventory = [] + + with open(web_inventory, "r") as infile: + json_inventory = json.load(infile) + + 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)] - inventory_items = self.bot.api.get_inventory() \ - .get('responses', {}) \ - .get('GET_INVENTORY', {}) \ - .get('inventory_delta', {}) \ - .get('inventory_items', {}) - player_data = next((x["inventory_item_data"]["player_stats"] - for x in inventory_items - if x.get("inventory_item_data", {}).get("player_stats", {})), - None) - for player_stat in player_data: - json_inventory.append({"inventory_item_data": {"player_stats": player_data}}) - for pokedex in self.pokedex.all(): json_inventory.append({"inventory_item_data": {"pokedex_entry": pokedex}}) From b8bb2d152d6bfa765ff224e40ca8c37c61fdb8af Mon Sep 17 00:00:00 2001 From: Gobberwart Date: Tue, 23 Aug 2016 18:59:45 +1000 Subject: [PATCH 7/9] Slight logic error Correct error that would result in player_data being written multiple times. Something in the bot is still doing that somewhere, but definitely not in this new code. --- pokemongo_bot/cell_workers/update_live_stats.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pokemongo_bot/cell_workers/update_live_stats.py b/pokemongo_bot/cell_workers/update_live_stats.py index 5b412cba4d..13dd8576cf 100644 --- a/pokemongo_bot/cell_workers/update_live_stats.py +++ b/pokemongo_bot/cell_workers/update_live_stats.py @@ -371,9 +371,8 @@ def update_web_stats(self,player_data): json_stats = json.load(infile) json_stats = [x for x in json_stats if not x.get("inventory_item_data", {}).get("player_stats", None)] - - for player_stat in player_data: - json_stats.append({"inventory_item_data": {"player_stats": player_data}}) + + json_stats.append({"inventory_item_data": {"player_stats": player_data}}) with open(web_inventory, "w") as outfile: json.dump(json_stats, outfile) From 57896adefeabd82191cecc32b7e3ed617ed482ba Mon Sep 17 00:00:00 2001 From: Gobberwart Date: Wed, 24 Aug 2016 09:36:45 +1000 Subject: [PATCH 8/9] Added cell_worker for inventory update Removed update_web_inventory from init.py and created a new worker UpdateLiveInventory in light of feeback from solderzzc. --- configs/config.json.cluster.example | 5 +++++ configs/config.json.example | 5 +++++ configs/config.json.map.example | 5 +++++ configs/config.json.optimizer.example | 5 +++++ configs/config.json.path.example | 5 +++++ configs/config.json.pokemon.example | 5 +++++ pokemongo_bot/__init__.py | 1 - pokemongo_bot/cell_workers/__init__.py | 3 ++- pokemongo_bot/cell_workers/update_web_inventory.py | 12 ++++++++++++ 9 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 pokemongo_bot/cell_workers/update_web_inventory.py diff --git a/configs/config.json.cluster.example b/configs/config.json.cluster.example index 9e80050c2d..3e4ada0e23 100644 --- a/configs/config.json.cluster.example +++ b/configs/config.json.cluster.example @@ -143,6 +143,11 @@ "spin_wait_max": 5 } }, + { "type": "UpdateWebInventory", + "config": { + "enabled": true + } + }, { "type": "FollowCluster", "config": { diff --git a/configs/config.json.example b/configs/config.json.example index 9cdb09fa79..6e9264594d 100644 --- a/configs/config.json.example +++ b/configs/config.json.example @@ -157,6 +157,11 @@ "spin_wait_max": 5 } }, + { "type": "UpdateWebInventory", + "config": { + "enabled": true + } + }, { "type": "MoveToFort", "config": { diff --git a/configs/config.json.map.example b/configs/config.json.map.example index 1c4d2e9aa0..d3135db055 100644 --- a/configs/config.json.map.example +++ b/configs/config.json.map.example @@ -143,6 +143,11 @@ "spin_wait_max": 5 } }, + { "type": "UpdateWebInventory", + "config": { + "enabled": true + } + }, { "type": "MoveToMapPokemon", "config": { diff --git a/configs/config.json.optimizer.example b/configs/config.json.optimizer.example index f15ea77db6..db20d35ce0 100644 --- a/configs/config.json.optimizer.example +++ b/configs/config.json.optimizer.example @@ -207,6 +207,11 @@ "spin_wait_max": 5 } }, + { "type": "UpdateWebInventory", + "config": { + "enabled": true + } + }, { "type": "MoveToFort", "config": { diff --git a/configs/config.json.path.example b/configs/config.json.path.example index 41e01eb85d..c0fd9e0ba3 100644 --- a/configs/config.json.path.example +++ b/configs/config.json.path.example @@ -143,6 +143,11 @@ "spin_wait_max": 5 } }, + { "type": "UpdateWebInventory", + "config": { + "enabled": true + } + }, { "type": "FollowPath", "config": { diff --git a/configs/config.json.pokemon.example b/configs/config.json.pokemon.example index b84d130bda..75268c2b0a 100644 --- a/configs/config.json.pokemon.example +++ b/configs/config.json.pokemon.example @@ -143,6 +143,11 @@ "spin_wait_max": 5 } }, + { "type": "UpdateWebInventory", + "config": { + "enabled": true + } + }, { "type": "MoveToFort", "config":{ diff --git a/pokemongo_bot/__init__.py b/pokemongo_bot/__init__.py index a262800367..0a17c8fcf9 100644 --- a/pokemongo_bot/__init__.py +++ b/pokemongo_bot/__init__.py @@ -557,7 +557,6 @@ def _register_events(self): def tick(self): self.health_record.heartbeat() self.cell = self.get_meta_cell() - inventory.update_web_inventory() now = time.time() * 1000 diff --git a/pokemongo_bot/cell_workers/__init__.py b/pokemongo_bot/cell_workers/__init__.py index 66df050917..a8175956fd 100644 --- a/pokemongo_bot/cell_workers/__init__.py +++ b/pokemongo_bot/cell_workers/__init__.py @@ -22,4 +22,5 @@ from update_live_inventory import UpdateLiveInventory from catch_pokemon import CatchPokemon from complete_tutorial import CompleteTutorial -from random_pause import RandomPause \ No newline at end of file +from random_pause import RandomPause +from update_web_inventory import UpdateWebInventory diff --git a/pokemongo_bot/cell_workers/update_web_inventory.py b/pokemongo_bot/cell_workers/update_web_inventory.py new file mode 100644 index 0000000000..02b82128f3 --- /dev/null +++ b/pokemongo_bot/cell_workers/update_web_inventory.py @@ -0,0 +1,12 @@ +from pokemongo_bot.base_task import BaseTask +from pokemongo_bot import inventory + + +class UpdateWebInventory(BaseTask): + SUPPORTED_TASK_API_VERSION = 1 + + def initialize(self): + pass + + def work(self): + inventory.update_web_inventory() From 7d561a97facbcc0cbd795de86b35529a0332670c Mon Sep 17 00:00:00 2001 From: Gobberwart Date: Wed, 24 Aug 2016 09:37:19 +1000 Subject: [PATCH 9/9] Separated update_web_inventory from jsonify_inventory As per feedback from @BriceSD --- pokemongo_bot/inventory.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pokemongo_bot/inventory.py b/pokemongo_bot/inventory.py index 7a7c341fb1..0577b65e20 100644 --- a/pokemongo_bot/inventory.py +++ b/pokemongo_bot/inventory.py @@ -1107,6 +1107,14 @@ def update_web_inventory(self): 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() + + with open(web_inventory, "w") as outfile: + json.dump(json_inventory, outfile) + + def jsonify_inventory(self): + json_inventory = [] + for pokedex in self.pokedex.all(): json_inventory.append({"inventory_item_data": {"pokedex_entry": pokedex}}) @@ -1118,10 +1126,9 @@ def update_web_inventory(self): for pokemon in self.pokemons.all(): json_inventory.append({"inventory_item_data": {"pokemon_data": pokemon._data}}) - - with open(web_inventory, "w") as outfile: - json.dump(json_inventory, outfile) - + + return json_inventory + def retrieve_inventories_size(self): """ Retrieves the item inventory size