love-bot/bot/handlers/stats.py

68 lines
3.1 KiB
Python
Raw Normal View History

2025-04-28 14:52:32 +02:00
import logging
2025-04-28 17:21:04 +02:00
import typing
2025-04-28 14:52:32 +02:00
from aiogram import Router, types
2025-04-28 17:21:04 +02:00
from aiogram.filters import Command, or_f
from aiogram import F
2025-04-28 14:52:32 +02:00
from bot.database.models import User as DbUser
from bot.database.db import (
get_wins_count,
get_total_games_count,
get_draw_count,
get_streak,
get_user_by_id
)
from bot.utils.helpers import get_partner
2025-04-28 17:21:04 +02:00
from bot.keyboards.reply_keyboards import STATS_BUTTON_TEXT
2025-04-28 18:23:48 +02:00
from bot.display_names import DISPLAY_NAMES
2025-04-28 14:52:32 +02:00
router = Router()
2025-04-28 17:21:04 +02:00
@router.message(or_f(Command("stats"), F.text == STATS_BUTTON_TEXT))
async def handle_stats(message: types.Message, **kwargs):
2025-04-28 14:52:32 +02:00
"""Обработчик команды /stats. Выводит статистику игры."""
2025-04-28 17:21:04 +02:00
user_db_obj: typing.Optional[DbUser] = kwargs.get('user_db_obj')
if not user_db_obj:
logging.error(f"Error in handle_stats: user_db_obj not found in kwargs for user {message.from_user.id}")
await message.answer("Произошла ошибка при получении ваших данных.")
return
partner = await get_partner(user_db_obj.id)
2025-04-28 14:52:32 +02:00
if not partner:
await message.answer("Не могу показать статистику, так как не найден партнер.")
return
try:
2025-04-28 17:21:04 +02:00
total_games = await get_total_games_count(user_db_obj.id, partner.id)
user_wins = await get_wins_count(user_db_obj.id)
2025-04-28 14:52:32 +02:00
partner_wins = await get_wins_count(partner.id)
2025-04-28 17:21:04 +02:00
draws = await get_draw_count(user_db_obj.id, partner.id)
user_streak = await get_streak(user_db_obj.id)
2025-04-28 14:52:32 +02:00
partner_streak = await get_streak(partner.id)
except Exception as e:
2025-04-28 17:21:04 +02:00
logging.exception(f"Error fetching stats for user {user_db_obj.id} and partner {partner.id}")
2025-04-28 14:52:32 +02:00
await message.answer("Произошла ошибка при получении статистики. Попробуйте позже.")
return
2025-04-28 18:23:48 +02:00
user_name = DISPLAY_NAMES.get(user_db_obj.telegram_id, user_db_obj.username or f"Пользователь {user_db_obj.telegram_id}")
partner_name = DISPLAY_NAMES.get(partner.telegram_id, partner.username or f"Пользователь {partner.telegram_id}")
2025-04-28 14:52:32 +02:00
stats_text = (
f"📊 <b>Статистика \"Кто больше любит?\"</b> ❤️\n\n"
f"<b>Всего сыграно игр:</b> {total_games}\n"
f"<i>(Завершенных игр между вами)</i>\n\n"
f"🏆 <b>Победы:</b>\n"
f" - {user_name}: {user_wins}\n"
f" - {partner_name}: {partner_wins}\n"
f" - Ничьи: {draws}\n\n"
f"🔥 <b>Серии побед (стрики):</b>\n"
f" - {user_name}:\n"
f" - Текущий: {user_streak.current_streak if user_streak else 0}\n"
f" - Макс.: {user_streak.max_streak if user_streak else 0}\n"
f" - {partner_name}:\n"
f" - Текущий: {partner_streak.current_streak if partner_streak else 0}\n"
f" - Макс.: {partner_streak.max_streak if partner_streak else 0}"
)
await message.answer(stats_text, parse_mode="HTML")