diff --git a/configs/config.json.example b/configs/config.json.example index 374b1c5f5c..766b61e30e 100644 --- a/configs/config.json.example +++ b/configs/config.json.example @@ -22,7 +22,7 @@ // "Rattata": { "always_catch" : true } }, "release": { - "any": {"release_below_cp": 0, "release_below_iv": 0, "logic": "or"}, + "any": {"release_below_cp": 0, "release_below_iv": 0, "keep_best_cp": true, "logic": "or"}, // "Rattata": { "always_release" : true } } } diff --git a/configs/config.json.pokemons.example b/configs/config.json.pokemons.example index 77d25c6baf..3c43259892 100644 --- a/configs/config.json.pokemons.example +++ b/configs/config.json.pokemons.example @@ -17,16 +17,16 @@ "use_lucky_egg": false, "evolve_captured": false, "catch": { - "any": {"catch_above_cp": 0, "catch_above_iv": 0, "logic": "or" }, + "any": {"catch_above_cp": 0, "catch_above_iv": 0, "keep_best_cp": true, "logic": "or" }, "// Pokemons with example": { "always_catch": true }, "// Gets filtered with release parameters": {}, "// Legendary pokemons (Goes under S-Tier)": {}, - "Lapras": { "always_catch": true }, - "Moltres": { "always_catch": true }, - "Zapdos": { "always_catch": true }, - "Articuno": { "always_catch": true }, + "Lapras": { "keep_best_cp": false, "always_catch": true }, + "Moltres": { "keep_best_cp": false, "always_catch": true }, + "Zapdos": { "keep_best_cp": false, "always_catch": true }, + "Articuno": { "keep_best_cp": false, "always_catch": true }, "// S-Tier pokemons (if pokemon can be evolved into tier, list the representative)": {}, "Mewtwo": { "always_catch": true }, @@ -260,4 +260,4 @@ "Raichu": { "release_under_cp": 708, "release_under_iv": 0.8, "cp_iv_logic": "and" }, "Cloyster": { "release_under_cp": 717, "release_under_iv": 0.8, "cp_iv_logic": "and"} } -} \ No newline at end of file +} diff --git a/pokemongo_bot/cell_workers/pokemon_catch_worker.py b/pokemongo_bot/cell_workers/pokemon_catch_worker.py index acb912de18..5bf5a108d5 100644 --- a/pokemongo_bot/cell_workers/pokemon_catch_worker.py +++ b/pokemongo_bot/cell_workers/pokemon_catch_worker.py @@ -324,6 +324,36 @@ def _get_catch_config_for(self, pokemon): catch_config = {} return catch_config + def _check_if_higher_cp_pokemon(self, pokemon_name, value): + self.api.get_inventory() + response_dict = self.api.call() + return self._check_if_higher_cp_pokemon_all(pokemon_name, value, response_dict) + + def _check_if_higher_cp_pokemon_all(self, pokemon_name, value, response_dict): + try: + reduce(dict.__getitem__, [ + "responses", "GET_INVENTORY", "inventory_delta", "inventory_items"], response_dict) + except KeyError: + pass + else: + for item in response_dict['responses']['GET_INVENTORY']['inventory_delta']['inventory_items']: + try: + reduce(dict.__getitem__, [ + "inventory_item_data", "pokemon"], item) + except KeyError: + pass + else: + pokemon = item['inventory_item_data']['pokemon'] + if self._check_if_cp_higher(value, pokemon_name, pokemon): + return True + return False + + def _check_if_cp_higher(self, value, pokemon_name, pokemon): + if 'name' in pokemon and pokemon['name'] == pokemon_name: + if 'cp' in pokemon and pokemon['cp'] > value: + return True + return False + def should_release_pokemon(self, pokemon_name, cp, iv, response_dict): release_config = self._get_release_config_for(pokemon_name) cp_iv_logic = release_config.get('logic') @@ -341,6 +371,10 @@ def should_release_pokemon(self, pokemon_name, cp, iv, response_dict): if release_config.get('always_release', False): return True + if release_config.get('keep_best_cp', False): + if not self._check_if_higher_cp_pokemon(pokemon_name, cp): + return False + release_cp = release_config.get('release_below_cp', 0) if cp < release_cp: release_results['cp'] = True @@ -372,3 +406,4 @@ def _get_release_config_for(self, pokemon): if not release_config: release_config = {} return release_config +