diff --git a/telethon/events/callbackquery.py b/telethon/events/callbackquery.py index c35e348b..d1558d21 100644 --- a/telethon/events/callbackquery.py +++ b/telethon/events/callbackquery.py @@ -118,8 +118,10 @@ class CallbackQuery(EventBuilder): elif event.query.data != self.match: return - if not self.func or self.func(event): - return event + if self.func: + # Return the result of func directly as it may need to be awaited + return self.func(event) + return True class Event(EventCommon, SenderGetter): """ diff --git a/telethon/events/common.py b/telethon/events/common.py index f2ca12a7..f5ff5b50 100644 --- a/telethon/events/common.py +++ b/telethon/events/common.py @@ -105,9 +105,8 @@ class EventBuilder(abc.ABC): def filter(self, event): """ - If the ID of ``event._chat_peer`` isn't in the chats set (or it is - but the set is a blacklist) returns `True`, otherwise `False`. - May also return awaitable which awaits to bool-able value. + Returns a truthy value if the event passed the filter and should be + used, or falsy otherwise. The return value may need to be awaited. The events must have been resolved before this can be called. """ diff --git a/telethon/events/raw.py b/telethon/events/raw.py index 912a934d..84910778 100644 --- a/telethon/events/raw.py +++ b/telethon/events/raw.py @@ -46,6 +46,8 @@ class Raw(EventBuilder): return update def filter(self, event): - if ((not self.types or isinstance(event, self.types)) - and (not self.func or self.func(event))): + if not self.types or isinstance(event, self.types): + if self.func: + # Return the result of func directly as it may need to be awaited + return self.func(event) return event diff --git a/telethon/tl/custom/conversation.py b/telethon/tl/custom/conversation.py index 663acc08..46b67aa8 100644 --- a/telethon/tl/custom/conversation.py +++ b/telethon/tl/custom/conversation.py @@ -316,7 +316,9 @@ class Conversation(ChatGetter): if inst: filter = ev.filter(inst) - filter = (await filter) if inspect.isawaitable(filter) else filter + if inspect.isawaitable(filter): + filter = await filter + if filter: fut.set_result(inst) del self._custom[key]