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

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