forked from Muzifs/LGBot
Изменение логики эмодзи кармы как переключатель
This commit is contained in:
@@ -191,8 +191,10 @@ COMMAND_MESSAGES = {
|
||||
"• спасибо → +1 карма\n"
|
||||
"• благодарю → +1 карма\n"
|
||||
"• спс, сенкс, thanks и др. → +1 карма\n\n"
|
||||
"<u>Способ 2: Поставить реакцию 👍</u>\n"
|
||||
"• Нажмите на сообщение и выберите 👍 → +1 карма\n\n"
|
||||
"<u>Способ 2: Поставить реакцию (работает как переключатель)</u>\n"
|
||||
"• Поставил 👍 → +1 карма | Убрал 👍 → -1 карма\n"
|
||||
"• Поставил 👎 → -1 карма | Убрал 👎 → +1 карма\n"
|
||||
"• Нет ограничений по времени для реакций!\n\n"
|
||||
"<b>🔥 БОНУС: Благодарность с восклицательным знаком даёт x2 кармы!</b>\n"
|
||||
"• спасибо! → +2 кармы 👍👍\n"
|
||||
"• thanks! → +2 кармы 👍👍\n\n"
|
||||
|
@@ -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] Уведомление удалено")
|
||||
|
Reference in New Issue
Block a user