Files
PrimoGuardBot/bot/filters/spam.py

112 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Фильтры для проверки сообщений на спам и банворды
"""
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