Skip to content

Commit

Permalink
Use alternative event system
Browse files Browse the repository at this point in the history
  • Loading branch information
wchill committed Jul 26, 2016
1 parent 8d407b5 commit 7589c69
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 53 deletions.
21 changes: 13 additions & 8 deletions plugins/logger/__init__.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
from pokemongo_bot import logger
def action_before_catch_pokemon(hook_params):
logger.log("[#] A Wild {} appeared! [CP {}] [Potential {}]".format(hook_params["name"], hook_params["cp"],
hook_params["pokemon_potential"]), "yellow")
from pokemongo_bot import logger, event_manager
from pokemongo_bot.event_manager import manager

@manager.on("before_catch_pokemon")
def action_before_catch_pokemon(event, bot, name=None, cp=None, pokemon_potential=None, **kwargs):
logger.log("[#] A Wild {} appeared! [CP {}] [Potential {}]".format(name, cp, pokemon_potential, "yellow"))

@manager.on("catch_pokemon")
def action_catch_pokemon(hook_params):
pass

def action_after_catch_pokemon(hook_params):
logger.log("[x] Captured {} [CP {}]".format(hook_params["name"], hook_params["cp"]), "green")
@manager.on("after_catch_pokemon")
def action_after_catch_pokemon(event, bot, name=None, cp=None, **kwargs):
logger.log("[x] Captured {} [CP {}]".format(name, cp, "green"))

def action_use_pokeball(hook_params):
logger.log("[x] Using {}... ({} left!)".format(hook_params["pokeball_name"], hook_params["number_left"]))
@manager.on("use_pokeball")
def action_use_pokeball(event, bot, pokeball_name=None, number_left=None, **kwargs):
logger.log("[x] Using {}... ({} left!)".format(pokeball_name, number_left))
6 changes: 5 additions & 1 deletion pokemongo_bot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import googlemaps

from pokemongo_bot import logger, cell_workers, human_behaviour, item_list, stepper
from pokemongo_bot.event_manager import manager
from pokemongo_bot.cell_workers import PokemonCatchWorker, SeenFortWorker, InitialTransferWorker, WalkTowardsFortWorker
from pokemongo_bot.cell_workers.utils import filtered_forts, distance
from pokemongo_bot.human_behaviour import sleep
Expand Down Expand Up @@ -54,6 +55,9 @@ def start(self):
self.stepper = Stepper(self)
random.seed()

def fire(self, event, *args, **kwargs):
manager.fire_with_context(event, self, *args, **kwargs)

def take_step(self):
self.stepper.take_step()

Expand Down Expand Up @@ -96,7 +100,7 @@ def work_on_cell(self, cell, include_fort_on_path):
walk_worker = WalkTowardsFortWorker(fort, self)
walk_worker.work()

if (self.config.mode == "all" or self.config.mode == "farm"):
if self.config.mode == "all" or self.config.mode == "farm":
spinner_worker = SeenFortWorker(fort, self)
spinner_worker.work()

