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__)
|
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():
|
||||||
|
@@ -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("Модуль автоматического мута успешно загружен")
|
|
Reference in New Issue
Block a user