mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2024-11-29 21:03:45 +03:00
64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
import abc
|
|
import functools
|
|
|
|
from .filters import Filter
|
|
|
|
|
|
class StopPropagation(Exception):
|
|
"""
|
|
If this exception is raised in any of the handlers for a given event,
|
|
it will stop the execution of all other registered event handlers.
|
|
It can be seen as the ``StopIteration`` in a for loop but for events.
|
|
|
|
Example usage:
|
|
|
|
>>> from telethon import TelegramClient, events
|
|
>>> client = TelegramClient(...)
|
|
>>>
|
|
>>> @client.on(events.NewMessage)
|
|
... async def delete(event):
|
|
... await event.delete()
|
|
... # No other event handler will have a chance to handle this event
|
|
... raise StopPropagation
|
|
...
|
|
>>> @client.on(events.NewMessage)
|
|
... async def _(event):
|
|
... # Will never be reached, because it is the second handler
|
|
... pass
|
|
"""
|
|
# For some reason Sphinx wants the silly >>> or
|
|
# it will show warnings and look bad when generated.
|
|
pass
|
|
|
|
|
|
class EventBuilder(abc.ABC):
|
|
@classmethod
|
|
@abc.abstractmethod
|
|
def _build(cls, client, update, entities):
|
|
"""
|
|
Builds an event for the given update if possible, or returns None.
|
|
|
|
`entities` must have `get(Peer) -> User|Chat` and `self_id`,
|
|
which must be the current user's ID.
|
|
"""
|
|
|
|
|
|
@functools.total_ordering
|
|
class EventHandler:
|
|
__slots__ = ('_event', '_callback', '_priority', '_filter')
|
|
|
|
def __init__(self, event: EventBuilder, callback: callable, priority: int, filter: Filter):
|
|
self._event = event
|
|
self._callback = callback
|
|
self._priority = priority
|
|
self._filter = filter
|
|
|
|
def __eq__(self, other):
|
|
return self is other
|
|
|
|
def __lt__(self, other):
|
|
return self._priority < other._priority
|
|
|
|
def __call__(self, *args, **kwargs):
|
|
return self._callback(*args, **kwargs)
|