From 036c92d072d465e1f704ce18f8218ecee0b29746 Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 3 Aug 2025 13:57:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BD=D0=B0=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=20Command,=20CommandStart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- maxapi/filters/command.py | 116 ++++++++++++++++++++++++++++++++++++++ maxapi/types/__init__.py | 3 +- maxapi/types/command.py | 44 +-------------- 3 files changed, 119 insertions(+), 44 deletions(-) create mode 100644 maxapi/filters/command.py diff --git a/maxapi/filters/command.py b/maxapi/filters/command.py new file mode 100644 index 0000000..709d07c --- /dev/null +++ b/maxapi/filters/command.py @@ -0,0 +1,116 @@ +from typing import List, Tuple + +from ..types.updates import UpdateUnion +from ..filters.filter import BaseFilter + +from ..types.updates.message_created import MessageCreated + + +class Command(BaseFilter): + + """ + Фильтр сообщений на соответствие команде. + + Args: + commands (str | list[str]): Ожидаемая команда или список команд без префикса. + prefix (str, optional): Префикс команды (по умолчанию '/'). + check_case (bool, optional): Учитывать регистр при сравнении (по умолчанию False). + + Attributes: + commands (list[str]): Список команд без префикса. + prefix (str): Префикс команды. + check_case (bool): Флаг чувствительности к регистру. + """ + + def __init__(self, commands: str | List[str], prefix: str = '/', check_case: bool = False): + + """ + Инициализация фильтра команд. + """ + + if isinstance(commands, str): + self.commands = [commands] + else: + self.commands = commands + + self.prefix = prefix + self.check_case = check_case + + if not check_case: + self.commands = [cmd.lower() for cmd in self.commands] + + def parse_command(self, text: str) -> Tuple[str, List[str]]: + + """ + Извлекает команду из текста. + + Args: + text (str): Текст сообщения. + + Returns: + Optional[str]: Найденная команда с префиксом, либо None. + """ + + args = text.split() + first = args[0] + + if not first.startswith(self.prefix): + return '', [] + + return first[len(self.prefix):], args + + async def __call__(self, event: UpdateUnion): + + """ + Проверяет, соответствует ли сообщение заданной(ым) команде(ам). + + Args: + event (MessageCreated): Событие сообщения. + + Returns: + bool: True, если команда совпадает, иначе False. + """ + + if not isinstance(event, MessageCreated): + return False + + text = event.message.body.text + + if not text: + return False + + parsed_command, args = self.parse_command(text) + if not parsed_command: + return False + + if not self.check_case: + if parsed_command.lower() in [commands.lower() for commands in self.commands]: + return {'args': args} + else: + return False + + if parsed_command in self.commands: + return {'args': args} + + return False + + +class CommandStart(Command): + + """ + Фильтр для команды /start. + + Args: + prefix (str, optional): Префикс команды (по умолчанию '/'). + check_case (bool, optional): Учитывать регистр (по умолчанию False). + """ + + def __init__(self, prefix = '/', check_case = False): + super().__init__( + 'start', + prefix, + check_case + ) + + async def __call__(self, event): + return await super().__call__(event) \ No newline at end of file diff --git a/maxapi/types/__init__.py b/maxapi/types/__init__.py index f84947d..0e3792b 100644 --- a/maxapi/types/__init__.py +++ b/maxapi/types/__init__.py @@ -31,7 +31,8 @@ from ..types.attachments.buttons.message_button import MessageButton from ..types.attachments.image import PhotoAttachmentRequestPayload from ..types.message import Message, NewMessageLink -from ..types.command import Command, BotCommand, CommandStart +from ..filters.command import Command, CommandStart +from ..types.command import BotCommand from .input_media import InputMedia from .input_media import InputMediaBuffer diff --git a/maxapi/types/command.py b/maxapi/types/command.py index 0625d19..8b3b95b 100644 --- a/maxapi/types/command.py +++ b/maxapi/types/command.py @@ -1,32 +1,5 @@ from typing import Optional from pydantic import BaseModel - - -class Command: - - """ - Класс для представления команды бота. - - Attributes: - text (str): Текст команды без префикса. - prefix (str): Префикс команды. По умолчанию '/'. - """ - - def __init__(self, text: str, prefix: str = '/'): - self.text = text - self.prefix = prefix - - @property - def command(self): - - """ - Возвращает полную команду с префиксом. - - Returns: - str: Команда, состоящая из префикса и текста. - """ - - return self.prefix + self.text class BotCommand(BaseModel): @@ -40,19 +13,4 @@ class BotCommand(BaseModel): """ name: str - description: Optional[str] = None - - -class CommandStart(Command): - - """ - Класс для представления команды /start бота. - - Attributes: - prefix (str): Префикс команды. По умолчанию '/'. - """ - - text = 'start' - - def __init__(self, prefix: str = '/'): - self.prefix = prefix \ No newline at end of file + description: Optional[str] = None \ No newline at end of file