Изменение логики эмодзи кармы как переключатель

This commit is contained in:
2025-10-19 14:28:01 +03:00
parent 9b11f21bc1
commit 0ee7cb3bd4
2 changed files with 74 additions and 35 deletions

View File

@@ -191,8 +191,10 @@ COMMAND_MESSAGES = {
"• спасибо → +1 карма\n" "• спасибо → +1 карма\n"
"• благодарю → +1 карма\n" "• благодарю → +1 карма\n"
"• спс, сенкс, thanks и др. → +1 карма\n\n" "• спс, сенкс, thanks и др. → +1 карма\n\n"
"<u>Способ 2: Поставить реакцию 👍</u>\n" "<u>Способ 2: Поставить реакцию (работает как переключатель)</u>\n"
"Нажмите на сообщение и выберите 👍 → +1 карма\n\n" "Поставил 👍 → +1 карма | Убрал 👍 → -1 карма\n"
"• Поставил 👎 → -1 карма | Убрал 👎 → +1 карма\n"
"• Нет ограничений по времени для реакций!\n\n"
"<b>🔥 БОНУС: Благодарность с восклицательным знаком даёт x2 кармы!</b>\n" "<b>🔥 БОНУС: Благодарность с восклицательным знаком даёт x2 кармы!</b>\n"
"• спасибо! → +2 кармы 👍👍\n" "• спасибо! → +2 кармы 👍👍\n"
"• thanks! → +2 кармы 👍👍\n\n" "• thanks! → +2 кармы 👍👍\n\n"

View File

@@ -38,34 +38,20 @@ def register_handlers(bot: AsyncTeleBot):
async def handle_reaction(reaction: MessageReactionUpdated): async def handle_reaction(reaction: MessageReactionUpdated):
""" """
Обрабатывает реакции на сообщения. Обрабатывает реакции на сообщения.
Если пользователь поставил 👍, начисляет карму автору сообщения. Реакции работают как переключатель:
- Поставил 👍 → +1 карма
- Убрал 👍 → -1 карма
- Поставил 👎 → -1 карма
- Убрал 👎 → +1 карма
""" """
try: try:
logger.info(f"[KARMA] Получена реакция, тип: {type(reaction)}, данные: {reaction}") logger.info(f"[KARMA] Получена реакция от {reaction.user.id}")
# Проверяем, что это групповой чат # Проверяем, что это групповой чат
if reaction.chat.type not in ['group', 'supergroup']: if reaction.chat.type not in ['group', 'supergroup']:
logger.info(f"[KARMA] Пропуск реакции - не групповой чат") logger.info(f"[KARMA] Пропуск реакции - не групповой чат")
return 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 from_user = reaction.user
chat_id = reaction.chat.id chat_id = reaction.chat.id
@@ -75,9 +61,9 @@ def register_handlers(bot: AsyncTeleBot):
logger.warning(f"[KARMA] Сообщение {reaction.message_id} не найдено в кэше") logger.warning(f"[KARMA] Сообщение {reaction.message_id} не найдено в кэше")
return return
# Защита от самоблагодарности # Защита от самооценки
if from_user.id == to_user_id: if from_user.id == to_user_id:
logger.info(f"Пользователь {from_user.id} попытался поблагодарить сам себя реакцией") logger.info(f"Пользователь {from_user.id} попытался поставить реакцию на своё сообщение")
return return
# Получаем информацию о пользователе из БД # Получаем информацию о пользователе из БД
@@ -86,25 +72,76 @@ def register_handlers(bot: AsyncTeleBot):
logger.warning(f"[KARMA] Пользователь {to_user_id} не найден в БД") logger.warning(f"[KARMA] Пользователь {to_user_id} не найден в БД")
return return
# Атомарно проверяем кулдаун и записываем благодарность # Проверяем старые реакции
if not db.try_add_karma_thank(from_user.id, to_user_id, chat_id, THANK_COOLDOWN): old_thumbs_up = False
logger.info(f"Пользователь {from_user.id} уже благодарил {to_user_id} недавно (реакция)") 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 return
# Начисляем +1 карму за реакцию logger.info(f"[KARMA] {action_text} от {from_user.id} для {to_user_id}, изменение кармы: {karma_change}")
db.add_karma(to_user_id, chat_id, 1)
# Изменяем карму
db.add_karma(to_user_id, chat_id, karma_change)
# Получаем новую карму # Получаем новую карму
new_karma = db.get_karma(to_user_id, chat_id) new_karma = db.get_karma(to_user_id, chat_id)
logger.info(f"Пользователь {from_user.id} поблагодарил {to_user_id} реакцией 👍, карма: {new_karma}")
# Формируем имя пользователя (из БД: id, nickname, tag) # Формируем имя пользователя (из БД: id, nickname, tag)
to_user_display = f"@{to_user_info[2]}" if to_user_info[2] else to_user_info[1] 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}" karma_sign = f"+{karma_change}" if karma_change > 0 else str(karma_change)
logger.info(f"[KARMA] Отправка уведомления в чат {chat_id}, thread_id={getattr(reaction, 'message_thread_id', None)}") 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: try:
sent_message = await bot.send_message( 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}") logger.info(f"[KARMA] Уведомление отправлено успешно, message_id={sent_message.message_id}")
# Удаляем уведомление через 15 секунд # Удаляем уведомление через 10 секунд
await asyncio.sleep(15) await asyncio.sleep(10)
try: try:
await bot.delete_message(chat_id, sent_message.message_id) await bot.delete_message(chat_id, sent_message.message_id)
logger.info(f"[KARMA] Уведомление удалено") logger.info(f"[KARMA] Уведомление удалено")