Реферальная программа: кнопка и экран

This commit is contained in:
unknown
2025-11-25 20:20:38 +03:00
parent a572c90194
commit cbf113f7bb
4 changed files with 98 additions and 11 deletions

View File

@@ -2,6 +2,12 @@ from .start import router as start_router
from .profile import router as profile_router from .profile import router as profile_router
from .subscriptions import router as subscriptions_router from .subscriptions import router as subscriptions_router
from .support import router as support_router from .support import router as support_router
from .referrals import router as referrals_router
# Экспортируем все маршрутизаторы routers = [
routers = [start_router,profile_router,subscriptions_router,support_router] start_router,
profile_router,
subscriptions_router,
support_router,
referrals_router,
]

58
handlers/referrals.py Normal file
View File

@@ -0,0 +1,58 @@
from aiogram import Router, types
from aiogram.filters import Command
from aiogram.enums.parse_mode import ParseMode
import logging
router = Router()
logger = logging.getLogger(__name__)
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"
"👤 Приглашено: —\n"
"💰 Начислено бонусов: — ₽\n\n"
"Бонусы падают автоматически, когда приглашённые пополняют баланс."
)
return text
@router.message(Command("referrals"))
async def referrals_command(message: types.Message):
"""
Команда /referrals — показывает текст реферальной программы.
"""
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: {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"Ошибка в обработчике callback 'referral': {e}")
await callback.message.answer("Произошла ошибка. Попробуй позже.")
finally:
await callback.answer()

View File

@@ -4,19 +4,40 @@ from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder
from aiogram.types import InlineKeyboardButton, KeyboardButton from aiogram.types import InlineKeyboardButton, KeyboardButton
from aiogram.utils.keyboard import InlineKeyboardBuilder, ReplyKeyboardBuilder
from aiogram.types import InlineKeyboardButton, KeyboardButton
# ... остальной код выше не трогаем ...
def main_keyboard(): def main_keyboard():
""" """
Главное меню (только визуал перетянут под твой стиль) Главное меню (только визуал перетянут под твой стиль)
""" """
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton( builder.row(
text="📜 Профиль", callback_data="profile")) InlineKeyboardButton(
builder.row(InlineKeyboardButton(text="❔ FAQ ❔", callback_data="faq")) text="📜 Профиль",
callback_data="profile",
)
)
builder.row(
InlineKeyboardButton(
text="👥 Реферальная программа",
callback_data="referral",
)
)
builder.row(
InlineKeyboardButton(
text="❔ FAQ ❔",
callback_data="faq",
)
)
# Оставляем URL как у Вовы, меняем только текст # Оставляем URL как у Вовы, меняем только текст
builder.row( builder.row(
InlineKeyboardButton( InlineKeyboardButton(
text=" О нас", text=" О нас",
url="https://www.youtube.com/watch?v=Zirn-CKck-c" url="https://www.youtube.com/watch?v=Zirn-CKck-c",
) )
) )
return builder.as_markup() return builder.as_markup()

10
main.py
View File

@@ -11,7 +11,8 @@ import logging
BOT_TOKEN = os.getenv("TOKEN") BOT_TOKEN = os.getenv("TOKEN")
if not BOT_TOKEN: if not BOT_TOKEN:
raise ValueError("Не задан токен бота. Убедитесь, что переменная окружения 'TOKEN' установлена.") raise ValueError(
"Не задан токен бота. Убедитесь, что переменная окружения 'TOKEN' установлена.")
bot = Bot(token=BOT_TOKEN) bot = Bot(token=BOT_TOKEN)
dp = Dispatcher() dp = Dispatcher()
@@ -23,9 +24,10 @@ dp.message.middleware(AntiSpamMiddleware(rate_limit=1))
async def set_commands(): async def set_commands():
"""Устанавливает команды для бота.""" """Устанавливает команды для бота."""
commands = [ commands = [
BotCommand(command="/start", description="🥚Главное меню"), BotCommand(command="start", description="Запуск бота"),
BotCommand(command="/subscriptions", description="🦴Мои подписки"), BotCommand(command="subscriptions", description="Мои подписки"),
BotCommand(command="/support", description="❕Поддержка"), BotCommand(command="support", description="Техподдержка"),
BotCommand(command="referrals", description="Реферальная программа"),
] ]
await bot.set_my_commands(commands) await bot.set_my_commands(commands)