2011-11-07 12:06:57 +00:00
|
|
|
|
#
|
|
|
|
|
# This file is part of Poezio.
|
|
|
|
|
#
|
|
|
|
|
# Poezio is free software: you can redistribute it and/or modify
|
|
|
|
|
# it under the terms of the zlib license. See the COPYING file.
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
Defines the EventHandler class
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import logging
|
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
class EventHandler(object):
|
|
|
|
|
"""
|
|
|
|
|
A class keeping a list of possible events that are triggered
|
|
|
|
|
by poezio. You (a plugin for example) can add an event handler
|
|
|
|
|
associated with an event name, and whenever that event is triggered,
|
|
|
|
|
the callback is called
|
|
|
|
|
"""
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self.events = {
|
|
|
|
|
# when you are highlighted in a muc tab
|
|
|
|
|
'highlight': [],
|
|
|
|
|
'muc_say': [],
|
|
|
|
|
'conversation_say': [],
|
|
|
|
|
'private_say': [],
|
2011-11-07 13:45:08 +00:00
|
|
|
|
'conversation_msg': [],
|
|
|
|
|
'private_msg': [],
|
|
|
|
|
'muc_msg': [],
|
2011-11-07 12:06:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def add_event_handler(self, name, callback, first=True, last=False, position=None):
|
|
|
|
|
"""
|
|
|
|
|
Add a callback to a given event.
|
|
|
|
|
Note that if that event name doesn’t exist, it just returns False.
|
|
|
|
|
If it was successfully added, it returns True
|
|
|
|
|
"""
|
|
|
|
|
if name not in self.events:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
if first:
|
|
|
|
|
self.events[name].insert(0, callback)
|
|
|
|
|
elif last:
|
|
|
|
|
self.events[name].append(callback)
|
|
|
|
|
elif position != None and isinstance(position, int):
|
|
|
|
|
self.events[name].insert(position, callback)
|
|
|
|
|
else:
|
|
|
|
|
self.events[name].insert(0, callback)
|
|
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def trigger(self, name, *args, **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
Call all the callbacks associated to the given event name
|
|
|
|
|
"""
|
|
|
|
|
callbacks = self.events[name]
|
|
|
|
|
for callback in callbacks:
|
|
|
|
|
callback(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
def del_event_handler(self, name, callback):
|
|
|
|
|
"""
|
|
|
|
|
Remove the callback from the list of callbacks of the given event
|
|
|
|
|
"""
|
|
|
|
|
if not name:
|
|
|
|
|
for event in self.events:
|
|
|
|
|
while callback in self.events[event]:
|
|
|
|
|
self.events[event].remove(callback)
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
if callback in self.events[name]:
|
|
|
|
|
self.events[name].remove(callback)
|
|
|
|
|
|