Expand Down
8 changes: 4 additions & 4 deletions pokemongo_bot/cell_workers/pokemon_catch_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def throw_pokeball(self, encounter_id, pokeball, spawnpoint_id, combat_power, po
return False
elif status is 1:
if self.should_transfer(combat_power, pokemon_potential):
self.bot.plugin_manager.execute_action_hook('after_catch_pokemon', {"name": pokemon_name, "cp": combat_power, "pokemon_potential": pokemon_potential})
self.bot.fire('after_catch_pokemon', name=pokemon_name, cp=combat_power, pokemon_potential=pokemon_potential)
logger.log('[x] Exchanging pokemon for candy!')
id_list_after_catching = self.get_pokemon_ids()

Expand All @@ -77,7 +77,7 @@ def throw_pokeball(self, encounter_id, pokeball, spawnpoint_id, combat_power, po
logger.log(
'[#] {} has been exchanged for candy!'.format(pokemon_name), 'green')
else:
self.bot.plugin_manager.execute_action_hook('after_catch_pokemon', {"name": pokemon_name, "cp": combat_power, "pokemon_potential": pokemon_potential})
self.bot.fire('after_catch_pokemon', name=pokemon_name, cp=combat_power, pokemon_potential=pokemon_potential)
return False
else:
return False
Expand Down Expand Up @@ -117,7 +117,7 @@ def work(self):
pokemon_num = int(pokemon['pokemon_data'][
'pokemon_id']) - 1
pokemon_name = self.pokemon_list[int(pokemon_num)]['Name']
self.bot.plugin_manager.execute_action_hook('before_catch_pokemon', {"name": pokemon_name, "cp": combat_power if combat_power is not None else "unknown", "pokemon_potential": pokemon_potential})
self.bot.fire('before_catch_pokemon', name=pokemon_name, cp=combat_power if combat_power is not None else "unknown", pokemon_potential=pokemon_potential)

# Simulate app
sleep(3)
Expand Down Expand Up @@ -148,7 +148,7 @@ def work(self):
self.config.mode = 'farm'
return self.NO_POKEBALLS

self.bot.plugin_manager.execute_action_hook('use_pokeball', {"pokeball_name": self.item_list[str(pokeball)], "number_left": balls_stock[pokeball] - 1})
self.bot.fire('use_pokeball', pokeball_name=self.item_list[str(pokeball)], number_left=balls_stock[pokeball] - 1)

balls_stock[pokeball] -= 1
should_continue_throwing = self.throw_pokeball(encounter_id, pokeball, spawnpoint_id, combat_power, pokemon_potential, pokemon_name)
Expand Down
2 changes: 1 addition & 1 deletion pokemongo_bot/cell_workers/seen_fort_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from pgoapi.utilities import f2i
from pokemongo_bot import logger
from pokemongo_bot.human_behaviour import sleep
from pokemongo_bot.cell_workers.utils import distance, format_dist, format_time
from pokemongo_bot.cell_workers.utils import format_time


class SeenFortWorker(object):
Expand Down
5 changes: 1 addition & 4 deletions pokemongo_bot/cell_workers/walk_towards_fort_worker.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
# -*- coding: utf-8 -*-

import time

from pgoapi.utilities import f2i
from pokemongo_bot import logger
from pokemongo_bot.human_behaviour import sleep
from pokemongo_bot.cell_workers.utils import distance, format_dist, format_time
from pokemongo_bot.cell_workers.utils import distance, format_dist

class WalkTowardsFortWorker(object):

Expand Down
55 changes: 55 additions & 0 deletions pokemongo_bot/event_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
class Event(object):

def __init__(self, name):
self.name = name
self.listeners = set()

def add_listener(self, listener):
self.listeners.add(listener)

def remove_listener(self, listener):
self.listeners.discard(listener)

def fire(self, *args, **kwargs):
for listener in self.listeners:
listener(self.name, *args, **kwargs)

class EventManager(object):

def __init__(self):
self.events = {}

def add_listener(self, name, listener):
if name not in self.events:
self.events[name] = Event(name)
self.events[name].add_listener(listener)

# decorator for event handlers
# pylint: disable=invalid-name
def on(self, *trigger_list):
def register_handler(function):
for trigger in trigger_list:
self.add_listener(trigger, function)
return function
return register_handler

# fire an event and call all event handlers
def fire(self, event_name, *args, **kwargs):
if event_name in self.events:
self.events[event_name].fire(*args, **kwargs)

# fire an event and call all event handlers, injecting the context as 2nd parameter
def fire_with_context(self, event_name, bot, *args, **kwargs):
if event_name in self.events:
kwargs['bot'] = bot
self.fire(event_name, *args, **kwargs)

def remove_listener(self, name, listener):
if name in self.events:
self.events[name].remove_listener(listener)

# This will only be loaded once
# To use, add the following code to plugins:
# from event_manager import manager
# pylint: disable=invalid-name
manager = EventManager()
35 changes: 0 additions & 35 deletions pokemongo_bot/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,38 +68,3 @@ def unload_plugin(self, plugin_name):
'''
del self.loaded_plugins[plugin_name]
self.logging.log('plugin "%s" unloaded' % plugin_name)

def execute_action_hook(self, hook_name, hook_params=None):
'''
Executes action hook functions of the form action_hook_name contained in
the loaded plugin modules.
'''
if hook_params is None:
hook_params = {}
for plugin_info in self.loaded_plugins.values():
module = plugin_info['module']
hook_func_name = 'action_%s' % hook_name
if hasattr(module, hook_func_name):
hook_func = getattr(module, hook_func_name)
hook_func(hook_params)

def execute_filter_hook(self, hook_name, hook_params=None):
'''
Filters the hook_params through filter hook functions of the form
filter_hook_name contained in the loaded plugin modules.
'''
if hook_params is None:
hook_params = {}
hook_params_keys = hook_params.keys()
for plugin_info in self.loaded_plugins.values():
module = plugin_info['module']
hook_func_name = 'filter_%s' % hook_name
if hasattr(module, hook_func_name):
hook_func = getattr(module, hook_func_name)
hook_params = hook_func(hook_params)
for nkey in hook_params_keys:
if nkey not in hook_params.keys():
msg = 'function "%s" in plugin "%s" is missing "%s" in the dict it returns' % (hook_func_name, plugin_info['name'], nkey)
self.logging.log(msg)
raise Exception(msg)
return hook_params

0 comments on commit 7589c69

Please sign in to comment.