Give Filters.regex superpowers

Basically make it work on Message, CallbackQuery and InlineQuery updates
This commit is contained in:
Dan 2020-05-16 00:35:05 +02:00
parent 0556efa26b
commit 27d5caf40e
3 changed files with 40 additions and 15 deletions

View File

@ -20,6 +20,7 @@ import re
from typing import Callable from typing import Callable
from .filter import Filter from .filter import Filter
from ..types import Message, CallbackQuery, InlineQuery
from ..types.bots_and_keyboards import InlineKeyboardMarkup, ReplyKeyboardMarkup from ..types.bots_and_keyboards import InlineKeyboardMarkup, ReplyKeyboardMarkup
CUSTOM_FILTER_NAME = "CustomFilter" CUSTOM_FILTER_NAME = "CustomFilter"
@ -288,26 +289,39 @@ class Filters:
) )
@staticmethod @staticmethod
def regex(pattern, flags: int = 0): def regex(pattern: str, flags: int = 0):
"""Filter message texts or captions that match a given regular expression pattern. """Filter updates that match a given regular expression pattern.
Can be applied to handlers that receive one of the following updates:
- :obj:`Message`: The filter will match ``text`` or ``caption``.
- :obj:`CallbackQuery`: The filter will match ``data``.
- :obj:`InlineQuery`: The filter will match ``query``.
When a pattern matches, all the `Match Objects <https://docs.python.org/3/library/re.html#match-objects>`_ are
stored in the ``matches`` field of the update object itself.
Parameters: Parameters:
pattern (``str``): pattern (``str``):
The RegEx pattern as string, it will be applied to the text or the caption of a message. When a pattern The regex pattern as string.
matches, all the `Match Objects <https://docs.python.org/3/library/re.html#match-objects>`_ are stored
in the *matches* field of the :obj:`Message` itself.
flags (``int``, *optional*): flags (``int``, *optional*):
RegEx flags. Regex flags.
""" """
def func(flt, message): def func(flt, update):
text = message.text or message.caption if isinstance(update, Message):
value = update.text or update.caption
elif isinstance(update, CallbackQuery):
value = update.data
elif isinstance(update, InlineQuery):
value = update.query
else:
raise ValueError("Regex filter doesn't work with {}".format(type(update)))
if text: update.matches = list(flt.p.finditer(value)) or None
message.matches = list(flt.p.finditer(text)) or None
return bool(message.matches) return bool(update.matches)
return create(func, "RegexFilter", p=re.compile(pattern, flags)) return create(func, "RegexFilter", p=re.compile(pattern, flags))

View File

@ -18,7 +18,7 @@
from base64 import b64encode from base64 import b64encode
from struct import pack from struct import pack
from typing import Union from typing import Union, List, Match
import pyrogram import pyrogram
from pyrogram.api import types from pyrogram.api import types
@ -59,6 +59,9 @@ class CallbackQuery(Object, Update):
game_short_name (``str``, *optional*): game_short_name (``str``, *optional*):
Short name of a Game to be returned, serves as the unique identifier for the game. Short name of a Game to be returned, serves as the unique identifier for the game.
matches (List of regex Matches, *optional*):
A list containing all `Match Objects <https://docs.python.org/3/library/re.html#match-objects>`_ that match
the data of this callback query. Only applicable when using :obj:`Filters.regex <pyrogram.Filters.regex>`.
""" """
def __init__( def __init__(
@ -71,7 +74,8 @@ class CallbackQuery(Object, Update):
message: "pyrogram.Message" = None, message: "pyrogram.Message" = None,
inline_message_id: str = None, inline_message_id: str = None,
data: Union[str, bytes] = None, data: Union[str, bytes] = None,
game_short_name: str = None game_short_name: str = None,
matches: List[Match] = None
): ):
super().__init__(client) super().__init__(client)
@ -82,6 +86,7 @@ class CallbackQuery(Object, Update):
self.inline_message_id = inline_message_id self.inline_message_id = inline_message_id
self.data = data self.data = data
self.game_short_name = game_short_name self.game_short_name = game_short_name
self.matches = matches
@staticmethod @staticmethod
def _parse(client, callback_query, users) -> "CallbackQuery": def _parse(client, callback_query, users) -> "CallbackQuery":

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import List from typing import List, Match
import pyrogram import pyrogram
from pyrogram.api import types from pyrogram.api import types
@ -47,6 +47,10 @@ class InlineQuery(Object, Update):
location (:obj:`Location`. *optional*): location (:obj:`Location`. *optional*):
Sender location, only for bots that request user location. Sender location, only for bots that request user location.
matches (List of regex Matches, *optional*):
A list containing all `Match Objects <https://docs.python.org/3/library/re.html#match-objects>`_ that match
the query of this inline query. Only applicable when using :obj:`Filters.regex <pyrogram.Filters.regex>`.
""" """
def __init__( def __init__(
@ -57,7 +61,8 @@ class InlineQuery(Object, Update):
from_user: User, from_user: User,
query: str, query: str,
offset: str, offset: str,
location: Location = None location: Location = None,
matches: List[Match] = None
): ):
super().__init__(client) super().__init__(client)
@ -66,6 +71,7 @@ class InlineQuery(Object, Update):
self.query = query self.query = query
self.offset = offset self.offset = offset
self.location = location self.location = location
self.matches = matches
@staticmethod @staticmethod
def _parse(client, inline_query: types.UpdateBotInlineQuery, users: dict) -> "InlineQuery": def _parse(client, inline_query: types.UpdateBotInlineQuery, users: dict) -> "InlineQuery":