import logging import typing from aiogram import Router, types from aiogram.filters import Command, or_f from aiogram import F 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 from bot.keyboards.reply_keyboards import STATS_BUTTON_TEXT router = Router() @router.message(or_f(Command("stats"), F.text == STATS_BUTTON_TEXT)) async def handle_stats(message: types.Message, **kwargs): """Обработчик команды /stats. Выводит статистику игры.""" 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) if not partner: await message.answer("Не могу показать статистику, так как не найден партнер.") return try: total_games = await get_total_games_count(user_db_obj.id, partner.id) user_wins = await get_wins_count(user_db_obj.id) partner_wins = await get_wins_count(partner.id) draws = await get_draw_count(user_db_obj.id, partner.id) user_streak = await get_streak(user_db_obj.id) partner_streak = await get_streak(partner.id) except Exception as e: logging.exception(f"Error fetching stats for user {user_db_obj.id} and partner {partner.id}") await message.answer("Произошла ошибка при получении статистики. Попробуйте позже.") return user_name = user_db_obj.username or f"Игрок {user_db_obj.telegram_id}" partner_name = partner.username or f"Игрок {partner.telegram_id}" stats_text = ( f"📊 Статистика \"Кто больше любит?\" ❤️\n\n" f"Всего сыграно игр: {total_games}\n" f"(Завершенных игр между вами)\n\n" f"🏆 Победы:\n" f" - {user_name}: {user_wins}\n" f" - {partner_name}: {partner_wins}\n" f" - Ничьи: {draws}\n\n" f"🔥 Серии побед (стрики):\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")