from aiogram import Router, types from aiogram.filters import Command from aiogram.enums.parse_mode import ParseMode import logging import aiohttp from instences.config import BASE_URL_FASTAPI router = Router() logger = logging.getLogger(__name__) async def call_api(method: str, endpoint: str, data=None, base_url: str = BASE_URL_FASTAPI): """ Универсальный HTTP-запрос к FastAPI для рефералок. Ожидаем: GET /user/{telegram_id}/referrals -> { "invited_count": int } """ url = f"{base_url}{endpoint}" logger.info(f"[referrals] Запрос: {method} {url} с данными {data}") try: async with aiohttp.ClientSession() as session: async with session.request( method, url, json=data, headers={"Content-Type": "application/json"}, ) as response: logger.info( f"[referrals] Ответ от {url}: статус {response.status}" ) if response.status in {200, 201}: result = await response.json() logger.debug(f"[referrals] Ответ JSON: {result}") return result if response.status == 404: logger.debug("[referrals] 404, возвращаю None") return None logger.error( f"[referrals] Ошибка в запросе: статус {response.status}, " f"причина {response.reason}" ) return "ERROR" except Exception as e: logger.exception(f"[referrals] Исключение при запросе к {url}: {e}") return "ERROR" async def _build_referral_text(bot, user_id: int) -> str: """ Текст реферальной программы + количество приглашённых. """ me = await bot.get_me() bot_username = me.username or "LarkVPN_bot" link = f"https://t.me/{bot_username}?start=ref_{user_id}" text = ( "👥 Реферальная программа\n\n" "Зови друзей в Lark VPN и получай бонусы на баланс.\n\n" f"🔗 Твоя ссылка:\n{link}\n\n" ) invited_count = 0 stats = await call_api("GET", f"/user/{user_id}/referrals") if isinstance(stats, dict): raw = stats.get("invited_count") try: invited_count = int(raw) except (TypeError, ValueError): invited_count = 0 elif stats == "ERROR": logger.warning( f"[referrals] Ошибка при получении статистики для user_id={user_id}" ) text += f"👤 Приглашено: {invited_count}\n\n" text += "Бонусы начисляются, когда приглашённые пополняют баланс." return text @router.message(Command("referrals")) async def referrals_command(message: types.Message): """ Команда /referrals — показывает текст реферальной программы. """ logger.info(f"[referrals] Команда /referrals от {message.from_user.id}") try: text = await _build_referral_text(message.bot, message.from_user.id) await message.answer(text, parse_mode=ParseMode.HTML) except Exception as e: logger.exception(f"[referrals] Ошибка в обработчике /referrals: {e}") await message.answer("Произошла ошибка. Попробуй позже.") @router.callback_query(lambda callback: callback.data == "referral") async def referrals_callback(callback: types.CallbackQuery): """ Кнопка «Реферальная программа» (если где-то есть). """ try: text = await _build_referral_text( callback.message.bot, callback.from_user.id, ) await callback.message.edit_text( text, parse_mode=ParseMode.HTML, ) except Exception as e: logger.exception( f"[referrals] Ошибка в обработчике callback 'referral': {e}") await callback.message.answer("Произошла ошибка. Попробуй позже.") finally: await callback.answer()