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 from aiogram.enums.parse_mode import ParseMode from .referrals import _build_referral_text 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: """ Текст приветствия в /start и в главном меню. Имя пока не используем — оставляем сигнатуру на будущее. """ return "🥚 Lark Security\n\nВыберите действие из меню ниже." @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.message(Command("referrals")) async def referrals_menu_command(message: Message): """ Команда /referrals из бокового меню Telegram. Показывает текст реферальной программы. """ logger.info( f"Получена команда /referrals от пользователя: " f"{message.from_user.id} ({message.from_user.username})" ) try: text = await _build_referral_text(message.bot, message.from_user.id) await message.answer(text, parse_mode=ParseMode.HTML) logger.info("Реферальная программа отправлена пользователю.") except Exception as e: logger.exception( f"Ошибка при обработке команды /referrals для пользователя " 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()