Исправление конкуренции обработчиков

This commit is contained in:
2025-10-19 13:16:46 +03:00
parent 1595acb4bb
commit 6b41e61d7e
2 changed files with 41 additions and 11 deletions

View File

@@ -53,14 +53,16 @@ init_action_reporter(bot, int(os.getenv("ADMIN_CHAT_ID")), int(os.getenv("LOG_TH
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Middleware для автоматического обновления информации о пользователях в базе данных # Middleware для автоматического обновления информации о пользователях в базе данных
# И проверки на нецензурную лексику (выполняется ДО всех обработчиков)
class UserUpdateMiddleware(BaseMiddleware): class UserUpdateMiddleware(BaseMiddleware):
def __init__(self, db): def __init__(self, db, bot):
super().__init__() super().__init__()
# message - все обычные сообщения # message - все обычные сообщения
# chat_member - события изменения статуса участников чата # chat_member - события изменения статуса участников чата
self.update_types = ['message', 'chat_member'] self.update_types = ['message', 'chat_member']
self.db = db self.db = db
self.bot = bot
# Обработчик, вызываемый ДО обработки сообщения основными хэндлерами # Обработчик, вызываемый ДО обработки сообщения основными хэндлерами
async def pre_process(self, message, data): async def pre_process(self, message, data):
# Логируем ВСЕ входящие сообщения для отладки # Логируем ВСЕ входящие сообщения для отладки
@@ -73,7 +75,11 @@ class UserUpdateMiddleware(BaseMiddleware):
nickname=message.from_user.first_name, nickname=message.from_user.first_name,
tag=message.from_user.username tag=message.from_user.username
) )
# ВАЖНО: Проверяем на мат ДО передачи другим обработчикам
# Это позволяет auto_mute работать независимо от karma_tracker
await self._check_profanity(message)
# Обработка новых участников группы # Обработка новых участников группы
elif message.content_type == 'new_chat_members': elif message.content_type == 'new_chat_members':
for new_member in message.new_chat_members: for new_member in message.new_chat_members:
@@ -83,13 +89,36 @@ class UserUpdateMiddleware(BaseMiddleware):
tag=new_member.username tag=new_member.username
) )
return data return data
# Проверка на нецензурную лексику (вызывается в middleware)
async def _check_profanity(self, message):
"""Проверяет сообщение на мат и применяет мут если нужно"""
from bad_words import contains_bad_word
# Только для групповых чатов и не команды
if message.chat.type not in ['group', 'supergroup']:
return
if not message.text or message.text.startswith('/'):
return
# Проверяем наличие мата
if not contains_bad_word(message.text):
return
# Импортируем функцию проверки из auto_mute (если модуль загружен)
try:
from modules.auto_mute import check_message_for_profanity
await check_message_for_profanity(self.bot, message)
except ImportError:
logger.warning("Модуль auto_mute не загружен, пропускаем проверку мата")
# Обработчик, вызываемый ПОСЛЕ обработки сообщения основными хэндлерами # Обработчик, вызываемый ПОСЛЕ обработки сообщения основными хэндлерами
async def post_process(self, message, data, exception): async def post_process(self, message, data, exception):
pass pass
# Регистрируем middleware # Регистрируем middleware
bot.setup_middleware(UserUpdateMiddleware(db)) bot.setup_middleware(UserUpdateMiddleware(db, bot))
# Загружает все модули из директории /modules # Загружает все модули из директории /modules
async def load_modules(): async def load_modules():

View File

@@ -202,11 +202,12 @@ async def check_message_for_profanity(bot: AsyncTeleBot, message: Message):
def register_handlers(bot: AsyncTeleBot): def register_handlers(bot: AsyncTeleBot):
""" """
Регистрирует обработчики для автоматического мута. Регистрирует обработчики для автоматического мута.
ПРИМЕЧАНИЕ: Фактическая проверка мата происходит в middleware (main.py),
а не в обработчике. Это позволяет проверять все сообщения ДО того, как
они попадут к другим обработчикам (например, karma_tracker).
Этот метод оставлен для совместимости с архитектурой модулей.
""" """
# Обработчик всех текстовых сообщений (кроме команд) logger.info("Модуль автоматического мута успешно загружен (проверка в middleware)")
@bot.message_handler(func=lambda message: message.text and not message.text.startswith('/') and message.chat.type in ['group', 'supergroup'])
async def handle_text_message(message: Message):
await check_message_for_profanity(bot, message)
logger.info("Модуль автоматического мута успешно загружен")