Реферальная программа: кнопка и экран
This commit is contained in:
@@ -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
58
handlers/referrals.py
Normal 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()
|
||||||
@@ -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
10
main.py
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user