from aiogram import Router, types from aiogram.filters import Command from aiogram.types import Message, CallbackQuery import logging from instences.config import BASE_URL_FASTAPI import aiohttp from keyboard.keyboards import main_keyboard router = Router() logger = logging.getLogger(__name__) async def call_api(method, endpoint, data=None): """ Выполняет HTTP-запрос к FastAPI. :param method: HTTP метод (GET, POST, и т.д.) :param endpoint: конечная точка API :param data: тело запроса (если необходимо) :return: JSON-ответ или "ERROR" при неуспехе """ url = f"{BASE_URL_FASTAPI}{endpoint}" logger.info(f"Инициализация запроса: {method} {url} с данными {data}") try: async with aiohttp.ClientSession() as session: async with session.request(method, url, json=data) as response: logger.info( f"Получен ответ от {url}: статус {response.status}") if response.status in {200, 201}: result = await response.json() logger.debug(f"Ответ JSON: {result}") return result if response.status == 404: logger.debug(f"Код {response.status}, возвращаю ничего") return None logger.error( f"Ошибка в запросе: статус {response.status}, причина {response.reason}") return "ERROR" except Exception as e: logger.exception(f"Исключение при выполнении запроса к {url}: {e}") return "ERROR" def _welcome_text(username: str | None) -> str: uname = username or "птенец" return ( f"🪽 Добро пожаловать в Lark VPN, {uname}!\n\n" "Здесь ты получаешь стабильный доступ к TikTok, YouTube, Discord, Instagram " "и другим сервисам без ограничений.\n\n" "1️⃣ Пополни баланс\n" "2️⃣ Выбери подходящий тариф\n" "3️⃣ Подключай конфиг на своих устройствах и забудь про блокировки.\n\n" "Следи за акциями и розыгрышами в канале:\n" "https://t.me/+0z5xqn3F1m02OTJi\n\n" "Lark держит связь. 🐣🦅" ) @router.message(Command("start")) async def start_command(message: Message): """ Обработчик команды /start. Визуал и текст — обновлены, логика работы с API не тронута. """ logger.info( f"Получена команда /start от пользователя: " f"{message.from_user.id} ({message.from_user.username})" ) try: user_data = await call_api("GET", f"/user/{message.from_user.id}") if not user_data: logger.debug( "Пользователь не найден в базе, создаем новую запись.") await call_api("POST", "/user/create", {"telegram_id": message.from_user.id}) logger.debug("Отправка приветственного сообщения пользователю.") await message.answer( _welcome_text(message.from_user.username), reply_markup=main_keyboard(), ) logger.info("Приветственное сообщение отправлено.") except Exception as e: logger.exception( f"Ошибка при обработке команды /start для пользователя " f"{message.from_user.id}: {e}" ) await message.answer("Произошла ошибка. Попробуйте позже.") @router.callback_query(lambda callback: callback.data == "base") async def start_callback_handler(callback: CallbackQuery): """ Обработчик callback_query с data="base". Возвращает пользователя в главное меню. """ try: user_data = await call_api("GET", f"/user/{callback.from_user.id}") if not user_data: await call_api( "POST", "/user/create", {"telegram_id": callback.from_user.id}, ) await callback.message.edit_text( _welcome_text(callback.from_user.username), reply_markup=main_keyboard(), ) except Exception as e: logger.exception(f"Ошибка при обработке callback с data='base': {e}") await callback.message.answer("Произошла ошибка. Попробуйте позже.") finally: await callback.answer()