diff --git a/handlers/instructions.py b/handlers/instructions.py index 1a8db93a..a0d5f21e 100644 --- a/handlers/instructions.py +++ b/handlers/instructions.py @@ -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]]) diff --git a/handlers/keys.py b/handlers/keys.py index 9700fcc6..c61558dc 100644 --- a/handlers/keys.py +++ b/handlers/keys.py @@ -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 = "Выберите устройство:" + response_message = ( + "Это ваши устройства:\n\n" + "Нажмите на имя устройства для управления его ключом." # Добавлено курсивом + ) 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 = "У вас нет ключей." + response_message = ( + "У вас нет подключённых устройств 😕\n\n" + "➕ Создайте первое устройство, чтобы подключиться к VPN.\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"Осталось часов: {hours_left}" + # Форматируем дату окончания в удобочитаемом виде + formatted_expiry_date = expiry_date.strftime('%d %B %Y года') + response_message = (f"🔑 Ваш ключ:\n
{key}\n"
- f"📅 Дата окончания: {expiry_date.strftime('%Y-%m-%d %H:%M:%S')}\n"
+ f"📅 Дата окончания: {formatted_expiry_date}\n"
f"{days_left_message}\n"
- f"🌍 Сервер: {server_name}")
+ f"🌍 Сервер: {server_name}\n\n" # Отступ между сервером и текстом
+ f"Скопируйте ключ и перейдите в инструкции👇") # Курсивный текст
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"Выберите план продления:\n"
- f"💰 Баланс: {balance} руб.\n"
+ response_message = (f"Выберите план продления:\n\n"
+ f"💰 Баланс: {balance} руб.\n\n"
f"📅 Текущая дата истечения ключа: {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"Удалите старый ключ и используйте новый для подключения к новому серверу:\n"
+ f"Удалите старый ключ из вашего приложения и используйте новый для подключения к новому серверу:\n"
f"{new_key}")
else:
response_message = "Ошибка при удалении ключа с текущего сервера. Клиент не удален."
diff --git a/handlers/profile.py b/handlers/profile.py
index 939600d1..880ab930 100644
--- a/handlers/profile.py
+++ b/handlers/profile.py
@@ -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"Профиль: {username}\n\n"
f"🔹 ID: {tg_id}\n"
f"🔹 Баланс: {balance} RUB\n"
- f"🔹 К-во устройств: {key_count}\n"
+ f"🔹 К-во устройств: {key_count}\n\n"
)
+
+ profile_message += (
+ f"Обязательно подпишитесь на канал здесь\n"
+ )
+
+ # Если у клиента нет ключей, добавляем сообщение
+ if key_count == 0:
+ profile_message += "\nНажмите ➕Устройство снизу чтобы добавить устройство в VPN"
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]
])
diff --git a/handlers/start.py b/handlers/start.py
index ca534bf0..16bcfe49 100644
--- a/handlers/start.py
+++ b/handlers/start.py
@@ -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*"
+ "🎉 SoloNet — твой доступ в свободный интернет! 🌐✨\n\n"
+ "Наши преимущества:\n"
+ "" + "🚀 Высокая скорость\n" + "🔄 Стабильность\n" + "🌍 Смена локаций\n" + "💬 Отзывчивая поддержка\n" + "📱💻 Для телефонов, компьютеров и планшетов\n" + "💰 Реферальная программа: 25% от покупки\n" + "" + "\n🎁 1 день бесплатно\n\n" + "Перейдите в профиль для продолжения 👇" ) 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" - "Ваш ключ — ваша безопасность! Не передавайте своё шифрование сторонним лицам." + "🚀 Высокоскоростные серверы\n" + "Мы используем высокоскоростные серверы в различных локациях для обеспечения стабильного и быстрого соединения.\n\n" + + "🔐 Безопасность данных\n" + "Для защиты ваших данных мы применяем новейшие протоколы шифрования, которые гарантируют вашу конфиденциальность.\n\n" + + "🔑 Ваш ключ — ваша безопасность!\n" + "Не передавайте своё шифрование сторонним лицам, чтобы избежать рисков.\n" ) button_back = InlineKeyboardButton(text='⬅️ Назад', callback_data='back_to_menu')