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

[WIP] Changing the Bot to Event-Based #55

Closed
wants to merge 3 commits into from
Closed
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
82 changes: 12 additions & 70 deletions pokemongo_bot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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__)
Expand Down
32 changes: 32 additions & 0 deletions pokemongo_bot/events.py
Original file line number Diff line number Diff line change
@@ -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
41 changes: 41 additions & 0 deletions pokemongo_bot/handlers/catch_handler.py
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions pokemongo_bot/handlers/cell_handler.py
Original file line number Diff line number Diff line change
@@ -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'])
15 changes: 15 additions & 0 deletions pokemongo_bot/handlers/fort_handler.py
Original file line number Diff line number Diff line change
@@ -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()
9 changes: 9 additions & 0 deletions pokemongo_bot/handlers/gym_handler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-

from events import IEventHandler

class GymHandler(IEventHandler):
handles = 'cell_work_gyms'

def process(self, **kwargs):
pass
30 changes: 30 additions & 0 deletions pokemongo_bot/handlers/remove_ignored_pokemon_handler.py
Original file line number Diff line number Diff line change
@@ -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