147 lines
6.8 KiB
Python
147 lines
6.8 KiB
Python
import logging
|
||
|
||
from aiogram import Router, F, Bot
|
||
from aiogram.filters import CommandStart, Command, CommandObject
|
||
from aiogram.types import Message
|
||
|
||
from config import settings
|
||
from keyboards.main_menu import get_main_menu
|
||
from services.api_client import api_client
|
||
|
||
logger = logging.getLogger(__name__)
|
||
router = Router()
|
||
|
||
|
||
async def get_user_avatar_url(bot: Bot, user_id: int) -> str | None:
|
||
"""Get user's Telegram profile photo URL."""
|
||
try:
|
||
photos = await bot.get_user_profile_photos(user_id, limit=1)
|
||
if photos.total_count > 0 and photos.photos:
|
||
# Get the largest photo (last in the list)
|
||
photo = photos.photos[0][-1]
|
||
file = await bot.get_file(photo.file_id)
|
||
if file.file_path:
|
||
return f"https://api.telegram.org/file/bot{settings.TELEGRAM_BOT_TOKEN}/{file.file_path}"
|
||
except Exception as e:
|
||
logger.warning(f"[START] Could not get user avatar: {e}")
|
||
return None
|
||
|
||
|
||
@router.message(CommandStart())
|
||
async def cmd_start(message: Message, command: CommandObject):
|
||
"""Handle /start command with or without deep link."""
|
||
logger.info(f"[START] ==================== START COMMAND ====================")
|
||
logger.info(f"[START] Telegram user: id={message.from_user.id}, username=@{message.from_user.username}")
|
||
logger.info(f"[START] Full message text: '{message.text}'")
|
||
logger.info(f"[START] Deep link args (command.args): '{command.args}'")
|
||
|
||
# Check if there's a deep link token (for account linking)
|
||
token = command.args
|
||
if token:
|
||
logger.info(f"[START] -------- TOKEN RECEIVED --------")
|
||
logger.info(f"[START] Token: {token}")
|
||
logger.info(f"[START] Token length: {len(token)} chars")
|
||
|
||
# Get user's avatar
|
||
avatar_url = await get_user_avatar_url(message.bot, message.from_user.id)
|
||
logger.info(f"[START] User avatar URL: {avatar_url}")
|
||
|
||
logger.info(f"[START] -------- CALLING API --------")
|
||
logger.info(f"[START] Sending to /telegram/confirm-link:")
|
||
logger.info(f"[START] - token: {token}")
|
||
logger.info(f"[START] - telegram_id: {message.from_user.id}")
|
||
logger.info(f"[START] - telegram_username: {message.from_user.username}")
|
||
logger.info(f"[START] - telegram_first_name: {message.from_user.first_name}")
|
||
logger.info(f"[START] - telegram_last_name: {message.from_user.last_name}")
|
||
logger.info(f"[START] - telegram_avatar_url: {avatar_url}")
|
||
|
||
result = await api_client.confirm_telegram_link(
|
||
token=token,
|
||
telegram_id=message.from_user.id,
|
||
telegram_username=message.from_user.username,
|
||
telegram_first_name=message.from_user.first_name,
|
||
telegram_last_name=message.from_user.last_name,
|
||
telegram_avatar_url=avatar_url
|
||
)
|
||
|
||
logger.info(f"[START] -------- API RESPONSE --------")
|
||
logger.info(f"[START] Response: {result}")
|
||
logger.info(f"[START] Success: {result.get('success')}")
|
||
|
||
if result.get("success"):
|
||
user_nickname = result.get("nickname", "пользователь")
|
||
logger.info(f"[START] ✅ LINK SUCCESS! User '{user_nickname}' linked to telegram_id={message.from_user.id}")
|
||
await message.answer(
|
||
f"<b>Аккаунт успешно привязан!</b>\n\n"
|
||
f"Привет, <b>{user_nickname}</b>!\n\n"
|
||
f"Теперь ты будешь получать уведомления о:\n"
|
||
f"• Начале и окончании событий (Golden Hour, Jackpot и др.)\n"
|
||
f"• Старте и завершении марафонов\n"
|
||
f"• Спорах по твоим заданиям\n\n"
|
||
f"Используй меню ниже для навигации:",
|
||
reply_markup=get_main_menu()
|
||
)
|
||
return
|
||
else:
|
||
error = result.get("error", "Неизвестная ошибка")
|
||
logger.error(f"[START] ❌ LINK FAILED!")
|
||
logger.error(f"[START] Error: {error}")
|
||
logger.error(f"[START] Token was: {token}")
|
||
await message.answer(
|
||
f"<b>Ошибка привязки аккаунта</b>\n\n"
|
||
f"{error}\n\n"
|
||
f"Попробуй получить новую ссылку на сайте.",
|
||
reply_markup=get_main_menu()
|
||
)
|
||
return
|
||
|
||
# No token - regular start
|
||
logger.info(f"[START] No token, checking if user is already linked...")
|
||
user = await api_client.get_user_by_telegram_id(message.from_user.id)
|
||
logger.info(f"[START] API response: {user}")
|
||
|
||
if user:
|
||
await message.answer(
|
||
f"<b>С возвращением, {user.get('nickname', 'игрок')}!</b>\n\n"
|
||
f"Твой аккаунт привязан. Используй меню для навигации:",
|
||
reply_markup=get_main_menu()
|
||
)
|
||
else:
|
||
await message.answer(
|
||
"<b>Добро пожаловать в Game Marathon Bot!</b>\n\n"
|
||
"Этот бот поможет тебе следить за марафонами и "
|
||
"получать уведомления о важных событиях.\n\n"
|
||
"<b>Для начала работы:</b>\n"
|
||
"1. Зайди на сайт в настройки профиля\n"
|
||
"2. Нажми кнопку «Привязать Telegram»\n"
|
||
"3. Перейди по полученной ссылке\n\n"
|
||
"После привязки ты сможешь:\n"
|
||
"• Смотреть свои марафоны\n"
|
||
"• Получать уведомления о событиях\n"
|
||
"• Следить за статистикой",
|
||
reply_markup=get_main_menu()
|
||
)
|
||
|
||
|
||
@router.message(Command("help"))
|
||
@router.message(F.text == "❓ Помощь")
|
||
async def cmd_help(message: Message):
|
||
"""Handle /help command."""
|
||
await message.answer(
|
||
"<b>Справка по командам:</b>\n\n"
|
||
"/start - Начать работу с ботом\n"
|
||
"/marathons - Мои марафоны\n"
|
||
"/stats - Моя статистика\n"
|
||
"/settings - Настройки уведомлений\n"
|
||
"/help - Эта справка\n\n"
|
||
"<b>Уведомления:</b>\n"
|
||
"Бот присылает уведомления о:\n"
|
||
"• 🌟 Golden Hour - очки x1.5\n"
|
||
"• 🎰 Jackpot - очки x3\n"
|
||
"• ⚡ Double Risk - половина очков, дропы бесплатны\n"
|
||
"• 👥 Common Enemy - общий челлендж\n"
|
||
"• 🚀 Старт/финиш марафонов\n"
|
||
"• ⚠️ Споры по заданиям",
|
||
reply_markup=get_main_menu()
|
||
)
|