значительная переработка интерфейса
This commit is contained in:
@@ -5,16 +5,15 @@ from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
||||
async def send_instructions(callback_query: types.CallbackQuery):
|
||||
instructions_message = (
|
||||
"*📋 Инструкции по использованию вашего ключа:*\n\n"
|
||||
"1. Скачайте приложение для вашего устройства:\n"
|
||||
" - Для Android: [V2Ray](https://play.google.com/store/apps/details?id=com.v2ray.ang&hl=ru&pli=1)\n"
|
||||
" - Для iPhone: [Streisand](https://apps.apple.com/ru/app/streisand/id6450534064)\n"
|
||||
" - Для Windows: [Hiddify Next](https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.Msix)\n\n"
|
||||
"2. Скопируйте предоставленный ключ, который вы получили ранее.\n"
|
||||
"3. Откройте приложение и нажмите на плюсик сверху справа.\n"
|
||||
"4. Выберите 'Вставить из буфера обмена' для добавления ключа.\n\n"
|
||||
"💬 Если у вас возникнут вопросы, не стесняйтесь обращаться в поддержку."
|
||||
"1. **Скачайте приложение для вашего устройства:**\n"
|
||||
" - **Для Android:** [V2Ray](https://play.google.com/store/apps/details?id=com.v2ray.ang&hl=ru&pli=1)\n"
|
||||
" - **Для iPhone:** [Streisand](https://apps.apple.com/ru/app/streisand/id6450534064)\n"
|
||||
" - **Для Windows:** [Hiddify Next](https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.Msix)\n\n"
|
||||
"2. **Скопируйте предоставленный ключ**, который вы получили ранее.\n"
|
||||
"3. **Откройте приложение и нажмите на плюсик сверху справа.**\n"
|
||||
"4. **Выберите 'Вставить из буфера обмена' для добавления ключа.**\n\n"
|
||||
"💬 Если у вас возникнут вопросы, не стесняйтесь обращаться в [поддержку](https://t.me/solonet_sup)."
|
||||
)
|
||||
|
||||
back_button = InlineKeyboardButton(text='🔙 Назад', callback_data='back_to_main')
|
||||
keyboard = InlineKeyboardMarkup(inline_keyboard=[[back_button]])
|
||||
|
||||
|
||||
+27
-8
@@ -8,6 +8,9 @@ from bot import bot
|
||||
from client import add_client, delete_client, extend_client_key
|
||||
from config import ADMIN_PASSWORD, ADMIN_USERNAME, DATABASE_URL, SERVERS
|
||||
from database import get_balance, update_balance
|
||||
import locale
|
||||
|
||||
locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')
|
||||
|
||||
router = Router()
|
||||
|
||||
@@ -30,14 +33,25 @@ async def process_callback_view_keys(callback_query: types.CallbackQuery):
|
||||
button = types.InlineKeyboardButton(text=f"🔑 {key_name}", callback_data=f'view_key|{key_name}|{client_id}')
|
||||
buttons.append([button])
|
||||
|
||||
# Добавляем кнопку "Назад" в конце списка
|
||||
back_button = types.InlineKeyboardButton(text='🔙 Назад', callback_data='view_profile')
|
||||
buttons.append([back_button])
|
||||
|
||||
inline_keyboard = types.InlineKeyboardMarkup(inline_keyboard=buttons)
|
||||
response_message = "<b>Выберите устройство:</b>"
|
||||
response_message = (
|
||||
"<b>Это ваши устройства:</b>\n\n"
|
||||
"<i>Нажмите на имя устройства для управления его ключом.</i>" # Добавлено курсивом
|
||||
)
|
||||
|
||||
await bot.edit_message_text(response_message, chat_id=tg_id, message_id=callback_query.message.message_id, reply_markup=inline_keyboard, parse_mode="HTML")
|
||||
else:
|
||||
response_message = "<b>У вас нет ключей.</b>"
|
||||
response_message = (
|
||||
"<b>У вас нет подключённых устройств</b> 😕\n\n"
|
||||
"➕ <b>Создайте первое устройство, чтобы подключиться к VPN</b>.\n"
|
||||
"Ваши устройства будут отображаться здесь."
|
||||
)
|
||||
create_key_button = types.InlineKeyboardButton(text='➕ Создать ключ', callback_data='create_key')
|
||||
back_button = types.InlineKeyboardButton(text='🔙 Назад', callback_data='view_profile') # Измените на правильное значение для кнопки "Назад"
|
||||
back_button = types.InlineKeyboardButton(text='🔙 Назад', callback_data='view_profile')
|
||||
|
||||
keyboard = types.InlineKeyboardMarkup(inline_keyboard=[[create_key_button], [back_button]])
|
||||
|
||||
@@ -51,6 +65,7 @@ async def process_callback_view_keys(callback_query: types.CallbackQuery):
|
||||
|
||||
await callback_query.answer()
|
||||
|
||||
|
||||
@router.callback_query(lambda c: c.data.startswith('view_key|'))
|
||||
async def process_callback_view_key(callback_query: types.CallbackQuery):
|
||||
tg_id = callback_query.from_user.id
|
||||
@@ -84,10 +99,14 @@ async def process_callback_view_key(callback_query: types.CallbackQuery):
|
||||
hours_left = time_left.seconds // 3600
|
||||
days_left_message = f"Осталось часов: <b>{hours_left}</b>"
|
||||
|
||||
# Форматируем дату окончания в удобочитаемом виде
|
||||
formatted_expiry_date = expiry_date.strftime('%d %B %Y года')
|
||||
|
||||
response_message = (f"🔑 <b>Ваш ключ:</b>\n<pre>{key}</pre>\n"
|
||||
f"📅 <b>Дата окончания:</b> {expiry_date.strftime('%Y-%m-%d %H:%M:%S')}\n"
|
||||
f"📅 <b>Дата окончания:</b> {formatted_expiry_date}\n"
|
||||
f"{days_left_message}\n"
|
||||
f"🌍 <b>Сервер:</b> {server_name}")
|
||||
f"🌍 <b>Сервер:</b> {server_name}\n\n" # Отступ между сервером и текстом
|
||||
f"<i>Скопируйте ключ и перейдите в инструкции👇</i>") # Курсивный текст
|
||||
|
||||
renew_button = types.InlineKeyboardButton(text='⏳ Продлить ключ', callback_data=f'renew_key|{client_id}')
|
||||
instructions_button = types.InlineKeyboardButton(text='📘 Инструкции', callback_data='instructions')
|
||||
@@ -152,8 +171,8 @@ async def process_callback_renew_key(callback_query: types.CallbackQuery):
|
||||
])
|
||||
|
||||
balance = await get_balance(tg_id)
|
||||
response_message = (f"<b>Выберите план продления:</b>\n"
|
||||
f"💰 <b>Баланс:</b> {balance} руб.\n"
|
||||
response_message = (f"<b>Выберите план продления:</b>\n\n"
|
||||
f"💰 <b>Баланс:</b> {balance} руб.\n\n"
|
||||
f"📅 <b>Текущая дата истечения ключа:</b> {datetime.utcfromtimestamp(expiry_time / 1000).strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
|
||||
await bot.edit_message_text(response_message, chat_id=tg_id, message_id=callback_query.message.message_id, reply_markup=keyboard, parse_mode="HTML")
|
||||
@@ -328,7 +347,7 @@ async def process_callback_select_server(callback_query: types.CallbackQuery):
|
||||
|
||||
if success_delete:
|
||||
response_message = (f"Ключ успешно перемещен на новый сервер.\n\n"
|
||||
f"<b>Удалите старый ключ и используйте новый для подключения к новому серверу:</b>\n"
|
||||
f"<b>Удалите старый ключ из вашего приложения и используйте новый для подключения к новому серверу:</b>\n"
|
||||
f"<pre>{new_key}</pre>")
|
||||
else:
|
||||
response_message = "Ошибка при удалении ключа с текущего сервера. Клиент не удален."
|
||||
|
||||
+12
-5
@@ -4,7 +4,7 @@ from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
||||
from aiogram.fsm.state import State, StatesGroup
|
||||
|
||||
from bot import bot
|
||||
from database import get_balance, get_key_count, get_referral_stats
|
||||
from database import get_balance, get_key_count, get_referral_stats, get_keys
|
||||
|
||||
class ReplenishBalanceState(StatesGroup):
|
||||
choosing_transfer_method = State()
|
||||
@@ -12,7 +12,6 @@ class ReplenishBalanceState(StatesGroup):
|
||||
|
||||
router = Router()
|
||||
|
||||
# Хендлер для показа профиля
|
||||
async def process_callback_view_profile(callback_query: types.CallbackQuery, state: FSMContext):
|
||||
tg_id = callback_query.from_user.id
|
||||
username = callback_query.from_user.full_name
|
||||
@@ -22,13 +21,21 @@ async def process_callback_view_profile(callback_query: types.CallbackQuery, sta
|
||||
balance = await get_balance(tg_id)
|
||||
if balance is None:
|
||||
balance = 0
|
||||
|
||||
|
||||
profile_message = (
|
||||
f"<b>Профиль: {username}</b>\n\n"
|
||||
f"🔹 <b>ID:</b> {tg_id}\n"
|
||||
f"🔹 <b>Баланс:</b> {balance} RUB\n"
|
||||
f"🔹 <b>К-во устройств:</b> {key_count}\n"
|
||||
f"🔹 <b>К-во устройств:</b> {key_count}\n\n"
|
||||
)
|
||||
|
||||
profile_message += (
|
||||
f"<b>Обязательно подпишитесь на канал</b> <a href='https://t.me/solonet_vpn'>здесь</a>\n"
|
||||
)
|
||||
|
||||
# Если у клиента нет ключей, добавляем сообщение
|
||||
if key_count == 0:
|
||||
profile_message += "\n<i>Нажмите ➕Устройство снизу чтобы добавить устройство в VPN</i>"
|
||||
|
||||
button_create_key = InlineKeyboardButton(text='➕ Устройство', callback_data='create_key')
|
||||
button_view_keys = InlineKeyboardButton(text='📱 Мои устройства', callback_data='view_keys')
|
||||
@@ -40,7 +47,7 @@ async def process_callback_view_profile(callback_query: types.CallbackQuery, sta
|
||||
[button_create_key],
|
||||
[button_view_keys],
|
||||
[button_replenish_balance],
|
||||
[button_invite], # Добавили кнопку "Пригласить"
|
||||
[button_invite],
|
||||
[button_back]
|
||||
])
|
||||
|
||||
|
||||
+21
-7
@@ -16,9 +16,18 @@ class FeedbackState(StatesGroup):
|
||||
|
||||
async def send_welcome_message(chat_id: int):
|
||||
welcome_text = (
|
||||
"*SoloNet — ваш доступ в свободный интернет! 🌐✨*\n\n"
|
||||
"Используйте надежный и быстрый VPN, который гарантирует вашу безопасность даже в самых строгих условиях. 🔒🚀\n\n"
|
||||
"*ver. 1.1*"
|
||||
"<b>🎉 SoloNet — твой доступ в свободный интернет! 🌐✨</b>\n\n"
|
||||
"<b>Наши преимущества:</b>\n"
|
||||
"<pre>"
|
||||
"🚀 <b>Высокая скорость</b>\n"
|
||||
"🔄 <b>Стабильность</b>\n"
|
||||
"🌍 <b>Смена локаций</b>\n"
|
||||
"💬 <b>Отзывчивая поддержка</b>\n"
|
||||
"📱💻 <b>Для телефонов, компьютеров и планшетов</b>\n"
|
||||
"💰 <b>Реферальная программа: 25% от покупки</b>\n"
|
||||
"</pre>"
|
||||
"\n🎁 <b>1 день бесплатно</b>\n\n"
|
||||
"<i>Перейдите в профиль для продолжения 👇</i>"
|
||||
)
|
||||
|
||||
image_path = os.path.join(os.path.dirname(__file__), 'pic.jpg')
|
||||
@@ -39,7 +48,7 @@ async def send_welcome_message(chat_id: int):
|
||||
chat_id,
|
||||
BufferedInputFile(image_from_buffer.read(), filename="pic.jpg"),
|
||||
caption=welcome_text,
|
||||
parse_mode='Markdown',
|
||||
parse_mode='HTML',
|
||||
reply_markup=inline_keyboard
|
||||
)
|
||||
|
||||
@@ -64,9 +73,14 @@ async def handle_about_vpn(callback_query: CallbackQuery):
|
||||
await callback_query.message.delete()
|
||||
info_message = (
|
||||
"*О VPN*\n\n"
|
||||
"Мы используем высокоскоростные серверы в разных локациях и выдаём ключ каждому индивидуально. "
|
||||
"Также мы применяем новейшие протоколы шифрования для обеспечения безопасности ваших данных.\n\n"
|
||||
"<b>Ваш ключ — ваша безопасность! Не передавайте своё шифрование сторонним лицам.</b>"
|
||||
"<b>🚀 Высокоскоростные серверы</b>\n"
|
||||
"Мы используем высокоскоростные серверы в различных локациях для обеспечения стабильного и быстрого соединения.\n\n"
|
||||
|
||||
"<b>🔐 Безопасность данных</b>\n"
|
||||
"Для защиты ваших данных мы применяем новейшие протоколы шифрования, которые гарантируют вашу конфиденциальность.\n\n"
|
||||
|
||||
"<b>🔑 Ваш ключ — ваша безопасность!</b>\n"
|
||||
"Не передавайте своё шифрование сторонним лицам, чтобы избежать рисков.\n"
|
||||
)
|
||||
|
||||
button_back = InlineKeyboardButton(text='⬅️ Назад', callback_data='back_to_menu')
|
||||
|
||||
Reference in New Issue
Block a user