From be535eed9962e17635052148698939d04a7b6f9f Mon Sep 17 00:00:00 2001 From: James Droste Date: Sun, 24 Jul 2016 22:29:04 +0100 Subject: [PATCH 1/3] Starting on events - Create EventManager / IEventHandler - Moved out a bunch of the cell things into handlers --- pokemongo_bot/__init__.py | 82 +++---------------- pokemongo_bot/events.py | 28 +++++++ pokemongo_bot/handlers/catch_handler.py | 41 ++++++++++ pokemongo_bot/handlers/cell_handler.py | 16 ++++ pokemongo_bot/handlers/fort_handler.py | 15 ++++ pokemongo_bot/handlers/gym_handler.py | 9 ++ .../remove_ignored_pokemon_handler.py | 30 +++++++ 7 files changed, 151 insertions(+), 70 deletions(-) create mode 100644 pokemongo_bot/events.py create mode 100644 pokemongo_bot/handlers/catch_handler.py create mode 100644 pokemongo_bot/handlers/cell_handler.py create mode 100644 pokemongo_bot/handlers/fort_handler.py create mode 100644 pokemongo_bot/handlers/gym_handler.py create mode 100644 pokemongo_bot/handlers/remove_ignored_pokemon_handler.py diff --git a/pokemongo_bot/__init__.py b/pokemongo_bot/__init__.py index 07cc8cb1..310c3d39 100644 --- a/pokemongo_bot/__init__.py +++ b/pokemongo_bot/__init__.py @@ -12,6 +12,7 @@ from cell_workers import PokemonCatchWorker, SeenFortWorker from cell_workers.utils import filtered_forts, distance +from events import EventManager from human_behaviour import sleep from item_list import Item from pgoapi import PGoApi @@ -34,81 +35,22 @@ def start(self): self._setup_api() self._setup_ignored_pokemon() self.stepper = Stepper(self) + self.event_manager = EventManager(self) random.seed() def take_step(self): - self.stepper.take_step() - - def work_on_cell(self, map_cells, position, include_fort_on_path): - self._remove_ignored_pokemon(map_cells) - - if (self.config.mode == "all" or self.config.mode == "poke"): - self._work_on_catchable_pokemon(map_cells) - - if (self.config.mode == "all" or self.config.mode == "poke"): - self._work_on_wild_pokemon(map_cells) + """ + self.event_manager.emit_event('before_movement') + self.event_manager.emit_event('movement') + self.event_manager.emit_event('after_movement') + """ - if (self.config.mode == "all" or self.config.mode == "farm") and include_fort_on_path: - self._work_on_forts(position, map_cells) - - def _work_on_forts(self, position, map_cells): - forts = filtered_forts(position[0], position[1], sum([cell.get("forts", []) for cell in map_cells], [])) - if forts: - worker = SeenFortWorker(forts[0], self) - hack_chain = worker.work() - - def _remove_ignored_pokemon(self, map_cells): - if self.process_ignored_pokemon: - try: - for cell in map_cells: - for p in cell['wild_pokemons'][:]: - pokemon_id = p['pokemon_data']['pokemon_id'] - pokemon_name = filter(lambda x: int(x.get('Number')) == pokemon_id, self.pokemon_list)[0]['Name'] - - if pokemon_name in ignores: - cell['wild_pokemons'].remove(p) - except KeyError: - pass - - try: - for call in map_cells: - for p in cell['catchable_pokemons'][:]: - pokemon_id = p['pokemon_id'] - pokemon_name = filter(lambda x: int(x.get('Number')) == pokemon_id, self.pokemon_list)[0]['Name'] + self.stepper.take_step() - if pokemon_name in ignores: - cell['catchable_pokemons'].remove(p) - except KeyError: - pass - - def _work_on_catchable_pokemon(self, map_cells): - for cell in map_cells: - if 'catchable_pokemons' in cell and len(cell['catchable_pokemons']) > 0: - logger.log('[#] Something rustles nearby!') - # Sort all by distance from current pos- eventually this should - # build graph & A* it - cell['catchable_pokemons'].sort( - key=lambda x: distance(self.position[0], self.position[1], x['latitude'], x['longitude'])) - for pokemon in cell['catchable_pokemons']: - with open('web/catchable-%s.json' % (self.config.username), 'w') as outfile: - json.dump(pokemon, outfile) - worker = PokemonCatchWorker(pokemon, self) - if worker.work() == -1: - break - with open('web/catchable-%s.json' % (self.config.username), 'w') as outfile: - json.dump({}, outfile) - - def _work_on_wild_pokemon(self, map_cells): - for cell in map_cells: - if 'wild_pokemons' in cell and len(cell['wild_pokemons']) > 0: - # Sort all by distance from current pos- eventually this should - # build graph & A* it - cell['wild_pokemons'].sort( - key=lambda x: distance(self.position[0], self.position[1], x['latitude'], x['longitude'])) - for pokemon in cell['wild_pokemons']: - worker = PokemonCatchWorker(pokemon, self) - if worker.work() == -1: - break + def work_on_cell(self, **kwargs): + self.event_manager.emit_event('before_cell_work', **kwargs) + self.event_manager.emit_event('cell_work', **kwargs) + self.event_manager.emit_event('after_cell_work', **kwargs) def _setup_logging(self): self.log = logging.getLogger(__name__) diff --git a/pokemongo_bot/events.py b/pokemongo_bot/events.py new file mode 100644 index 00000000..e2e18396 --- /dev/null +++ b/pokemongo_bot/events.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +class EventManager(object): +​ + def __init__(self, bot): + self.bot = bot + self.event_handle_dict = {} +​ + def register_handler(self, event, handler_class): + handler_list = self.event_handle_dict.get(event, []) + handler_list += handler_class +​ + def emit_event(self, event_name, **kwargs): + handlers = self.event_handle_dict.get(event_name, []) + + for handler in handlers: + handler_object = handler(self, **kwargs) + handler_object.process() +​ +class IEventHandler(object): + + def __init__(self, bot, event_manager): + self.bot = bot + self.event_manager = event_manager + self.event_manager.register_handler(self.handles, self) + + def process(self, **kwargs): + pass \ No newline at end of file diff --git a/pokemongo_bot/handlers/catch_handler.py b/pokemongo_bot/handlers/catch_handler.py new file mode 100644 index 00000000..ab9ae7a2 --- /dev/null +++ b/pokemongo_bot/handlers/catch_handler.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +from cell_workers import PokemonCatchWorker +from cell_workers.utils import distance +from events import IEventHandler + +class CachablePokemonHandler(IEventHandler): + handles = 'cell_work_cachable_pokemon' + + def process(self, **kwargs): + for cell in kwargs['map_cells']: + if 'catchable_pokemons' in cell and len(cell['catchable_pokemons']) > 0: + #logger.log('[#] Something rustles nearby!') + # Sort all by distance from current pos- eventually this should + # build graph & A* it + cell['catchable_pokemons'].sort( + key=lambda x: distance(self.bot.position[0], self.bot.position[1], x['latitude'], x['longitude'])) + for pokemon in cell['catchable_pokemons']: + with open('web/catchable-%s.json' % (self.bot.config.username), 'w') as outfile: + json.dump(pokemon, outfile) + worker = PokemonCatchWorker(pokemon, self.bot) + if worker.work() == -1: + break + with open('web/catchable-%s.json' % (self.bot.config.username), 'w') as outfile: + json.dump({}, outfile) + + +class WildPokemonHandler(IEventHandler): + handles = 'cell_work_wild_pokemon' + + def process(self, **kwargs): + for cell in kwargs['map_cells']: + if 'wild_pokemons' in cell and len(cell['wild_pokemons']) > 0: + # Sort all by distance from current pos- eventually this should + # build graph & A* it + cell['wild_pokemons'].sort( + key=lambda x: distance(self.bot.position[0], self.bot.position[1], x['latitude'], x['longitude'])) + for pokemon in cell['wild_pokemons']: + worker = PokemonCatchWorker(pokemon, self.bot) + if worker.work() == -1: + break \ No newline at end of file diff --git a/pokemongo_bot/handlers/cell_handler.py b/pokemongo_bot/handlers/cell_handler.py new file mode 100644 index 00000000..f26a261d --- /dev/null +++ b/pokemongo_bot/handlers/cell_handler.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +from events import IEventHandler + +class CellHandler(IEventHandler): + handles = 'cell_work' + + def process(self, **kwargs): + if (self.bot.config.mode == "all" or self.bot.config.mode == "poke"): + self.event_manager.emit_event('cell_work_cachable_pokemon', map_cells=kwargs['map_cells']) + + if (self.bot.config.mode == "all" or self.bot.config.mode == "poke"): + self.event_manager.emit_event('cell_work_wild_pokemon', map_cells=kwargs['map_cells']) + + if (self.bot.config.mode == "all" or self.bot.config.mode == "farm") and kwargs['include_fort_on_path']: + self.event_manager.emit_event('cell_work_forts', map_cells=kwargs['map_cells'], position=kwargs['position']) \ No newline at end of file diff --git a/pokemongo_bot/handlers/fort_handler.py b/pokemongo_bot/handlers/fort_handler.py new file mode 100644 index 00000000..046e96d3 --- /dev/null +++ b/pokemongo_bot/handlers/fort_handler.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from cell_workers import SeenFortWorker +from cell_workers.utils import filtered_forts, distance +from events import IEventHandler + +class FortHandler(IEventHandler): + handles = 'cell_work_forts' + + def process(self, **kwargs): + (lat, lng, alt) = kwargs['position'] + forts = filtered_forts(lat, lng, sum([cell.get("forts", []) for cell in kwargs['map_cells']], [])) + if forts: + worker = SeenFortWorker(forts[0], self.bot) + hack_chain = worker.work() \ No newline at end of file diff --git a/pokemongo_bot/handlers/gym_handler.py b/pokemongo_bot/handlers/gym_handler.py new file mode 100644 index 00000000..90802dd9 --- /dev/null +++ b/pokemongo_bot/handlers/gym_handler.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from events import IEventHandler + +class GymHandler(IEventHandler): + handles = 'cell_work_gyms' + + def process(self, **kwargs): + pass \ No newline at end of file diff --git a/pokemongo_bot/handlers/remove_ignored_pokemon_handler.py b/pokemongo_bot/handlers/remove_ignored_pokemon_handler.py new file mode 100644 index 00000000..0198d4d2 --- /dev/null +++ b/pokemongo_bot/handlers/remove_ignored_pokemon_handler.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +from events import IEventHandler + +class BotStartHandler(IEventHandler): + handles = 'before_cell_work' + + def process(self, **kwargs): + if self.bot.process_ignored_pokemon: + try: + for cell in map_cells: + for p in cell['wild_pokemons'][:]: + pokemon_id = p['pokemon_data']['pokemon_id'] + pokemon_name = filter(lambda x: int(x.get('Number')) == pokemon_id, self.bot.pokemon_list)[0]['Name'] + + if pokemon_name in ignores: + kwargs['cell']['wild_pokemons'].remove(p) + except KeyError: + pass + + try: + for call in map_cells: + for p in cell['catchable_pokemons'][:]: + pokemon_id = p['pokemon_id'] + pokemon_name = filter(lambda x: int(x.get('Number')) == pokemon_id, self.bot.pokemon_list)[0]['Name'] + + if pokemon_name in ignores: + kwargs['cell']['catchable_pokemons'].remove(p) + except KeyError: + pass \ No newline at end of file From c35f2108fbf678b9ea8fb364fc8d7348c6060efc Mon Sep 17 00:00:00 2001 From: James Droste Date: Sun, 24 Jul 2016 22:38:07 +0100 Subject: [PATCH 2/3] Stupid unicode --- pokemongo_bot/events.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pokemongo_bot/events.py b/pokemongo_bot/events.py index e2e18396..9991586d 100644 --- a/pokemongo_bot/events.py +++ b/pokemongo_bot/events.py @@ -1,28 +1,32 @@ # -*- coding: utf-8 -*- class EventManager(object): -​ + def __init__(self, bot): self.bot = bot self.event_handle_dict = {} -​ + self._init_event_handlers() + + def _init_event_handlers(self): + pass + def register_handler(self, event, handler_class): handler_list = self.event_handle_dict.get(event, []) handler_list += handler_class -​ + def emit_event(self, event_name, **kwargs): handlers = self.event_handle_dict.get(event_name, []) - + for handler in handlers: handler_object = handler(self, **kwargs) handler_object.process() -​ + class IEventHandler(object): - + def __init__(self, bot, event_manager): self.bot = bot self.event_manager = event_manager self.event_manager.register_handler(self.handles, self) def process(self, **kwargs): - pass \ No newline at end of file + pass From 0da47299243b31fcb3798c3f7532ce8793b27f85 Mon Sep 17 00:00:00 2001 From: James Droste Date: Sun, 24 Jul 2016 23:22:16 +0100 Subject: [PATCH 3/3] I literally cant spell --- pokemongo_bot/handlers/catch_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pokemongo_bot/handlers/catch_handler.py b/pokemongo_bot/handlers/catch_handler.py index ab9ae7a2..35fb16e7 100644 --- a/pokemongo_bot/handlers/catch_handler.py +++ b/pokemongo_bot/handlers/catch_handler.py @@ -4,7 +4,7 @@ from cell_workers.utils import distance from events import IEventHandler -class CachablePokemonHandler(IEventHandler): +class CatchablePokemonHandler(IEventHandler): handles = 'cell_work_cachable_pokemon' def process(self, **kwargs):