forked from Muzifs/LGBot
155 lines
7.0 KiB
Python
155 lines
7.0 KiB
Python
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, "❌ Произошла ошибка при получении топа") |