Files
LGBot/src/modules/karma_commands.py

155 lines
7.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from telebot.async_telebot import AsyncTeleBot
from telebot.types import Message
import asyncio
import logging
from database import db
logger = logging.getLogger(__name__)
async def _delete_message_delayed(bot: AsyncTeleBot, chat_id: int, message_id: int, delay: int):
"""Удаляет сообщение с задержкой"""
try:
await asyncio.sleep(delay)
await bot.delete_message(chat_id, message_id)
except Exception as e:
logger.error(f"Не удалось удалить сообщение {message_id}: {e}")
def register_handlers(bot: AsyncTeleBot):
"""Регистрирует обработчики команд для системы кармы"""
@bot.message_handler(commands=['karma', 'rating'])
async def handle_karma_command(message: Message):
"""
Команда /karma - показывает карму пользователя
Использование:
/karma - показать свою карму
/karma @username - показать карму пользователя
/karma (в ответ на сообщение) - показать карму автора сообщения
"""
try:
# Проверяем, что это групповой чат
if message.chat.type not in ['group', 'supergroup']:
await bot.reply_to(message, "❌ Эта команда работает только в групповых чатах")
return
chat_id = message.chat.id
target_user = None
target_user_id = None
# Если команда - ответ на сообщение
if message.reply_to_message:
target_user = message.reply_to_message.from_user
target_user_id = target_user.id
# Если указан username в команде
elif len(message.text.split()) > 1:
username_arg = message.text.split()[1]
# Убираем @ если есть
username = username_arg.lstrip('@')
# Ищем пользователя в БД
user_data = db.get_user_by_username(username)
if user_data:
target_user_id = user_data[0]
logger.info(f"[KARMA CMD] Найден пользователь по username '{username}': id={user_data[0]}, nickname={user_data[1]}, tag={user_data[2]}")
target_user = type('User', (), {
'id': user_data[0],
'first_name': user_data[1],
'username': user_data[2]
})()
else:
await bot.reply_to(message, f"❌ Пользователь @{username} не найден в базе данных")
return
# Иначе показываем карму отправителя команды
else:
target_user = message.from_user
target_user_id = target_user.id
# Получаем карму
karma = db.get_karma(target_user_id, chat_id)
# Формируем имя пользователя
if hasattr(target_user, 'username') and target_user.username:
user_display = f"@{target_user.username}"
else:
user_display = target_user.first_name
logger.info(f"[KARMA CMD] Показываем карму: user_id={target_user_id}, username={getattr(target_user, 'username', None)}, display={user_display}, karma={karma}")
# Определяем эмодзи в зависимости от кармы
if karma == 0:
emoji = "😐"
elif karma < 5:
emoji = "🙂"
elif karma < 10:
emoji = "😊"
elif karma < 20:
emoji = "😄"
elif karma < 50:
emoji = "🌟"
else:
emoji = ""
response = f"{emoji} Карма пользователя {user_display}: {karma}"
sent_message = await bot.reply_to(message, response)
# Удаляем команду через 20 секунд и ответ через 60 секунд
asyncio.create_task(_delete_message_delayed(bot, chat_id, message.message_id, 20))
asyncio.create_task(_delete_message_delayed(bot, chat_id, sent_message.message_id, 60))
except Exception as e:
logger.error(f"Ошибка при обработке команды /karma: {e}", exc_info=True)
await bot.reply_to(message, "❌ Произошла ошибка при получении кармы")
@bot.message_handler(commands=['top', 'leaderboard', 'topkarma'])
async def handle_top_command(message: Message):
"""
Команда /top - показывает топ пользователей по карме
"""
try:
# Проверяем, что это групповой чат
if message.chat.type not in ['group', 'supergroup']:
await bot.reply_to(message, "❌ Эта команда работает только в групповых чатах")
return
chat_id = message.chat.id
# Получаем топ 10 пользователей
top_users = db.get_top_karma(chat_id, limit=10)
if not top_users:
await bot.reply_to(message, "📊 В этом чате пока нет пользователей с кармой")
return
# Формируем сообщение
response = "🏆 <b>Топ-10 пользователей по карме:</b>\n\n"
medals = ["🥇", "🥈", "🥉"]
for idx, (user_id, nickname, tag, karma_points) in enumerate(top_users, 1):
# Определяем медаль для топ-3
if idx <= 3:
medal = medals[idx - 1]
else:
medal = f"{idx}."
# Формируем отображение пользователя
if tag:
user_display = f"@{tag}"
else:
user_display = nickname or f"ID: {user_id}"
response += f"{medal} {user_display} — <b>{karma_points}</b> кармы\n"
sent_message = await bot.reply_to(message, response)
# Удаляем команду через 20 секунд и ответ через 60 секунд
asyncio.create_task(_delete_message_delayed(bot, chat_id, message.message_id, 20))
asyncio.create_task(_delete_message_delayed(bot, chat_id, sent_message.message_id, 60))
except Exception as e:
logger.error(f"Ошибка при обработке команды /top: {e}", exc_info=True)
await bot.reply_to(message, "❌ Произошла ошибка при получении топа")