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] Уведомление удалено")