def upgrade_pokemon(self, pokemon): level = int(pokemon.level * 2) - 1 candy = inventory.candies().get(pokemon.pokemon_id) for i in range(level, 80): upgrade_cost = self.pokemon_upgrade_cost[i - 1] upgrade_candy_cost = upgrade_cost[0] upgrade_stardust_cost = upgrade_cost[1] if self.config_upgrade and (not self.bot.config.test): response_dict = self.bot.api.upgrade_pokemon( pokemon_id=pokemon.unique_id) else: response_dict = { "responses": { "UPGRADE_POKEMON": { "result": SUCCESS } } } if not response_dict: return False result = response_dict.get("responses", {}).get("UPGRADE_POKEMON", {}).get("result", 0) if result != SUCCESS: return False upgrade = response_dict.get("responses", {}).get( "UPGRADE_POKEMON", {}).get("upgraded_pokemon", {}) if self.config_upgrade and (not self.bot.config.test): candy.consume(upgrade_candy_cost) self.stardust_count -= upgrade_stardust_cost self.emit_event( "pokemon_upgraded", formatted= "Upgraded {pokemon} [IV {iv}] [CP {cp}] [{candy} candies] [{stardust} stardust]", data={ "pokemon": pokemon.name, "iv": pokemon.iv, "cp": pokemon.cp, "candy": candy.quantity, "stardust": self.stardust_count }) if self.config_upgrade and (not self.bot.config.test): inventory.pokemons().remove(pokemon.unique_id) new_pokemon = inventory.Pokemon(upgrade) inventory.pokemons().add(new_pokemon) action_delay(self.config_transfer_wait_min, self.config_transfer_wait_max) return True
def _execute_pokemon_evolve(self, pokemon, cache): if pokemon.name in cache: return False response_dict = self.bot.api.evolve_pokemon(pokemon_id=pokemon.unique_id) if response_dict.get('responses', {}).get('EVOLVE_POKEMON', {}).get('result', 0) == 1: xp = response_dict.get("responses", {}).get("EVOLVE_POKEMON", {}).get("experience_awarded", 0) evolution = response_dict.get("responses", {}).get("EVOLVE_POKEMON", {}).get("evolved_pokemon_data", {}) awarded_candies = response_dict.get('responses', {}).get('EVOLVE_POKEMON', {}).get('candy_awarded', 0) candy = inventory.candies().get(pokemon.pokemon_id) candy.consume(pokemon.evolution_cost - awarded_candies) self.emit_event( 'pokemon_evolved', formatted="*Evolved {}* (IV {}) (CP {}) ({} candies) (+{} xp)".format(pokemon.name, pokemon.iv, pokemon.cp, candy.quantity, xp), data={ 'pokemon': pokemon.name, 'iv': pokemon.iv, 'cp': pokemon.cp, 'candy': candy.quantity, 'xp': xp, } ) inventory.pokemons().remove(pokemon.unique_id) new_pokemon = inventory.Pokemon(evolution) inventory.pokemons().add(new_pokemon) inventory.player().exp += xp action_delay(self.min_evolve_speed, self.max_evolve_speed) evolve_result = True else: # cache pokemons we can't evolve. Less server calls cache[pokemon.name] = 1 sleep(0.7) evolve_result = False with self.bot.database as conn: c = conn.cursor() c.execute("SELECT COUNT(name) FROM sqlite_master WHERE type='table' AND name='evolve_log'") result = c.fetchone() while True: if result[0] == 1: conn.execute('''INSERT INTO evolve_log (pokemon, iv, cp) VALUES (?, ?, ?)''', (pokemon.name, pokemon.iv, pokemon.cp)) break else: self.emit_event( 'evolve_log', sender=self, level='info', formatted="evolve_log table not found, skipping log" ) break return evolve_result
def _hatch_eggs(self): response_dict = self.bot.api.get_hatched_eggs() log_color = 'green' try: result = reduce(dict.__getitem__, ["responses", "GET_HATCHED_EGGS"], response_dict) except KeyError: return pokemon_ids = [] if 'pokemon_id' in result: pokemon_ids = [id for id in result['pokemon_id']] stardust = result.get('stardust_awarded', "error") candy = result.get('candy_awarded', "error") xp = result.get('experience_awarded', "error") sleep(self.hatching_animation_delay) try: pokemon_data = self._check_inventory(pokemon_ids) 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.get('pokemon_id')-1)]['Name'] #remove as egg and add as pokemon inventory.pokemons().remove(pokemon['id']) inventory.pokemons().add(inventory.Pokemon(pokemon)) else: pokemon['name'] = "error" except: pokemon_data = [{"name":"error", "cp":"error", "iv":"error"}] if not pokemon_ids or not pokemon_data or pokemon_data[0]['name'] == "error": self.emit_event( 'egg_hatched', data={ 'pokemon': 'error', 'cp': 'error', 'iv': 'error', 'exp': 'error', 'stardust': 'error', 'candy': 'error', } ) return for i in range(len(pokemon_data)): msg = "Egg hatched with a {pokemon} (CP {cp} - IV {iv}), {exp} exp, {stardust} stardust and {candy} candies." self.bot.metrics.hatched_eggs(1) self.emit_event( 'egg_hatched', formatted=msg, data={ 'pokemon': pokemon_data[i]['name'], 'cp': pokemon_data[i]['cp'], 'iv': "{} {}".format( "/".join(map(str, pokemon_data[i]['iv'])), round(sum(pokemon_data[i]['iv'])/self.max_iv, 2) ), 'exp': xp[i], 'stardust': stardust[i], 'candy': candy[i], } )
def evolve_pokemon(self, pokemon): while pokemon.unique_id in self.evolution_map: pokemon = self.evolution_map[pokemon.unique_id] if self.config_evolve and (not self.bot.config.test): response_dict = self.bot.api.evolve_pokemon(pokemon_id=pokemon.unique_id) else: response_dict = {"responses": {"EVOLVE_POKEMON": {"result": SUCCESS}}} if not response_dict: return False result = response_dict.get("responses", {}).get("EVOLVE_POKEMON", {}).get("result", 0) if result != SUCCESS: return False xp = response_dict.get("responses", {}).get("EVOLVE_POKEMON", {}).get("experience_awarded", 0) candy_awarded = response_dict.get("responses", {}).get("EVOLVE_POKEMON", {}).get("candy_awarded", 0) candy = inventory.candies().get(pokemon.pokemon_id) evolution = response_dict.get("responses", {}).get("EVOLVE_POKEMON", {}).get("evolved_pokemon_data", {}) if self.config_evolve and (not self.bot.config.test): candy.consume(pokemon.evolution_cost - candy_awarded) inventory.player().exp += xp self.emit_event("pokemon_evolved", formatted="Evolved {pokemon} [IV {iv}] [CP {cp}] [{candy} candies] [+{xp} xp]", data={"pokemon": pokemon.name, "iv": pokemon.iv, "cp": pokemon.cp, "candy": candy.quantity, "xp": xp}) if self.config_evolve and (not self.bot.config.test): new_pokemon = inventory.Pokemon(evolution) self.evolution_map[pokemon.unique_id] = new_pokemon inventory.pokemons().remove(pokemon.unique_id) inventory.pokemons().add(new_pokemon) with self.bot.database as db: cursor = db.cursor() cursor.execute("SELECT COUNT(name) FROM sqlite_master WHERE type='table' AND name='evolve_log'") db_result = cursor.fetchone() if db_result[0] == 1: db.execute("INSERT INTO evolve_log (pokemon, iv, cp) VALUES (?, ?, ?)", (pokemon.name, pokemon.iv, pokemon.cp)) sleep(self.config_evolve_time, 0.1) return True
def evolve_pokemon(self, pokemon): if self.config_evolve and (not self.bot.config.test): response_dict = self.bot.api.evolve_pokemon(pokemon_id=pokemon.id) else: response_dict = {"responses": {"EVOLVE_POKEMON": {"result": 1}}} if not response_dict: return False result = response_dict.get("responses", {}).get("EVOLVE_POKEMON", {}).get("result", 0) if result != SUCCESS: return False xp = response_dict.get("responses", {}).get("EVOLVE_POKEMON", {}).get("experience_awarded", 0) candy = response_dict.get("responses", {}).get("EVOLVE_POKEMON", {}).get("candy_awarded", 0) evolution = response_dict.get("responses", {}).get("EVOLVE_POKEMON", {}).get("evolved_pokemon_data", {}) self.emit_event("pokemon_evolved", formatted="Evolved {pokemon} [IV {iv}] [CP {cp}] [NCP {ncp}] [DPS {dps}] [+{xp} xp]", data={"pokemon": pokemon.name, "iv": pokemon.iv, "cp": pokemon.cp, "ncp": round(pokemon.ncp, 2), "dps": round(pokemon.dps, 2), "xp": xp}) if self.config_evolve and (not self.bot.config.test): inventory.candies().get(pokemon.pokemon_id).consume(pokemon.evolution_cost - candy) inventory.pokemons().remove(pokemon.id) new_pokemon = inventory.Pokemon(evolution) inventory.pokemons().add(new_pokemon) sleep(self.config_evolve_time) return True
def _hatch_eggs(self): request = self.bot.api.create_request() request.get_hatched_eggs() response_dict = request.call() try: result = reduce(dict.__getitem__, ["responses", "GET_HATCHED_EGGS"], response_dict) except KeyError: return WorkerResult.ERROR pokemon_ids = [] if 'pokemon_id' in result: pokemon_ids = [id for id in result['pokemon_id']] stardust = result.get('stardust_awarded', []) candy = result.get('candy_awarded', []) xp = result.get('experience_awarded', []) sleep(self.hatching_animation_delay) try: pokemon_data = self._check_inventory(pokemon_ids) pokemon_list = [inventory.Pokemon(p) for p in pokemon_data] for pokemon in pokemon_list: inventory.pokemons().remove(pokemon.unique_id) inventory.pokemons().add(pokemon) except: pokemon_data = [] if not pokemon_ids or not pokemon_data: self.emit_event('egg_hatched_fail', formatted="Error trying to hatch egg.") return False for i in range(len(pokemon_list)): pokemon = pokemon_list[i] msg = "Egg hatched with a {name} (CP {cp} - NCP {ncp} - IV {iv_ads} {iv_pct}), {exp} exp, {stardust} stardust and {candy} candies." self.emit_event('egg_hatched', formatted=msg, data={ 'name': pokemon.name, 'cp': str(int(pokemon.cp)), 'ncp': str(round(pokemon.cp_percent, 2)), 'iv_ads': str(pokemon.iv_display), 'iv_pct': str(pokemon.iv), 'exp': str(xp[i]), 'stardust': str(stardust[i]), 'candy': str(candy[i]) }) # hatching egg gets exp too! inventory.player().exp += xp[i] self.bot.stardust += stardust[i] with self.bot.database as conn: c = conn.cursor() c.execute( "SELECT COUNT(name) FROM sqlite_master WHERE type='table' AND name='eggs_hatched_log'" ) result = c.fetchone() while True: if result[0] == 1: conn.execute( '''INSERT INTO eggs_hatched_log (pokemon, cp, iv, pokemon_id) VALUES (?, ?, ?, ?)''', (pokemon.name, pokemon.cp, pokemon.iv, pokemon.pokemon_id)) break else: self.emit_event( 'eggs_hatched_log', sender=self, level='info', formatted= "eggs_hatched_log table not found, skipping log") break self.bot.metrics.hatched_eggs(len(pokemon_list)) return True