diff --git a/src/main.py b/src/main.py index 941e21a..8fa75ed 100644 --- a/src/main.py +++ b/src/main.py @@ -81,8 +81,10 @@ class UserUpdateMiddleware(BaseMiddleware): try: karma_module = importlib.import_module("modules.0_karma_tracker") if message.chat.type in ['group', 'supergroup']: - karma_module._cache_message(message.chat.id, message.message_id, message.from_user.id) - logger.info(f"[CACHE] Сообщение {message.message_id} от {message.from_user.id} добавлено в кэш, chat_id={message.chat.id}") + # Передаём message_thread_id для правильной отправки уведомлений в топики + thread_id = getattr(message, 'message_thread_id', None) + karma_module._cache_message(message.chat.id, message.message_id, message.from_user.id, thread_id) + logger.info(f"[CACHE] Сообщение {message.message_id} от {message.from_user.id} добавлено в кэш, chat_id={message.chat.id}, thread_id={thread_id}") except Exception as e: logger.error(f"Ошибка кэширования сообщения: {e}", exc_info=True) diff --git a/src/modules/0_karma_tracker.py b/src/modules/0_karma_tracker.py index ba33b94..c289039 100644 --- a/src/modules/0_karma_tracker.py +++ b/src/modules/0_karma_tracker.py @@ -11,22 +11,22 @@ from config import THANK_COOLDOWN logger = logging.getLogger(__name__) -# Кэш для хранения message_id -> user_id (последние 1000 сообщений) +# Кэш для хранения message_id -> (user_id, message_thread_id) (последние 1000 сообщений) # Используем OrderedDict для автоматического удаления старых записей _message_cache = OrderedDict() _MAX_CACHE_SIZE = 1000 -def _cache_message(chat_id: int, message_id: int, user_id: int): +def _cache_message(chat_id: int, message_id: int, user_id: int, message_thread_id: int = None): """Добавляет сообщение в кэш""" key = f"{chat_id}:{message_id}" - _message_cache[key] = user_id + _message_cache[key] = (user_id, message_thread_id) # Удаляем старые записи, если кэш переполнен if len(_message_cache) > _MAX_CACHE_SIZE: _message_cache.popitem(last=False) -def _get_cached_user(chat_id: int, message_id: int) -> int: - """Получает user_id из кэша""" +def _get_cached_message(chat_id: int, message_id: int): + """Получает (user_id, message_thread_id) из кэша""" key = f"{chat_id}:{message_id}" return _message_cache.get(key) @@ -55,12 +55,14 @@ def register_handlers(bot: AsyncTeleBot): from_user = reaction.user chat_id = reaction.chat.id - # Получаем автора сообщения из кэша - to_user_id = _get_cached_user(chat_id, reaction.message_id) - if not to_user_id: + # Получаем автора сообщения и топик из кэша + cached_data = _get_cached_message(chat_id, reaction.message_id) + if not cached_data: logger.warning(f"[KARMA] Сообщение {reaction.message_id} не найдено в кэше") return + to_user_id, message_thread_id = cached_data + # Защита от самооценки if from_user.id == to_user_id: logger.info(f"Пользователь {from_user.id} попытался поставить реакцию на своё сообщение") @@ -147,7 +149,7 @@ def register_handlers(bot: AsyncTeleBot): sent_message = await bot.send_message( chat_id, response, - message_thread_id=getattr(reaction, 'message_thread_id', None) + message_thread_id=message_thread_id ) logger.info(f"[KARMA] Уведомление отправлено успешно, message_id={sent_message.message_id}")