Добавление возможности использования кармы

This commit is contained in:
2025-10-18 21:17:41 +03:00
parent 47cf59f710
commit a16b5322af
7 changed files with 496 additions and 1 deletions

View File

@@ -0,0 +1,153 @@
from telebot.async_telebot import AsyncTeleBot
from telebot.types import Message
import logging
from database import db
logger = logging.getLogger(__name__)
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]
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
# Определяем эмодзи в зависимости от кармы
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)
# Удаляем команду и ответ через 10 секунд
import asyncio
await asyncio.sleep(10)
try:
await bot.delete_message(chat_id, message.message_id)
await bot.delete_message(chat_id, sent_message.message_id)
except Exception as e:
logger.error(f"Не удалось удалить сообщения: {e}")
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, parse_mode='HTML')
# Удаляем команду и ответ через 30 секунд
import asyncio
await asyncio.sleep(30)
try:
await bot.delete_message(chat_id, message.message_id)
await bot.delete_message(chat_id, sent_message.message_id)
except Exception as e:
logger.error(f"Не удалось удалить сообщения: {e}")
except Exception as e:
logger.error(f"Ошибка при обработке команды /top: {e}", exc_info=True)
await bot.reply_to(message, "❌ Произошла ошибка при получении топа")