212 lines
7.7 KiB
Python
212 lines
7.7 KiB
Python
from aiogram import Router, F
|
||
from aiogram.filters import Command
|
||
from aiogram.types import Message, CallbackQuery
|
||
|
||
from keyboards.main_menu import get_main_menu
|
||
from keyboards.inline import get_marathons_keyboard, get_marathon_details_keyboard
|
||
from services.api_client import api_client
|
||
|
||
router = Router()
|
||
|
||
|
||
@router.message(Command("marathons"))
|
||
@router.message(F.text == "📊 Мои марафоны")
|
||
async def cmd_marathons(message: Message):
|
||
"""Show user's marathons."""
|
||
user = await api_client.get_user_by_telegram_id(message.from_user.id)
|
||
|
||
if not user:
|
||
await message.answer(
|
||
"Сначала привяжи аккаунт через настройки профиля на сайте.",
|
||
reply_markup=get_main_menu()
|
||
)
|
||
return
|
||
|
||
marathons = await api_client.get_user_marathons(message.from_user.id)
|
||
|
||
if not marathons:
|
||
await message.answer(
|
||
"<b>Мои марафоны</b>\n\n"
|
||
"У тебя пока нет активных марафонов.\n"
|
||
"Присоединись к марафону на сайте!",
|
||
reply_markup=get_main_menu()
|
||
)
|
||
return
|
||
|
||
text = "<b>📊 Мои марафоны</b>\n\n"
|
||
|
||
for m in marathons:
|
||
status_emoji = {
|
||
"preparing": "⏳",
|
||
"active": "🎮",
|
||
"finished": "🏁"
|
||
}.get(m.get("status"), "❓")
|
||
|
||
text += f"{status_emoji} <b>{m.get('title')}</b>\n"
|
||
text += f" Очки: {m.get('total_points', 0)} | "
|
||
text += f"Место: #{m.get('position', '?')}\n\n"
|
||
|
||
await message.answer(
|
||
text,
|
||
reply_markup=get_marathons_keyboard(marathons)
|
||
)
|
||
|
||
|
||
@router.callback_query(F.data.startswith("marathon:"))
|
||
async def marathon_details(callback: CallbackQuery):
|
||
"""Show marathon details."""
|
||
marathon_id = int(callback.data.split(":")[1])
|
||
|
||
details = await api_client.get_marathon_details(
|
||
marathon_id=marathon_id,
|
||
telegram_id=callback.from_user.id
|
||
)
|
||
|
||
if not details:
|
||
await callback.answer("Не удалось загрузить данные марафона", show_alert=True)
|
||
return
|
||
|
||
marathon = details.get("marathon", {})
|
||
participant = details.get("participant", {})
|
||
active_events = details.get("active_events", [])
|
||
current_assignment = details.get("current_assignment")
|
||
|
||
status_text = {
|
||
"preparing": "⏳ Подготовка",
|
||
"active": "🎮 Активен",
|
||
"finished": "🏁 Завершён"
|
||
}.get(marathon.get("status"), "❓")
|
||
|
||
text = f"<b>{marathon.get('title')}</b>\n"
|
||
text += f"Статус: {status_text}\n\n"
|
||
|
||
text += f"<b>📈 Твоя статистика:</b>\n"
|
||
text += f"• Очки: <b>{participant.get('total_points', 0)}</b>\n"
|
||
text += f"• Место: <b>#{details.get('position', '?')}</b>\n"
|
||
text += f"• Стрик: <b>{participant.get('current_streak', 0)}</b> 🔥\n"
|
||
text += f"• Дропов: <b>{participant.get('drop_count', 0)}</b>\n\n"
|
||
|
||
if active_events:
|
||
text += "<b>⚡ Активные события:</b>\n"
|
||
for event in active_events:
|
||
event_emoji = {
|
||
"golden_hour": "🌟",
|
||
"jackpot": "🎰",
|
||
"double_risk": "⚡",
|
||
"common_enemy": "👥",
|
||
"swap": "🔄",
|
||
"game_choice": "🎲"
|
||
}.get(event.get("type"), "📌")
|
||
text += f"{event_emoji} {event.get('type', '').replace('_', ' ').title()}\n"
|
||
text += "\n"
|
||
|
||
if current_assignment:
|
||
challenge = current_assignment.get("challenge", {})
|
||
game = challenge.get("game", {})
|
||
text += f"<b>🎯 Текущее задание:</b>\n"
|
||
text += f"Игра: {game.get('title', 'N/A')}\n"
|
||
text += f"Задание: {challenge.get('title', 'N/A')}\n"
|
||
text += f"Сложность: {challenge.get('difficulty', 'N/A')}\n"
|
||
text += f"Очки: {challenge.get('points', 0)}\n"
|
||
|
||
await callback.message.edit_text(
|
||
text,
|
||
reply_markup=get_marathon_details_keyboard(marathon_id)
|
||
)
|
||
await callback.answer()
|
||
|
||
|
||
@router.callback_query(F.data == "back_to_marathons")
|
||
async def back_to_marathons(callback: CallbackQuery):
|
||
"""Go back to marathons list."""
|
||
marathons = await api_client.get_user_marathons(callback.from_user.id)
|
||
|
||
if not marathons:
|
||
await callback.message.edit_text(
|
||
"<b>Мои марафоны</b>\n\n"
|
||
"У тебя пока нет активных марафонов."
|
||
)
|
||
await callback.answer()
|
||
return
|
||
|
||
text = "<b>📊 Мои марафоны</b>\n\n"
|
||
|
||
for m in marathons:
|
||
status_emoji = {
|
||
"preparing": "⏳",
|
||
"active": "🎮",
|
||
"finished": "🏁"
|
||
}.get(m.get("status"), "❓")
|
||
|
||
text += f"{status_emoji} <b>{m.get('title')}</b>\n"
|
||
text += f" Очки: {m.get('total_points', 0)} | "
|
||
text += f"Место: #{m.get('position', '?')}\n\n"
|
||
|
||
await callback.message.edit_text(
|
||
text,
|
||
reply_markup=get_marathons_keyboard(marathons)
|
||
)
|
||
await callback.answer()
|
||
|
||
|
||
@router.message(Command("stats"))
|
||
@router.message(F.text == "📈 Статистика")
|
||
async def cmd_stats(message: Message):
|
||
"""Show user's overall statistics."""
|
||
user = await api_client.get_user_by_telegram_id(message.from_user.id)
|
||
|
||
if not user:
|
||
await message.answer(
|
||
"Сначала привяжи аккаунт через настройки профиля на сайте.",
|
||
reply_markup=get_main_menu()
|
||
)
|
||
return
|
||
|
||
stats = await api_client.get_user_stats(message.from_user.id)
|
||
|
||
if not stats:
|
||
await message.answer(
|
||
"<b>📈 Статистика</b>\n\n"
|
||
"Пока нет данных для отображения.\n"
|
||
"Начни участвовать в марафонах!",
|
||
reply_markup=get_main_menu()
|
||
)
|
||
return
|
||
|
||
text = f"<b>📈 Общая статистика</b>\n\n"
|
||
text += f"👤 <b>{user.get('nickname', 'Игрок')}</b>\n\n"
|
||
text += f"🏆 Марафонов завершено: <b>{stats.get('marathons_completed', 0)}</b>\n"
|
||
text += f"🎮 Марафонов активно: <b>{stats.get('marathons_active', 0)}</b>\n"
|
||
text += f"✅ Заданий выполнено: <b>{stats.get('challenges_completed', 0)}</b>\n"
|
||
text += f"💰 Всего очков: <b>{stats.get('total_points', 0)}</b>\n"
|
||
text += f"🔥 Лучший стрик: <b>{stats.get('best_streak', 0)}</b>\n"
|
||
|
||
await message.answer(text, reply_markup=get_main_menu())
|
||
|
||
|
||
@router.message(Command("settings"))
|
||
@router.message(F.text == "⚙️ Настройки")
|
||
async def cmd_settings(message: Message):
|
||
"""Show notification settings."""
|
||
user = await api_client.get_user_by_telegram_id(message.from_user.id)
|
||
|
||
if not user:
|
||
await message.answer(
|
||
"Сначала привяжи аккаунт через настройки профиля на сайте.",
|
||
reply_markup=get_main_menu()
|
||
)
|
||
return
|
||
|
||
await message.answer(
|
||
"<b>⚙️ Настройки</b>\n\n"
|
||
"Управление уведомлениями будет доступно в следующем обновлении.\n\n"
|
||
"Сейчас ты получаешь все уведомления:\n"
|
||
"• 🌟 События (Golden Hour, Jackpot и др.)\n"
|
||
"• 🚀 Старт/финиш марафонов\n"
|
||
"• ⚠️ Споры по заданиям\n\n"
|
||
"Команды:\n"
|
||
"/unlink - Отвязать аккаунт\n"
|
||
"/status - Проверить привязку",
|
||
reply_markup=get_main_menu()
|
||
)
|