From 5db726d7585c5252343642f1201c4775ac47bfeb Mon Sep 17 00:00:00 2001 From: Alex Root Junior Date: Thu, 23 Jan 2020 23:13:07 +0200 Subject: [PATCH] Add IsSenderContact filter --- aiogram/dispatcher/dispatcher.py | 7 +++++++ aiogram/dispatcher/filters/__init__.py | 3 ++- aiogram/dispatcher/filters/builtin.py | 22 ++++++++++++++++++++++ docs/source/dispatcher/filters.rst | 6 ++++++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/aiogram/dispatcher/dispatcher.py b/aiogram/dispatcher/dispatcher.py index dc793b76..ec4a3fa8 100644 --- a/aiogram/dispatcher/dispatcher.py +++ b/aiogram/dispatcher/dispatcher.py @@ -11,6 +11,7 @@ from aiohttp.helpers import sentinel from aiogram.utils.deprecated import renamed_argument from .filters import Command, ContentTypeFilter, ExceptionsFilter, FiltersFactory, HashTag, Regexp, \ RegexpCommandsFilter, StateFilter, Text, IDFilter, AdminFilter, IsReplyFilter +from .filters.builtin import IsSenderContact from .handler import Handler from .middlewares import MiddlewareManager from .storage import BaseStorage, DELTA, DisabledStorage, EXCEEDED_COUNT, FSMContext, \ @@ -153,6 +154,12 @@ class Dispatcher(DataMixin, ContextInstanceMixin): self.channel_post_handlers, self.edited_channel_post_handlers, ]) + filters_factory.bind(IsSenderContact, event_handlers=[ + self.message_handlers, + self.edited_message_handlers, + self.channel_post_handlers, + self.edited_channel_post_handlers, + ]) def __del__(self): self.stop_polling() diff --git a/aiogram/dispatcher/filters/__init__.py b/aiogram/dispatcher/filters/__init__.py index 67c13872..6de3cc7a 100644 --- a/aiogram/dispatcher/filters/__init__.py +++ b/aiogram/dispatcher/filters/__init__.py @@ -1,6 +1,6 @@ from .builtin import Command, CommandHelp, CommandPrivacy, CommandSettings, CommandStart, ContentTypeFilter, \ ExceptionsFilter, HashTag, Regexp, RegexpCommandsFilter, StateFilter, \ - Text, IDFilter, AdminFilter, IsReplyFilter + Text, IDFilter, AdminFilter, IsReplyFilter, IsSenderContact from .factory import FiltersFactory from .filters import AbstractFilter, BoundFilter, Filter, FilterNotPassed, FilterRecord, execute_filter, \ check_filters, get_filter_spec, get_filters_spec @@ -26,6 +26,7 @@ __all__ = [ 'Text', 'IDFilter', 'IsReplyFilter', + 'IsSenderContact', 'AdminFilter', 'get_filter_spec', 'get_filters_spec', diff --git a/aiogram/dispatcher/filters/builtin.py b/aiogram/dispatcher/filters/builtin.py index 683ee841..0a81998a 100644 --- a/aiogram/dispatcher/filters/builtin.py +++ b/aiogram/dispatcher/filters/builtin.py @@ -453,6 +453,28 @@ class ContentTypeFilter(BoundFilter): message.content_type in self.content_types +class IsSenderContact(BoundFilter): + """ + Filter check that the contact matches the sender + + `is_sender_contact=True` - contact matches the sender + `is_sender_contact=False` - result will be inverted + """ + key = 'is_sender_contact' + + def __init__(self, is_sender_contact: bool): + self.is_sender_contact = is_sender_contact + + async def check(self, message: types.Message) -> bool: + if not message.contact: + return False + is_sender_contact = message.contact.user_id == message.from_user.id + if self.is_sender_contact: + return is_sender_contact + else: + return not is_sender_contact + + class StateFilter(BoundFilter): """ Check user state diff --git a/docs/source/dispatcher/filters.rst b/docs/source/dispatcher/filters.rst index b174f1ef..af06b73e 100644 --- a/docs/source/dispatcher/filters.rst +++ b/docs/source/dispatcher/filters.rst @@ -94,6 +94,12 @@ ContentTypeFilter :members: :show-inheritance: +IsSenderContact +--------------- + +.. autoclass:: aiogram.dispatcher.filters.builtin.IsSenderContact + :members: + :show-inheritance: StateFilter -----------