diff --git a/aiogram/dispatcher/dispatcher.py b/aiogram/dispatcher/dispatcher.py index a2736cf7..d471fe86 100644 --- a/aiogram/dispatcher/dispatcher.py +++ b/aiogram/dispatcher/dispatcher.py @@ -11,7 +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, ForwardedMessageFilter, \ - IsSenderContact, ChatTypeFilter, AbstractFilter + IsSenderContact, ChatTypeFilter, MediaGroupFilter, AbstractFilter from .handler import Handler from .middlewares import MiddlewareManager from .storage import BaseStorage, DELTA, DisabledStorage, EXCEEDED_COUNT, FSMContext, \ @@ -204,6 +204,12 @@ class Dispatcher(DataMixin, ContextInstanceMixin): self.my_chat_member_handlers, self.chat_member_handlers ]) + filters_factory.bind(MediaGroupFilter, event_handlers=[ + self.message_handlers, + self.edited_channel_post_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 d64a2667..d07d953b 100644 --- a/aiogram/dispatcher/filters/__init__.py +++ b/aiogram/dispatcher/filters/__init__.py @@ -1,7 +1,7 @@ from .builtin import Command, CommandHelp, CommandPrivacy, CommandSettings, CommandStart, ContentTypeFilter, \ ExceptionsFilter, HashTag, Regexp, RegexpCommandsFilter, StateFilter, \ Text, IDFilter, AdminFilter, IsReplyFilter, IsSenderContact, ForwardedMessageFilter, \ - ChatTypeFilter + ChatTypeFilter, MediaGroupFilter from .factory import FiltersFactory from .filters import AbstractFilter, BoundFilter, Filter, FilterNotPassed, FilterRecord, execute_filter, \ check_filters, get_filter_spec, get_filters_spec @@ -25,6 +25,7 @@ __all__ = ( 'IsSenderContact', 'ForwardedMessageFilter', 'ChatTypeFilter', + 'MediaGroupFilter', 'FiltersFactory', 'AbstractFilter', 'BoundFilter', diff --git a/aiogram/dispatcher/filters/builtin.py b/aiogram/dispatcher/filters/builtin.py index 762c8505..c32c53be 100644 --- a/aiogram/dispatcher/filters/builtin.py +++ b/aiogram/dispatcher/filters/builtin.py @@ -738,3 +738,20 @@ class ChatTypeFilter(BoundFilter): return False return obj.type in self.chat_type + + +class MediaGroupFilter(BoundFilter): + """ + Check if message is part of a media group. + + `is_media_group=True` - the message is part of a media group + `is_media_group=False` - the message is NOT part of a media group + """ + + key = "is_media_group" + + def __init__(self, is_media_group: bool): + self.is_media_group = is_media_group + + async def check(self, message: types.Message) -> bool: + return bool(getattr(message, "media_group_id")) is self.is_media_group diff --git a/docs/source/dispatcher/filters.rst b/docs/source/dispatcher/filters.rst index b8f4962e..a47e396e 100644 --- a/docs/source/dispatcher/filters.rst +++ b/docs/source/dispatcher/filters.rst @@ -155,6 +155,14 @@ ChatTypeFilter .. autoclass:: aiogram.dispatcher.filters.ChatTypeFilter :members: :show-inheritance: + + +MediaGroupFilter +------------- + +.. autoclass:: aiogram.dispatcher.filters.MediaGroupFilter + :members: + :show-inheritance: Making own filters (Custom filters)