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

Added nickname templating and associated worker #1850

Merged
merged 1 commit into from
Aug 1, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 6 additions & 0 deletions configs/config.json.cluster.example
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
{
"type": "CollectLevelUpReward"
},
{
"type": "NicknamePokemon",
"config": {
"nickname_template": "{iv_pct}_{iv_ads}"
}
},
{
"type": "IncubateEggs",
"config": {
Expand Down
6 changes: 6 additions & 0 deletions configs/config.json.example
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
{
"type": "CollectLevelUpReward"
},
{
"type": "NicknamePokemon",
"config": {
"nickname_template": "{iv_pct}_{iv_ads}"
}
},
{
"type": "IncubateEggs",
"config": {
Expand Down
6 changes: 6 additions & 0 deletions configs/config.json.path.example
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
{
"type": "CollectLevelUpReward"
},
{
"type": "NicknamePokemon",
"config": {
"nickname_template": "{iv_pct}_{iv_ads}"
}
},
{
"type": "IncubateEggs",
"config": {
Expand Down
6 changes: 6 additions & 0 deletions configs/config.json.pokemon.example
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
{
"type": "CollectLevelUpReward"
},
{
"type": "NicknamePokemon",
"config": {
"nickname_template": "{iv_pct}_{iv_ads}"
}
},
{
"type": "IncubateEggs",
"config": {
Expand Down
1 change: 1 addition & 0 deletions pokemongo_bot/cell_workers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from evolve_all import EvolveAll
from incubate_eggs import IncubateEggs
from move_to_fort import MoveToFort
from nickname_pokemon import NicknamePokemon
from pokemon_catch_worker import PokemonCatchWorker
from transfer_pokemon import TransferPokemon
from recycle_items import RecycleItems
Expand Down
10 changes: 4 additions & 6 deletions pokemongo_bot/cell_workers/incubate_eggs.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,15 +106,13 @@ def _check_inventory(self, lookup_ids=[]):
"used": False
})
elif 'is_egg' not in pokemon and pokemon['id'] in lookup_ids:
matched_pokemon.append({
"pokemon_id": pokemon.get('pokemon_id', -1),
"cp": pokemon.get('cp', 0),
matched_pokemon.append(pokemon.update({
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why does a PR that is adding a task for renaming pokemon need to modify the incubate eggs task?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was initially a change required for an earlier iteration of this to work (as it required that pokemon objects passed in maintained their standard keys). As you can see, instead of passing out an object with only a subset of keys, it maintains the original object and just appends new calculated data. I opted to leave it in because I feel this is still a better approach in case the egg incubation worker wants to utilize other keys in the pokemon object. At the very least, it doesn't break anything.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it isn't needed by this PR, can you undo these changes? It makes it much scarier to review and accept these PRs since it is hard to tell what the impact across the whole project is going to be. Keeping changes small and focused on a single worker makes our lives way easier. If we need these changes down the road, I'd feel more comfortable making them when it actually impacts something.

"iv": [
pokemon.get('individual_attack', 0),
pokemon.get('individual_defense', 0),
pokemon.get('individual_stamina', 0)
]
})
}))
continue
if "player_stats" in inv_data:
self.km_walked = inv_data.get("player_stats", {}).get("km_walked", 0)
Expand Down Expand Up @@ -147,7 +145,7 @@ def _hatch_eggs(self):
for pokemon in pokemon_data:
# pokemon ids seem to be offset by one
if pokemon['pokemon_id']!=-1:
pokemon['name'] = self.bot.pokemon_list[(pokemon['pokemon_id']-1)]['Name']
pokemon['name'] = self.bot.pokemon_list[(pokemon.get('pokemon_id')-1)]['Name']
else:
pokemon['name'] = "error"
except:
Expand All @@ -160,7 +158,7 @@ def _hatch_eggs(self):
for i in range(len(pokemon_data)):
logger.log("-"*30,log_color)
logger.log("[!] Pokemon: {}".format(pokemon_data[i]['name']), log_color)
logger.log("[!] CP: {}".format(pokemon_data[i]['cp']), log_color)
logger.log("[!] CP: {}".format(pokemon_data[i].get('cp',0)), log_color)
logger.log("[!] IV: {} ({:.2f})".format("/".join(map(str, pokemon_data[i]['iv'])),(sum(pokemon_data[i]['iv'])/self.max_iv)), log_color)
logger.log("[!] XP: {}".format(xp[i]), log_color)
logger.log("[!] Stardust: {}".format(stardust[i]), log_color)
Expand Down
88 changes: 88 additions & 0 deletions pokemongo_bot/cell_workers/nickname_pokemon.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
from pokemongo_bot import logger
from pokemongo_bot.human_behaviour import sleep
from pokemongo_bot.cell_workers.base_task import BaseTask

class NicknamePokemon(BaseTask):
def initialize(self):
self.template = self.config.get('nickname_template','').lower().strip()
if self.template == "{name}":
self.template = ""
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This might seem unintuitive, but setting the nickname to blank (like in the app) will actually revert the pokemon back to its original name. So, we set the template to blank to achieve this behavior when we anticipate that is what the user wants.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add this behaviour explanation as a comment in the code.


def work(self):
try:
inventory = reduce(dict.__getitem__, ["responses", "GET_INVENTORY", "inventory_delta", "inventory_items"], self.bot.get_inventory())
except KeyError:
pass
else:
pokemon_data = self._get_inventory_pokemon(inventory)
for pokemon in pokemon_data:
self._nickname_pokemon(pokemon)

def _get_inventory_pokemon(self,inventory_dict):
pokemon_data = []
for inv_data in inventory_dict:
try:
pokemon = reduce(dict.__getitem__,['inventory_item_data','pokemon_data'],inv_data)
except KeyError:
pass
else:
if not pokemon.get('is_egg',False):
pokemon_data.append(pokemon)
return pokemon_data

def _nickname_pokemon(self,pokemon):
"""This requies a pokemon object containing all the standard fields: id, ivs, cp, etc"""
new_name = ""
instance_id = pokemon.get('id',0)
if not instance_id:
logger.log("Pokemon instance id returned 0. Can't rename.",'red')
return
id = pokemon.get('pokemon_id',0)-1
name = self.bot.pokemon_list[id]['Name']
cp = pokemon.get('cp',0)
iv_attack = pokemon.get('individual_attack',0)
iv_defense = pokemon.get('individual_defense',0)
iv_stamina = pokemon.get('individual_stamina',0)
iv_list = [iv_attack,iv_defense,iv_stamina]
iv_ads = "/".join(map(str,iv_list))
iv_sum = sum(iv_list)
iv_pct = "{:0.0f}".format(100*iv_sum/45.0)
log_color = 'red'
try:
new_name = self.template.format(name=name,
id=id,
cp=cp,
iv_attack=iv_attack,
iv_defense=iv_defense,
iv_stamina=iv_stamina,
iv_ads=iv_ads,
iv_sum=iv_sum,
iv_pct=iv_pct)[:12]
except KeyError as bad_key:
logger.log("Unable to nickname {} due to bad template ({})".format(name,bad_key),log_color)
if pokemon.get('nickname', "") == new_name:
return
self.bot.api.nickname_pokemon(pokemon_id=instance_id,nickname=new_name)
response = self.bot.api.call()
sleep(1.2)
try:
result = reduce(dict.__getitem__, ["responses", "NICKNAME_POKEMON"], response)
except KeyError:
logger.log("Attempt to nickname received bad response from server.",log_color)
if self.bot.config.debug:
logger.log(response,log_color)
return
result = result['result']
if new_name == "":
new_name = name
output = {
0: 'Nickname unset',
1: 'Nickname set successfully! {} is now {}'.format(name,new_name),
2: 'Invalid nickname! ({})'.format(new_name),
3: 'Pokemon not found.',
4: 'Pokemon is egg'
}[result]
if result==1:
log_color='green'
pokemon['nickname'] = new_name
logger.log(output,log_color)
8 changes: 3 additions & 5 deletions pokemongo_bot/cell_workers/pokemon_catch_worker.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
# -*- coding: utf-8 -*-

import time

from pokemongo_bot import logger
from pokemongo_bot.human_behaviour import (normalized_reticle_size, sleep,
spin_modifier)


class PokemonCatchWorker(object):
BAG_FULL = 'bag_full'
NO_POKEBALLS = 'no_pokeballs'
Expand Down Expand Up @@ -52,9 +50,9 @@ def work(self):
individual_defense = pokemon_data.get("individual_defense", 0)

iv_display = '{}/{}/{}'.format(
individual_stamina,
individual_attack,
individual_defense
individual_defense,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like the changes to this file aren't relevant either

Copy link

@Philipp59 Philipp59 Aug 1, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

its a nice feature to resort the Bot ordering of IV from SAD to ADS so its in the same order like the renaming.
It would be quite irritating if a pokemon appears with 4/10/15 (SAD) and then its renamed in 10/15/4 (ADS).
Therefore why not change the order in general from SAD (why?) to a more logic on (ADS)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason that the renaming worker uses ADS format is because that is also used in the web UI. We're using this as an opportunity to make the pokemon catch worker output consistent with this format as well.

individual_stamina
)

pokemon_potential = self.pokemon_potential(pokemon_data)
Expand All @@ -63,7 +61,7 @@ def work(self):
logger.log('A Wild {} appeared! [CP {}] [Potential {}]'.format(
pokemon_name, cp, pokemon_potential), 'yellow')

logger.log('IV [Stamina/Attack/Defense] = [{}]'.format(iv_display))
logger.log('IV [Attack/Defense/Stamina] = [{}]'.format(iv_display))
pokemon_data['name'] = pokemon_name
# Simulate app
sleep(3)
Expand Down