forked from Muzifs/LGBot
Исправление логики работы кармы
Добавление дополнительных обработчиков ошибок в работе кармы Убрано кэширование сообщений от ботов3
This commit is contained in:
24
src/main.py
24
src/main.py
@@ -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:
|
||||
|
@@ -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)
|
Reference in New Issue
Block a user