""" Фильтры для проверки сообщений на спам и банворды """ from typing import Optional, Callable from aiogram.filters import BaseFilter from aiogram.types import Message from middleware.loggers import logger __all__ = ('HasSpam', 'IsWhitelisted') class HasSpam(BaseFilter): """ Проверяет, содержит ли сообщение запрещенные слова (спам). Attributes: check_spam_func: Функция проверки спама (передается при инициализации) Example: ```python from utils.spam_checker import check_spam @router.message(HasSpam(check_spam)) async def spam_detected(message: Message): await message.delete() await message.answer("⚠️ Сообщение содержит запрещенные слова") ``` """ def __init__(self, check_spam_func: Callable[[str], bool]): """ Args: check_spam_func: Функция для проверки спама """ self.check_spam = check_spam_func async def __call__(self, message: Message) -> Optional[dict]: """ Проверка сообщения на спам. Returns: dict или None: Информация о найденном спаме или None """ if not message.text: return None text_lower = message.text.lower() has_spam = self.check_spam(text_lower) if has_spam: logger.warning( f"Обнаружен спам в сообщении", log_type='SPAM', message=message ) return {'has_spam': True, 'text': text_lower} return None class IsWhitelisted(BaseFilter): """ Проверяет, содержит ли сообщение слова из белого списка (исключения). Используется для защиты от ложных срабатываний спам-фильтра. Attributes: check_whitelist_func: Функция проверки белого списка Example: ```python from utils.spam_checker import check_whitelist @router.message(IsWhitelisted(check_whitelist)) async def whitelisted_message(message: Message): # Сообщение содержит исключение, пропускаем проверку спама pass ``` """ def __init__(self, check_whitelist_func: Callable[[str], bool]): """ Args: check_whitelist_func: Функция для проверки белого списка """ self.check_whitelist = check_whitelist_func async def __call__(self, message: Message) -> Optional[bool]: """ Проверка на наличие в белом списке. Returns: bool или None: True если в белом списке, None если нет """ if not message.text: return None text_lower = message.text.lower() is_whitelisted = self.check_whitelist(text_lower) if is_whitelisted: logger.debug( f"Сообщение содержит исключение из белого списка", log_type='WHITELIST', message=message ) return True return None