forked from Muzifs/LGBot
Исправление конкуренции обработчиков
This commit is contained in:
39
src/main.py
39
src/main.py
@@ -53,14 +53,16 @@ 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):
|
||||
# Логируем ВСЕ входящие сообщения для отладки
|
||||
@@ -73,7 +75,11 @@ class UserUpdateMiddleware(BaseMiddleware):
|
||||
nickname=message.from_user.first_name,
|
||||
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:
|
||||
@@ -83,13 +89,36 @@ class UserUpdateMiddleware(BaseMiddleware):
|
||||
tag=new_member.username
|
||||
)
|
||||
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():
|
||||
|
@@ -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)")
|
Reference in New Issue
Block a user