Support stopping propagation of events (#622)

This commit is contained in:
Joscha Götzer 2018-02-27 11:30:42 +01:00 committed by Lonami
parent 29f10f2771
commit 0b662f3b04
3 changed files with 59 additions and 1 deletions

View File

@ -121,6 +121,33 @@ random number, while if you say ``'eval 4+4'``, you will reply with the
solution. Try it! solution. Try it!
Stopping propagation of Updates
*******************************
There might be cases when an event handler is supposed to be used solitary and
it makes no sense to process any other handlers in the chain. For this case,
it is possible to raise a ``StopPropagation`` exception which will cause the
propagation of the update through your handlers to stop:
.. code-block:: python
from telethon.events import StopPropagation
@client.on(events.NewMessage)
def _(event):
# ... some conditions
event.delete()
# Other handlers won't have an event to work with
raise StopPropagation
@client.on(events.NewMessage)
def _(event):
# Will never be reached, because it is the second handler
# in the chain.
pass
Events module Events module
************* *************

View File

@ -873,3 +873,26 @@ class MessageChanged(_EventBuilder):
self.edited = bool(edit_msg) self.edited = bool(edit_msg)
self.deleted = bool(deleted_ids) self.deleted = bool(deleted_ids)
self.deleted_ids = deleted_ids or [] self.deleted_ids = deleted_ids or []
class StopPropagation(Exception):
"""
If this Exception is found to be raised in any of the handlers for a
given update, it will stop the execution of all other registered
event handlers in the chain.
Think of it like a ``StopIteration`` exception in a for loop.
Example usage:
```
@client.on(events.NewMessage)
def delete(event):
event.delete()
# Other handlers won't have an event to work with
raise StopPropagation
@client.on(events.NewMessage)
def _(event):
# Will never be reached, because it is the second handler in the chain.
pass
```
"""

View File

@ -1885,7 +1885,15 @@ class TelegramClient(TelegramBareClient):
event = builder.build(update) event = builder.build(update)
if event: if event:
event._client = self event._client = self
try:
callback(event) callback(event)
except events.StopPropagation:
__log__.debug(
"Event handler '{}' stopped chain of "
"propagation for event {}."
.format(callback.__name__, type(event).__name__)
)
break
def add_event_handler(self, callback, event=None): def add_event_handler(self, callback, event=None):
""" """