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 = "🏆 Топ-10 пользователей по карме:\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} — {karma_points} кармы\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, "❌ Произошла ошибка при получении топа")