diff --git a/src/config.py b/src/config.py index de72405..221c311 100644 --- a/src/config.py +++ b/src/config.py @@ -191,8 +191,10 @@ COMMAND_MESSAGES = { "• спасибо → +1 карма\n" "• благодарю → +1 карма\n" "• спс, сенкс, thanks и др. → +1 карма\n\n" - "Способ 2: Поставить реакцию 👍\n" - "• Нажмите на сообщение и выберите 👍 → +1 карма\n\n" + "Способ 2: Поставить реакцию (работает как переключатель)\n" + "• Поставил 👍 → +1 карма | Убрал 👍 → -1 карма\n" + "• Поставил 👎 → -1 карма | Убрал 👎 → +1 карма\n" + "• Нет ограничений по времени для реакций!\n\n" "🔥 БОНУС: Благодарность с восклицательным знаком даёт x2 кармы!\n" "• спасибо! → +2 кармы 👍👍\n" "• thanks! → +2 кармы 👍👍\n\n" diff --git a/src/modules/0_karma_tracker.py b/src/modules/0_karma_tracker.py index 491d3d2..ba33b94 100644 --- a/src/modules/0_karma_tracker.py +++ b/src/modules/0_karma_tracker.py @@ -38,34 +38,20 @@ def register_handlers(bot: AsyncTeleBot): async def handle_reaction(reaction: MessageReactionUpdated): """ Обрабатывает реакции на сообщения. - Если пользователь поставил 👍, начисляет карму автору сообщения. + Реакции работают как переключатель: + - Поставил 👍 → +1 карма + - Убрал 👍 → -1 карма + - Поставил 👎 → -1 карма + - Убрал 👎 → +1 карма """ try: - logger.info(f"[KARMA] Получена реакция, тип: {type(reaction)}, данные: {reaction}") + logger.info(f"[KARMA] Получена реакция от {reaction.user.id}") # Проверяем, что это групповой чат if reaction.chat.type not in ['group', 'supergroup']: logger.info(f"[KARMA] Пропуск реакции - не групповой чат") return - # Проверяем, что есть новые реакции (не удаление) - if not reaction.new_reaction: - logger.info(f"[KARMA] Пропуск - удаление реакции") - return - - # Ищем реакцию 👍 среди новых реакций - thumbs_up_found = False - for react in reaction.new_reaction: - if isinstance(react, ReactionTypeEmoji) and react.emoji == "👍": - thumbs_up_found = True - break - - if not thumbs_up_found: - logger.info(f"[KARMA] Нет реакции 👍") - return - - logger.info(f"[KARMA] Обнаружена реакция 👍 от {reaction.user.id}") - from_user = reaction.user chat_id = reaction.chat.id @@ -75,9 +61,9 @@ def register_handlers(bot: AsyncTeleBot): logger.warning(f"[KARMA] Сообщение {reaction.message_id} не найдено в кэше") return - # Защита от самоблагодарности + # Защита от самооценки if from_user.id == to_user_id: - logger.info(f"Пользователь {from_user.id} попытался поблагодарить сам себя реакцией") + logger.info(f"Пользователь {from_user.id} попытался поставить реакцию на своё сообщение") return # Получаем информацию о пользователе из БД @@ -86,25 +72,76 @@ def register_handlers(bot: AsyncTeleBot): logger.warning(f"[KARMA] Пользователь {to_user_id} не найден в БД") return - # Атомарно проверяем кулдаун и записываем благодарность - if not db.try_add_karma_thank(from_user.id, to_user_id, chat_id, THANK_COOLDOWN): - logger.info(f"Пользователь {from_user.id} уже благодарил {to_user_id} недавно (реакция)") + # Проверяем старые реакции + old_thumbs_up = False + old_thumbs_down = False + if reaction.old_reaction: + for react in reaction.old_reaction: + if isinstance(react, ReactionTypeEmoji): + if react.emoji == "👍": + old_thumbs_up = True + elif react.emoji == "👎": + old_thumbs_down = True + + # Проверяем новые реакции + new_thumbs_up = False + new_thumbs_down = False + if reaction.new_reaction: + for react in reaction.new_reaction: + if isinstance(react, ReactionTypeEmoji): + if react.emoji == "👍": + new_thumbs_up = True + elif react.emoji == "👎": + new_thumbs_down = True + + # Определяем изменение кармы + karma_change = 0 + action_emoji = "" + action_text = "" + + # Логика изменения кармы + if new_thumbs_up and not old_thumbs_up: + # Добавили 👍 + karma_change = 1 + action_emoji = "👍" + action_text = "поставил 👍" + 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 = "поставил 👎" + elif old_thumbs_down and not new_thumbs_down: + # Убрали 👎 + karma_change = 1 + action_emoji = "👎" + action_text = "убрал 👎" + + # Если нет изменений - выходим + if karma_change == 0: + logger.info(f"[KARMA] Нет изменений в реакциях 👍/👎") return - # Начисляем +1 карму за реакцию - db.add_karma(to_user_id, chat_id, 1) + logger.info(f"[KARMA] {action_text} от {from_user.id} для {to_user_id}, изменение кармы: {karma_change}") + + # Изменяем карму + db.add_karma(to_user_id, chat_id, karma_change) # Получаем новую карму new_karma = db.get_karma(to_user_id, chat_id) - logger.info(f"Пользователь {from_user.id} поблагодарил {to_user_id} реакцией 👍, карма: {new_karma}") - # Формируем имя пользователя (из БД: id, nickname, tag) to_user_display = f"@{to_user_info[2]}" if to_user_info[2] else to_user_info[1] # Отправляем уведомление - response = f"👍 Карма пользователя {to_user_display} увеличена (+1)! Текущая карма: {new_karma}" - logger.info(f"[KARMA] Отправка уведомления в чат {chat_id}, thread_id={getattr(reaction, 'message_thread_id', None)}") + 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}" + logger.info(f"[KARMA] Отправка уведомления в чат {chat_id}") try: sent_message = await bot.send_message( @@ -114,8 +151,8 @@ def register_handlers(bot: AsyncTeleBot): ) logger.info(f"[KARMA] Уведомление отправлено успешно, message_id={sent_message.message_id}") - # Удаляем уведомление через 15 секунд - await asyncio.sleep(15) + # Удаляем уведомление через 10 секунд + await asyncio.sleep(10) try: await bot.delete_message(chat_id, sent_message.message_id) logger.info(f"[KARMA] Уведомление удалено")