Files
Telegram-bot-old/handlers/referrals.py

124 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()