124 lines
4.5 KiB
Python
124 lines
4.5 KiB
Python
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 = (
|
||
"👥 <b>Реферальная программа</b>\n\n"
|
||
"Зови друзей в Lark VPN и получай бонусы на баланс.\n\n"
|
||
f"🔗 Твоя ссылка:\n<code>{link}</code>\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()
|