From d0cc3a458daca6d80fce12838dd662e9bbb00037 Mon Sep 17 00:00:00 2001 From: Verum Date: Mon, 23 Feb 2026 14:10:59 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BB=D1=8C=D1=82=D1=80=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=82=D0=B8=D0=BF=20=D1=87=D0=B0=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot/filters/chat_type.py | 105 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 bot/filters/chat_type.py diff --git a/bot/filters/chat_type.py b/bot/filters/chat_type.py new file mode 100644 index 0000000..45bbef3 --- /dev/null +++ b/bot/filters/chat_type.py @@ -0,0 +1,105 @@ +""" +Фильтры для проверки типов чатов +""" +from typing import Union + +from aiogram.filters import BaseFilter +from aiogram.types import Message, CallbackQuery +from aiogram.enums import ChatType + +__all__ = ('IsPrivateChat', 'IsGroupChat', 'IsSuperGroupChat', 'IsChannelChat', 'IsAnyGroup') + + +class IsPrivateChat(BaseFilter): + """ + Проверяет, что сообщение из личного чата (приватный диалог с ботом). + + Example: + ```python + @router.message(Command("start"), IsPrivateChat()) + async def start_private(message: Message): + await message.answer("Привет в личке!") + ``` + """ + + async def __call__(self, event: Union[Message, CallbackQuery]) -> bool: + if isinstance(event, CallbackQuery): + event = event.message + + return event.chat.type == ChatType.PRIVATE + + +class IsGroupChat(BaseFilter): + """ + Проверяет, что сообщение из обычной группы (не супергруппы). + + Example: + ```python + @router.message(IsGroupChat()) + async def group_message(message: Message): + await message.answer("Это обычная группа") + ``` + """ + + async def __call__(self, event: Union[Message, CallbackQuery]) -> bool: + if isinstance(event, CallbackQuery): + event = event.message + + return event.chat.type == ChatType.GROUP + + +class IsSuperGroupChat(BaseFilter): + """ + Проверяет, что сообщение из супергруппы. + + Example: + ```python + @router.message(IsSuperGroupChat()) + async def supergroup_message(message: Message): + await message.answer("Это супергруппа") + ``` + """ + + async def __call__(self, event: Union[Message, CallbackQuery]) -> bool: + if isinstance(event, CallbackQuery): + event = event.message + + return event.chat.type == ChatType.SUPERGROUP + + +class IsChannelChat(BaseFilter): + """ + Проверяет, что сообщение из канала. + + Example: + ```python + @router.message(IsChannelChat()) + async def channel_message(message: Message): + await message.answer("Это канал") + ``` + """ + + async def __call__(self, event: Union[Message, CallbackQuery]) -> bool: + if isinstance(event, CallbackQuery): + event = event.message + + return event.chat.type == ChatType.CHANNEL + + +class IsAnyGroup(BaseFilter): + """ + Проверяет, что сообщение из любой группы (обычная или супергруппа). + + Example: + ```python + @router.message(Command("admin"), IsAnyGroup()) + async def admin_command(message: Message): + await message.answer("Команда доступна только в группах") + ``` + """ + + async def __call__(self, event: Union[Message, CallbackQuery]) -> bool: + if isinstance(event, CallbackQuery): + event = event.message + + return event.chat.type in (ChatType.GROUP, ChatType.SUPERGROUP)