Исправление канала с отправкой уведомления о карме в правильный канал

This commit is contained in:
2025-10-19 14:32:55 +03:00
parent 0ee7cb3bd4
commit 1619e82df1
2 changed files with 15 additions and 11 deletions

View File

@@ -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)

View File

@@ -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}")