Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduce API calls #4916

Merged
merged 33 commits into from
Aug 30, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
794a959
Fix bot crash at start on permaban
Gobberwart Aug 27, 2016
41403d3
Merge branch 'PokemonGoF/dev' into dev
Gobberwart Aug 27, 2016
e7ec70e
Merge branch 'PokemonGoF/dev' into dev
Gobberwart Aug 27, 2016
8df9aa7
Merge branch 'PokemonGoF/dev' into dev
Gobberwart Aug 27, 2016
041e5ff
Expanded logging options
Gobberwart Aug 27, 2016
bb844b9
Added warning about deprecated logging_color arg
Gobberwart Aug 27, 2016
0cf9655
Display log message moved
Gobberwart Aug 27, 2016
f88997d
Remove milliseconds from datetime
Gobberwart Aug 27, 2016
79708f2
Merge branch 'PokemonGoF/dev' into dev
Gobberwart Aug 28, 2016
bbe0dfe
Merge branch 'Pokemongof/dev' into dev
Gobberwart Aug 28, 2016
c9164a7
Reversed condition order for clarity
Gobberwart Aug 28, 2016
1ccde94
Documented new log options
Gobberwart Aug 28, 2016
33e1095
Modified conditions again
Gobberwart Aug 28, 2016
0624ba9
Merge branch 'pokemongof/dev' into dev
Gobberwart Aug 28, 2016
ed396aa
Merge branch 'pokemongof/dev' into dev
Gobberwart Aug 28, 2016
4c8e834
Merge branch 'Pokemongof/dev' into dev
Gobberwart Aug 28, 2016
fd40f7c
Add exception handling to json file read/write ops
Gobberwart Aug 28, 2016
f0ce3ca
Removed API call in update live stats
Gobberwart Aug 29, 2016
d4c3efb
Update player data in web from metrics
Gobberwart Aug 29, 2016
7fea872
Implemented more granularity in the "alert_catch" parameter for Telegram
DBa2016 Aug 28, 2016
ab9fce6
Incubate eggs fix (#4881)
DeXtroTip Aug 29, 2016
8ebbbe8
add some sanitycheck (#4891)
rawgni Aug 29, 2016
028f396
execute setup.sh -u if there is a need to (#4870)
rawgni Aug 29, 2016
7d281ba
Add PokemonGo bot version to docker image (#4886)
walkerlee Aug 29, 2016
a18b3e2
Call level_up_rewards on exp changes/Some pep-8 (#4896)
sohje Aug 29, 2016
0094918
Improvements to evolve + config md updates (#4900)
mjmadsen Aug 29, 2016
5a70730
Refactoring to share inventory and reduce api calls
Gobberwart Aug 30, 2016
3dc16f5
Remove import of UpdateWebPlayerdata
Gobberwart Aug 30, 2016
93ba994
Merge branch 'pokemongof/dev' into dev-playerdata
Gobberwart Aug 30, 2016
1df89b4
Fixed conflict
Gobberwart Aug 30, 2016
8b6cba7
Import inventory added to metrics
Gobberwart Aug 30, 2016
45cae64
Removed api call from incubate_eggs
Gobberwart Aug 30, 2016
ff4339b
Merge branch 'dev' into dev-playerdata
Gobberwart Aug 30, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pokemongo_bot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 1 addition & 2 deletions pokemongo_bot/cell_workers/incubate_eggs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand All @@ -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", {})
Expand Down
47 changes: 5 additions & 42 deletions pokemongo_bot/cell_workers/update_live_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)

5 changes: 4 additions & 1 deletion pokemongo_bot/cell_workers/update_web_inventory.py
Original file line number Diff line number Diff line change
@@ -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):
Expand All @@ -9,4 +12,4 @@ def initialize(self):
pass

def work(self):
inventory.update_web_inventory()
inventory.update_web_inventory()
32 changes: 12 additions & 20 deletions pokemongo_bot/inventory.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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']
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -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}})

Expand Down Expand Up @@ -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()

Expand Down
9 changes: 5 additions & 4 deletions pokemongo_bot/metrics.py
Original file line number Diff line number Diff line change
@@ -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):

Expand All @@ -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))
Expand Down Expand Up @@ -104,18 +104,19 @@ 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()

self.dust['latest'] = response_dict['responses']['GET_PLAYER']['player_data']['currencies'][1]['amount']
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']
Expand Down