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

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,13 +53,15 @@ init_action_reporter(bot, int(os.getenv("ADMIN_CHAT_ID")), int(os.getenv("LOG_TH
logger = logging.getLogger(__name__)
# Middleware для автоматического обновления информации о пользователях в базе данных
# И проверки на нецензурную лексику (выполняется ДО всех обработчиков)
class UserUpdateMiddleware(BaseMiddleware):
def __init__(self, db):
def __init__(self, db, bot):
super().__init__()
# message - все обычные сообщения
# chat_member - события изменения статуса участников чата
self.update_types = ['message', 'chat_member']
self.db = db
self.bot = bot
# Обработчик, вызываемый ДО обработки сообщения основными хэндлерами
async def pre_process(self, message, data):
@@ -74,6 +76,10 @@ class UserUpdateMiddleware(BaseMiddleware):
tag=message.from_user.username
)
# ВАЖНО: Проверяем на мат ДО передачи другим обработчикам
# Это позволяет auto_mute работать независимо от karma_tracker
await self._check_profanity(message)
# Обработка новых участников группы
elif message.content_type == 'new_chat_members':
for new_member in message.new_chat_members:
@@ -84,12 +90,35 @@ class UserUpdateMiddleware(BaseMiddleware):
)
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):
pass
# Регистрируем middleware
bot.setup_middleware(UserUpdateMiddleware(db))
bot.setup_middleware(UserUpdateMiddleware(db, bot))
# Загружает все модули из директории /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):
"""
Регистрирует обработчики для автоматического мута.
ПРИМЕЧАНИЕ: Фактическая проверка мата происходит в middleware (main.py),
а не в обработчике. Это позволяет проверять все сообщения ДО того, как
они попадут к другим обработчикам (например, karma_tracker).
Этот метод оставлен для совместимости с архитектурой модулей.
"""
# Обработчик всех текстовых сообщений (кроме команд)
@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("Модуль автоматического мута успешно загружен")
logger.info("Модуль автоматического мута успешно загружен (проверка в middleware)")