From c257c6c1a2f529bff3f3a5eedba3170f435c786c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=A5=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BE=D0=B2?= Date: Mon, 20 Oct 2025 09:19:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D0=BC=D1=8B=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=B2=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=20=D0=BA=D0=B0=D1=80=D0=BC=D1=8B=20=D0=A3=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=BE=20=D0=BA=D1=8D=D1=88=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BE=D1=82=20=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.py | 24 +++--- src/modules/0_karma_tracker.py | 135 ++++++++++++++++++--------------- 2 files changed, 85 insertions(+), 74 deletions(-) diff --git a/src/main.py b/src/main.py index b5dd683..a327724 100644 --- a/src/main.py +++ b/src/main.py @@ -81,22 +81,22 @@ class UserUpdateMiddleware(BaseMiddleware): tag=message.from_user.username ) - # ВАЖНО: Кэшируем сообщение для обработки реакций - # Импортируем функцию кэширования из 0_karma_tracker - try: - karma_module = importlib.import_module("modules.0_karma_tracker") - if message.chat.type in ['group', 'supergroup']: - # Передаём 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) - # ВАЖНО: Проверяем на мат ДО передачи другим обработчикам # Это позволяет auto_mute работать независимо от karma_tracker await self._check_profanity(message) + # ВАЖНО: Кэшируем ВСЕ сообщения для обработки реакций (не только текстовые!) + # Пользователи могут ставить реакции на фото, видео, стикеры и т.д. + try: + karma_module = importlib.import_module("modules.0_karma_tracker") + if message.chat.type in ['group', 'supergroup']: + # Передаём 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) + # Обработка новых участников группы elif message.content_type == 'new_chat_members': for new_member in message.new_chat_members: diff --git a/src/modules/0_karma_tracker.py b/src/modules/0_karma_tracker.py index d94b050..aed6ef9 100644 --- a/src/modules/0_karma_tracker.py +++ b/src/modules/0_karma_tracker.py @@ -84,6 +84,10 @@ def register_handlers(bot: AsyncTeleBot): logger.warning(f"[KARMA] Пользователь {to_user_id} не найден в БД") return + # Примечание: мы не проверяем является ли to_user_id ботом, т.к.: + # 1. Сообщения ботов не кэшируются (только пользовательские) + # 2. Если бот все же попал в кэш, это исключительный случай и не критично + # Проверяем старые реакции old_thumbs_up = False old_thumbs_down = False @@ -124,69 +128,61 @@ def register_handlers(bot: AsyncTeleBot): elif react.emoji == "🔥": new_fire = True - # Определяем изменение кармы + # Определяем изменение кармы (накапливаем все изменения) karma_change = 0 - action_emoji = "" - action_text = "" + actions = [] # Список всех действий для логирования - # Логика изменения кармы + # Логика изменения кармы - проверяем ВСЕ реакции (не elif!) + # Это важно, т.к. пользователь может менять реакции (убрать 👍 и поставить 🔥) + + # Проверяем 👍 if new_thumbs_up and not old_thumbs_up: - # Добавили 👍 - karma_change = 1 - action_emoji = "👍" - action_text = "поставил 👍" + karma_change += 1 + actions.append("поставил 👍 (+1)") elif old_thumbs_up and not new_thumbs_up: - # Убрали 👍 - karma_change = -1 - action_emoji = "👍" - action_text = "убрал 👍" - elif new_thumbs_down and not old_thumbs_down: - # Добавили 👎 - karma_change = -1 - action_emoji = "👎" - action_text = "поставил 👎" + karma_change -= 1 + actions.append("убрал 👍 (-1)") + + # Проверяем 👎 + if new_thumbs_down and not old_thumbs_down: + karma_change -= 1 + actions.append("поставил 👎 (-1)") elif old_thumbs_down and not new_thumbs_down: - # Убрали 👎 - karma_change = 1 - action_emoji = "👎" - action_text = "убрал 👎" - elif new_heart and not old_heart: - # Добавили ❤ - karma_change = 5 - action_emoji = "❤" - action_text = "поставил ❤" + karma_change += 1 + actions.append("убрал 👎 (+1)") + + # Проверяем ❤ + if new_heart and not old_heart: + karma_change += 5 + actions.append("поставил ❤ (+5)") elif old_heart and not new_heart: - # Убрали ❤ - karma_change = -5 - action_emoji = "❤" - action_text = "убрал ❤" - elif new_fire_heart and not old_fire_heart: - # Добавили ❤‍🔥 - karma_change = 10 - action_emoji = "❤‍🔥" - action_text = "поставил ❤‍🔥" + karma_change -= 5 + actions.append("убрал ❤ (-5)") + + # Проверяем ❤‍🔥 + if new_fire_heart and not old_fire_heart: + karma_change += 10 + actions.append("поставил ❤‍🔥 (+10)") elif old_fire_heart and not new_fire_heart: - # Убрали ❤‍🔥 - karma_change = -10 - action_emoji = "❤‍🔥" - action_text = "убрал ❤‍🔥" - elif new_fire and not old_fire: - # Добавили 🔥 - karma_change = 2 - action_emoji = "🔥" - action_text = "поставил 🔥" + karma_change -= 10 + actions.append("убрал ❤‍🔥 (-10)") + + # Проверяем 🔥 + if new_fire and not old_fire: + karma_change += 2 + actions.append("поставил 🔥 (+2)") elif old_fire and not new_fire: - # Убрали 🔥 - karma_change = -2 - action_emoji = "🔥" - action_text = "убрал 🔥" + karma_change -= 2 + actions.append("убрал 🔥 (-2)") # Если нет изменений - выходим if karma_change == 0: logger.info(f"[KARMA] Нет изменений в реакциях") return - logger.info(f"[KARMA] {action_text} от {from_user.id} для {to_user_id}, изменение кармы: {karma_change}") + # Формируем текст действий для логирования + action_text = ", ".join(actions) + logger.info(f"[KARMA] {action_text} от {from_user.id} для {to_user_id}, итоговое изменение кармы: {karma_change}") # Изменяем карму db.add_karma(to_user_id, chat_id, karma_change) @@ -197,10 +193,23 @@ def register_handlers(bot: AsyncTeleBot): # Формируем имя пользователя (из БД: id, nickname, tag) to_user_display = f"@{to_user_info[2]}" if to_user_info[2] else to_user_info[1] + # Формируем эмодзи для уведомления (берем первое действие или дефолтное) + notification_emoji = "⭐" + if "👍" in action_text: + notification_emoji = "👍" + elif "👎" in action_text: + notification_emoji = "👎" + elif "🔥" in action_text and "❤‍🔥" not in action_text: + notification_emoji = "🔥" + elif "❤‍🔥" in action_text: + notification_emoji = "❤‍🔥" + elif "❤" in action_text: + notification_emoji = "❤" + # Отправляем уведомление karma_sign = f"+{karma_change}" if karma_change > 0 else str(karma_change) change_word = "увеличена" if karma_change > 0 else "уменьшена" - response = f"{action_emoji} Карма пользователя {to_user_display} {change_word} ({karma_sign})! Текущая карма: {new_karma}" + response = f"{notification_emoji} Карма пользователя {to_user_display} {change_word} ({karma_sign})! Текущая карма: {new_karma}" logger.info(f"[KARMA] Отправка уведомления в чат {chat_id}") try: @@ -302,20 +311,22 @@ def register_handlers(bot: AsyncTeleBot): karma_change = f"+{karma_amount}" response = f"{karma_emoji} Карма пользователя {to_user_display} увеличена ({karma_change})! Текущая карма: {new_karma}" - sent_message = await bot.reply_to(message, response) + try: + sent_message = await bot.reply_to(message, response) + logger.info(f"Пользователь {from_user.id} поблагодарил {to_user.id}, карма: {new_karma}") - logger.info(f"Пользователь {from_user.id} поблагодарил {to_user.id}, карма: {new_karma}") + # Удаляем уведомление через 25 секунд В ФОНЕ + async def delete_thank_notification(): + try: + await asyncio.sleep(25) + await bot.delete_message(chat_id, sent_message.message_id) + except Exception as e: + logger.error(f"Не удалось удалить уведомление о карме: {e}") - # Удаляем уведомление через 25 секунд В ФОНЕ - async def delete_thank_notification(): - try: - await asyncio.sleep(25) - await bot.delete_message(chat_id, sent_message.message_id) - except Exception as e: - logger.error(f"Не удалось удалить уведомление о карме: {e}") - - # Запускаем удаление в фоне - asyncio.create_task(delete_thank_notification()) + # Запускаем удаление в фоне + asyncio.create_task(delete_thank_notification()) + except Exception as e: + logger.error(f"Ошибка отправки уведомления о благодарности: {e}", exc_info=True) except Exception as e: logger.error(f"Ошибка при обработке благодарности: {e}", exc_info=True) \ No newline at end of file