Исправление логики работы кармы

Добавление дополнительных обработчиков ошибок в работе кармы
Убрано кэширование сообщений от ботов3
This commit is contained in:
2025-10-20 09:19:04 +03:00
parent c7b2961ae1
commit c257c6c1a2
2 changed files with 85 additions and 74 deletions

View File

@@ -81,22 +81,22 @@ class UserUpdateMiddleware(BaseMiddleware):
tag=message.from_user.username 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 # Это позволяет auto_mute работать независимо от karma_tracker
await self._check_profanity(message) 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': elif message.content_type == 'new_chat_members':
for new_member in message.new_chat_members: for new_member in message.new_chat_members:

View File

@@ -84,6 +84,10 @@ def register_handlers(bot: AsyncTeleBot):
logger.warning(f"[KARMA] Пользователь {to_user_id} не найден в БД") logger.warning(f"[KARMA] Пользователь {to_user_id} не найден в БД")
return return
# Примечание: мы не проверяем является ли to_user_id ботом, т.к.:
# 1. Сообщения ботов не кэшируются (только пользовательские)
# 2. Если бот все же попал в кэш, это исключительный случай и не критично
# Проверяем старые реакции # Проверяем старые реакции
old_thumbs_up = False old_thumbs_up = False
old_thumbs_down = False old_thumbs_down = False
@@ -124,69 +128,61 @@ def register_handlers(bot: AsyncTeleBot):
elif react.emoji == "🔥": elif react.emoji == "🔥":
new_fire = True new_fire = True
# Определяем изменение кармы # Определяем изменение кармы (накапливаем все изменения)
karma_change = 0 karma_change = 0
action_emoji = "" actions = [] # Список всех действий для логирования
action_text = ""
# Логика изменения кармы # Логика изменения кармы - проверяем ВСЕ реакции (не elif!)
# Это важно, т.к. пользователь может менять реакции (убрать 👍 и поставить 🔥)
# Проверяем 👍
if new_thumbs_up and not old_thumbs_up: if new_thumbs_up and not old_thumbs_up:
# Добавили 👍 karma_change += 1
karma_change = 1 actions.append("поставил 👍 (+1)")
action_emoji = "👍"
action_text = "поставил 👍"
elif old_thumbs_up and not new_thumbs_up: elif old_thumbs_up and not new_thumbs_up:
# Убрали 👍 karma_change -= 1
karma_change = -1 actions.append("убрал 👍 (-1)")
action_emoji = "👍"
action_text = "убрал 👍" # Проверяем 👎
elif new_thumbs_down and not old_thumbs_down: if new_thumbs_down and not old_thumbs_down:
# Добавили 👎 karma_change -= 1
karma_change = -1 actions.append("поставил 👎 (-1)")
action_emoji = "👎"
action_text = "поставил 👎"
elif old_thumbs_down and not new_thumbs_down: elif old_thumbs_down and not new_thumbs_down:
# Убрали 👎 karma_change += 1
karma_change = 1 actions.append("убрал 👎 (+1)")
action_emoji = "👎"
action_text = "убрал 👎" # Проверяем ❤
elif new_heart and not old_heart: if new_heart and not old_heart:
# Добавили ❤ karma_change += 5
karma_change = 5 actions.append("поставил ❤ (+5)")
action_emoji = ""
action_text = "поставил ❤"
elif old_heart and not new_heart: elif old_heart and not new_heart:
# Убрали ❤ karma_change -= 5
karma_change = -5 actions.append("убрал ❤ (-5)")
action_emoji = ""
action_text = "убрал ❤" # Проверяем ❤‍🔥
elif new_fire_heart and not old_fire_heart: if new_fire_heart and not old_fire_heart:
# Добавили ❤‍🔥 karma_change += 10
karma_change = 10 actions.append("поставил ❤‍🔥 (+10)")
action_emoji = "❤‍🔥"
action_text = "поставил ❤‍🔥"
elif old_fire_heart and not new_fire_heart: elif old_fire_heart and not new_fire_heart:
# Убрали ❤‍🔥 karma_change -= 10
karma_change = -10 actions.append("убрал ❤‍🔥 (-10)")
action_emoji = "❤‍🔥"
action_text = "убрал ❤‍🔥" # Проверяем 🔥
elif new_fire and not old_fire: if new_fire and not old_fire:
# Добавили 🔥 karma_change += 2
karma_change = 2 actions.append("поставил 🔥 (+2)")
action_emoji = "🔥"
action_text = "поставил 🔥"
elif old_fire and not new_fire: elif old_fire and not new_fire:
# Убрали 🔥 karma_change -= 2
karma_change = -2 actions.append("убрал 🔥 (-2)")
action_emoji = "🔥"
action_text = "убрал 🔥"
# Если нет изменений - выходим # Если нет изменений - выходим
if karma_change == 0: if karma_change == 0:
logger.info(f"[KARMA] Нет изменений в реакциях") logger.info(f"[KARMA] Нет изменений в реакциях")
return 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) db.add_karma(to_user_id, chat_id, karma_change)
@@ -197,10 +193,23 @@ def register_handlers(bot: AsyncTeleBot):
# Формируем имя пользователя (из БД: 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]
# Формируем эмодзи для уведомления (берем первое действие или дефолтное)
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) karma_sign = f"+{karma_change}" if karma_change > 0 else str(karma_change)
change_word = "увеличена" if karma_change > 0 else "уменьшена" 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}") logger.info(f"[KARMA] Отправка уведомления в чат {chat_id}")
try: try:
@@ -302,20 +311,22 @@ def register_handlers(bot: AsyncTeleBot):
karma_change = f"+{karma_amount}" karma_change = f"+{karma_amount}"
response = f"{karma_emoji} Карма пользователя {to_user_display} увеличена ({karma_change})! Текущая карма: {new_karma}" 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(): asyncio.create_task(delete_thank_notification())
try: except Exception as e:
await asyncio.sleep(25) logger.error(f"Ошибка отправки уведомления о благодарности: {e}", exc_info=True)
await bot.delete_message(chat_id, sent_message.message_id)
except Exception as e:
logger.error(f"Не удалось удалить уведомление о карме: {e}")
# Запускаем удаление в фоне
asyncio.create_task(delete_thank_notification())
except Exception as e: except Exception as e:
logger.error(f"Ошибка при обработке благодарности: {e}", exc_info=True) logger.error(f"Ошибка при обработке благодарности: {e}", exc_info=True)