aboutsummaryrefslogtreecommitdiff
path: root/EventManager.py
diff options
context:
space:
mode:
Diffstat (limited to 'EventManager.py')
-rw-r--r--EventManager.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/EventManager.py b/EventManager.py
new file mode 100644
index 00000000..3b75de9f
--- /dev/null
+++ b/EventManager.py
@@ -0,0 +1,87 @@
+
+class Event(object):
+ def __init__(self, bot, **kwargs):
+ self.bot = bot
+ self.kwargs = kwargs
+ self.eaten = False
+ def __getitem__(self, key):
+ return self.kwargs[key]
+ def get(self, key, default=None):
+ return self.kwargs.get(key, default)
+ def __contains__(self, key):
+ return key in self.kwargs
+ def eat(self):
+ self.eaten = True
+
+class EventCallback(object):
+ def __init__(self, function, bot, **kwargs):
+ self.function = function
+ self.bot = bot
+ self.kwargs = kwargs
+ def call(self, event):
+ return self.function(event)
+
+class MultipleEventHook(object):
+ def __init__(self):
+ self._event_hooks = set([])
+ def _add(self, event_hook):
+ self._event_hooks.add(event_hook)
+ def hook(self, function, **kwargs):
+ for event_hook in self._event_hooks:
+ event_hook.hook(function, **kwargs)
+ def call(self, max=None, **kwargs):
+ for event_hook in self._event_hooks:
+ event_hook.call(max, **kwargs)
+
+class EventHook(object):
+ def __init__(self, bot):
+ self.bot = bot
+ self._children = {}
+ self._hooks = []
+ self._hook_notify = None
+ self._child_notify = None
+ self._call_notify = None
+ def hook(self, function, **kwargs):
+ callback = EventCallback(function, self.bot, **kwargs)
+ if self._hook_notify:
+ self._hook_notify(self, callback)
+ self._hooks.append(callback)
+ def on(self, subevent, *extra_subevents):
+ if extra_subevents:
+ multiple_event_hook = MultipleEventHook()
+ for extra_subevent in (subevent,)+extra_subevents:
+ multiple_event_hook._add(self.get_child(extra_subevent))
+ return multiple_event_hook
+ return self.get_child(subevent)
+ def call(self, max=None, **kwargs):
+ event = Event(self.bot, **kwargs)
+ if self._call_notify:
+ self._call_notify(self, event)
+ called = 0
+ returns = []
+ for hook in self._hooks:
+ if max and called == max:
+ break
+ if event.eaten:
+ break
+ returns.append(hook.call(event))
+ called += 1
+ return returns
+ def get_child(self, child_name):
+ child_name_lower = child_name.lower()
+ if not child_name_lower in self._children:
+ self._children[child_name_lower] = EventHook(self.bot)
+ if self._child_notify:
+ self._child_notify(self, self._children[
+ child_name_lower])
+ return self._children[child_name_lower]
+ def get_hooks(self):
+ return self._hooks
+ def get_children(self):
+ return self._children.keys()
+ def set_hook_notify(self, handler):
+ self._hook_notify = handler
+ def set_child_notify(self, handler):
+ self._child_notify = handler
+ def set_call_notify(self, handler):
+ self._call_notify = handler