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..9991586d --- /dev/null +++ b/pokemongo_bot/events.py @@ -0,0 +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 diff --git a/pokemongo_bot/handlers/catch_handler.py b/pokemongo_bot/handlers/catch_handler.py new file mode 100644 index 00000000..35fb16e7 --- /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 CatchablePokemonHandler(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