Allow custom args, kwargs for event handlers

This commit is contained in:
Serhii Dylda 2018-04-09 05:09:25 +03:00
parent bd1b0ecdb4
commit 50716f5ced

View File

@ -2200,17 +2200,16 @@ class TelegramClient(TelegramBareClient):
# region Event handling # region Event handling
def on(self, event): def on(self, event, *args, **kwargs):
""" """
Decorator helper method around add_event_handler(). Decorator helper method around add_event_handler().
Args: Args:
event (`_EventBuilder` | `type`): event (`_EventBuilder` | `type`):
The event builder class or instance to be used, The event builder class or instance to be used,
for instance ``events.NewMessage``. for instance ``events.NewMessage``.
""" """
def decorator(f): def decorator(f):
self.add_event_handler(f, event) self.add_event_handler(f, *args, event=event, **kwargs)
return f return f
return decorator return decorator
@ -2222,12 +2221,12 @@ class TelegramClient(TelegramBareClient):
self._events_pending_resolve.clear() self._events_pending_resolve.clear()
def _on_handler(self, update): def _on_handler(self, update):
for builder, callback in self._event_builders: for builder, callback, args, kwargs in self._event_builders:
event = builder.build(update) event = builder.build(update)
if event: if event:
event._client = self event._client = self
try: try:
callback(event) callback(event, *args, **kwargs)
except events.StopPropagation: except events.StopPropagation:
__log__.debug( __log__.debug(
"Event handler '{}' stopped chain of " "Event handler '{}' stopped chain of "
@ -2236,18 +2235,15 @@ class TelegramClient(TelegramBareClient):
) )
break break
def add_event_handler(self, callback, event=None): def add_event_handler(self, callback, *args, event=None, **kwargs):
""" """
Registers the given callback to be called on the specified event. Registers the given callback to be called on the specified event.
Args: Args:
callback (`callable`): callback (`callable`):
The callable function accepting one parameter to be used. The callable function accepting one parameter to be used.
event (`_EventBuilder` | `type`, optional): event (`_EventBuilder` | `type`, optional):
The event builder class or instance to be used, The event builder class or instance to be used,
for instance ``events.NewMessage``. for instance ``events.NewMessage``.
If left unspecified, ``events.Raw`` (the ``Update`` objects If left unspecified, ``events.Raw`` (the ``Update`` objects
with no further processing) will be passed instead. with no further processing) will be passed instead.
""" """
@ -2270,12 +2266,11 @@ class TelegramClient(TelegramBareClient):
else: else:
self._events_pending_resolve.append(event) self._events_pending_resolve.append(event)
self._event_builders.append((event, callback)) self._event_builders.append((event, callback, args, kwargs))
def remove_event_handler(self, callback, event=None): def remove_event_handler(self, callback, event=None):
""" """
Inverse operation of :meth:`add_event_handler`. Inverse operation of :meth:`add_event_handler`.
If no event is given, all events for this callback are removed. If no event is given, all events for this callback are removed.
Returns how many callbacks were removed. Returns how many callbacks were removed.
""" """
@ -2286,7 +2281,7 @@ class TelegramClient(TelegramBareClient):
i = len(self._event_builders) i = len(self._event_builders)
while i: while i:
i -= 1 i -= 1
ev, cb = self._event_builders[i] ev, cb, args, kwargs = self._event_builders[i]
if cb == callback and (not event or isinstance(ev, event)): if cb == callback and (not event or isinstance(ev, event)):
del self._event_builders[i] del self._event_builders[i]
found += 1 found += 1
@ -2298,7 +2293,7 @@ class TelegramClient(TelegramBareClient):
Lists all added event handlers, returning a list of pairs Lists all added event handlers, returning a list of pairs
consisting of (callback, event). consisting of (callback, event).
""" """
return [(callback, event) for event, callback in self._event_builders] return [(callback, event) for event, callback, args, kwargs in self._event_builders]
def add_update_handler(self, handler): def add_update_handler(self, handler):
warnings.warn( warnings.warn(