import os import asyncpg from aiogram import F, Router from aiogram.types import BufferedInputFile, CallbackQuery, InlineKeyboardButton, Message from aiogram.utils.keyboard import InlineKeyboardBuilder from bot import bot from config import CHANNEL_URL, CONNECT_ANDROID, CONNECT_IOS, DATABASE_URL, DOWNLOAD_ANDROID, DOWNLOAD_IOS, SUPPORT_CHAT_URL from database import add_connection, add_referral, check_connection_exists, get_trial from handlers.keys.trial_key import create_trial_key from handlers.texts import INSTRUCTIONS_TRIAL, WELCOME_TEXT, get_about_vpn from logger import logger router = Router() async def send_welcome_message(chat_id: int, trial_status: int, admin: bool): image_path = os.path.join("img", "pic.jpg") builder = InlineKeyboardBuilder() if trial_status == 0: builder.row( InlineKeyboardButton(text="🔗 Подключить VPN", callback_data="connect_vpn") ) builder.row( InlineKeyboardButton(text="👤 Личный кабинет", callback_data="view_profile") ) if admin: builder.row( InlineKeyboardButton(text="🔧 Администратор", callback_data="admin") ) builder.row( InlineKeyboardButton(text="📞 Техническая поддержка", url=SUPPORT_CHAT_URL), ) builder.row( InlineKeyboardButton(text="📢 Официальный канал", url=CHANNEL_URL), ) builder.row(InlineKeyboardButton(text="🌐 О нашем VPN", callback_data="about_vpn")) if os.path.isfile(image_path): with open(image_path, "rb") as image_from_buffer: await bot.send_photo( chat_id=chat_id, photo=BufferedInputFile(image_from_buffer.read(), filename="pic.jpg"), caption=WELCOME_TEXT, parse_mode="HTML", reply_markup=builder.as_markup(), ) else: await bot.send_message( chat_id=chat_id, text=WELCOME_TEXT, parse_mode="HTML", reply_markup=builder.as_markup(), ) async def start_command(message: Message, admin: bool = False): try: logger.info( f"Получена команда /start. Текст сообщения: {message.text}, user_id: {message.from_user.id}" ) if "referral_" in message.text: logger.info("Обнаружен реферальный код.") try: referrer_tg_id = int(message.text.split("referral_")[1]) logger.info(f"ID пригласившего пользователя: {referrer_tg_id}") except ValueError: logger.error("Ошибка парсинга реферального ID.") await message.answer("Некорректный реферальный код.") return connection_exists = await check_connection_exists(message.from_user.id) logger.info( f"Результат проверки подключения для user_id {message.from_user.id}: {connection_exists}" ) if not connection_exists: logger.info( f"Добавляем подключение для пользователя: {message.from_user.id}" ) await add_connection(message.from_user.id) logger.info( f"Добавляем реферал для пользователя {message.from_user.id}, приглашённым {referrer_tg_id}" ) await add_referral(message.from_user.id, referrer_tg_id) await message.answer("Вас пригласил друг, добро пожаловать!") else: logger.warning( f"Пользователь {message.from_user.id} уже зарегистрирован." ) await message.answer("Вы уже зарегистрированы в системе!") logger.info( f"Проверяем статус пробного периода для user_id {message.from_user.id}" ) trial_status = await get_trial(message.from_user.id) logger.info( f"Статус пробного периода для user_id {message.from_user.id}: {trial_status}" ) logger.info( f"Отправка приветственного сообщения для user_id {message.from_user.id}" ) await send_welcome_message(message.chat.id, trial_status, admin) except Exception as e: logger.error( f"Ошибка в обработке команды /start для user_id {message.from_user.id}: {e}" ) await message.answer("Произошла ошибка. Пожалуйста, попробуйте позже.") @router.callback_query(F.data == "connect_vpn") async def handle_connect_vpn(callback_query: CallbackQuery): await callback_query.message.delete() user_id = callback_query.from_user.id trial_key_info = await create_trial_key(user_id) if "error" in trial_key_info: await callback_query.message.answer(trial_key_info["error"]) else: try: conn = await asyncpg.connect(DATABASE_URL) result = await conn.execute( """ UPDATE connections SET trial = 1 WHERE tg_id = $1 """, user_id, ) logger.info(f"Rows updated: {result}") await conn.close() except Exception as e: logger.error(f"Ошибка при обновлении trial: {e}") await callback_query.message.answer( "Произошла ошибка при обновлении статуса." ) key_message = ( f"🔑 Ваш персональный ключ доступа:\n" f"
{trial_key_info['key']}
\n\n" f"📋 Быстрая инструкция по подключению:\n{INSTRUCTIONS_TRIAL}" ) builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text="👤 Личный кабинет", callback_data="view_profile") ) builder.row( InlineKeyboardButton(text="🍏 Скачать для iOS", url=DOWNLOAD_IOS), InlineKeyboardButton(text="🤖 Скачать для Android", url=DOWNLOAD_ANDROID), ) builder.row( InlineKeyboardButton( text="🍏 Подключить на iOS", url=f'{CONNECT_IOS}{trial_key_info["key"]}' ), InlineKeyboardButton( text="🤖 Подключить на Android", url=f'{CONNECT_ANDROID}{trial_key_info["key"]}', ), ) await callback_query.message.answer( key_message, parse_mode="HTML", reply_markup=builder.as_markup() ) await callback_query.answer() @router.callback_query(F.data == "about_vpn") async def handle_about_vpn(callback_query: CallbackQuery): await callback_query.message.delete() about_vpn_message = get_about_vpn("3.1.1_Stable") builder = InlineKeyboardBuilder() builder.row( InlineKeyboardButton(text="💰 Поддержать проект", callback_data="donate") ) builder.row(InlineKeyboardButton(text="⬅️ Назад", callback_data="back_to_menu")) await callback_query.message.answer( about_vpn_message, parse_mode="HTML", reply_markup=builder.as_markup() ) await callback_query.answer() @router.callback_query(F.data == "back_to_menu") async def handle_back_to_menu(callback_query: CallbackQuery, admin: bool = False): await callback_query.message.delete() trial_status = await get_trial(callback_query.from_user.id) await send_welcome_message(callback_query.from_user.id, trial_status, admin) await callback_query.answer()