Add pattern to CallbackQuery event.

This commit is contained in:
painor 2019-06-26 16:53:24 +01:00
parent b6fe38f2ae
commit 86e1a98d87

View File

@ -26,9 +26,13 @@ class CallbackQuery(EventBuilder):
can use ``re.compile(b'data_')``. can use ``re.compile(b'data_')``.
""" """
def __init__( def __init__(
self, chats=None, *, blacklist_chats=False, func=None, data=None): self, chats=None, *, blacklist_chats=False, func=None, data=None, pattern=None):
super().__init__(chats, blacklist_chats=blacklist_chats, func=func) super().__init__(chats, blacklist_chats=blacklist_chats, func=func)
if data is None and pattern is None:
self._log.warn("Please don't use both data and pattern.data will be ignored if you do so")
data = None
if isinstance(data, bytes): if isinstance(data, bytes):
self.data = data self.data = data
elif isinstance(data, str): elif isinstance(data, str):
@ -44,6 +48,19 @@ class CallbackQuery(EventBuilder):
else: else:
raise TypeError('Invalid data type given') raise TypeError('Invalid data type given')
if isinstance(pattern, str):
self.pattern = re.compile(pattern).match
elif not pattern or callable(pattern):
self.pattern = pattern
elif hasattr(pattern, 'match') and callable(pattern.match):
self.pattern = pattern.match
else:
raise TypeError('Invalid pattern type given')
self._no_check = all(x is None for x in (
self.chats, self.func, self.data, self.pattern,
))
@classmethod @classmethod
def build(cls, update): def build(cls, update):
if isinstance(update, types.UpdateBotCallbackQuery): if isinstance(update, types.UpdateBotCallbackQuery):
@ -62,6 +79,9 @@ class CallbackQuery(EventBuilder):
def filter(self, event): def filter(self, event):
# We can't call super().filter(...) because it ignores chat_instance # We can't call super().filter(...) because it ignores chat_instance
if self._no_check:
return event
if self.chats is not None: if self.chats is not None:
inside = event.query.chat_instance in self.chats inside = event.query.chat_instance in self.chats
if event.chat_id: if event.chat_id:
@ -78,6 +98,12 @@ class CallbackQuery(EventBuilder):
elif event.query.data != self.data: elif event.query.data != self.data:
return None return None
if self.pattern:
match = self.pattern(event.message.message or '')
if not match:
return
event.pattern_match = match
if not self.func or self.func(event): if not self.func or self.func(event):
return event return event