From 6e0090e90cbf63a28aea863b948643fa723bb219 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 16 Sep 2024 07:03:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=BF=D1=80=D0=BE=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 110 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 72 insertions(+), 38 deletions(-) diff --git a/bot.py b/bot.py index 579a3d32..c82c3d6d 100644 --- a/bot.py +++ b/bot.py @@ -15,6 +15,7 @@ import aiosqlite class Form(StatesGroup): waiting_for_key_name = State() + waiting_for_admin_confirmation = State() waiting_for_statistics = State() waiting_for_expiry_date = State() @@ -26,6 +27,9 @@ router = Router() # Создаем сессию при старте бота session = login_with_credentials(ADMIN_USERNAME, ADMIN_PASSWORD) +# ID администратора +ADMIN_ID = 476217106 # Замените на ваш Telegram ID + @dp.message(Command("start")) async def start_command(message: Message): welcome_text = "Добро пожаловать! Вы можете создать ключ для подключения VPN, просмотреть статистику использования или узнать дату окончания ключа." @@ -43,6 +47,74 @@ async def process_callback_create_key(callback_query: types.CallbackQuery, state await state.set_state(Form.waiting_for_key_name) await callback_query.answer() +@dp.message() +async def handle_text(message: types.Message, state: FSMContext): + current_state = await state.get_state() + + if current_state == Form.waiting_for_key_name.state: + tg_id = message.from_user.id + + if await has_active_key(tg_id): + await message.reply("У вас уже есть активный ключ. Вы не можете создать новый.") + await state.clear() + return + + # Сохраняем введенное имя профиля + profile_name = message.text + await state.update_data(profile_name=profile_name) + + # Отправляем запрос на подтверждение админу + admin_text = f"Пользователь {tg_id} запросил создание ключа для профиля '{profile_name}'. Подтвердите создание ключа (Да/Нет)." + await bot.send_message(ADMIN_ID, admin_text, reply_markup=InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text="Да", callback_data=f'confirm_create_{tg_id}_{profile_name}')], + [InlineKeyboardButton(text="Нет", callback_data=f'reject_create_{tg_id}')] + ])) + + await message.reply("Запрос на создание ключа отправлен администратору для подтверждения.") + await state.set_state(Form.waiting_for_admin_confirmation) + + elif current_state == Form.waiting_for_admin_confirmation.state: + await message.reply("Ожидание подтверждения от администратора.") + +@dp.callback_query(F.data.startswith('confirm_create_')) +async def process_admin_confirmation(callback_query: types.CallbackQuery, state: FSMContext): + _, tg_id, profile_name = callback_query.data.split('_', 2) + tg_id = int(tg_id) + + try: + client_id = str(uuid.uuid4()) + limit_ip = 1 + total_gb = 0 + current_time = datetime.utcnow() + expiry_time = int((current_time + timedelta(days=30)).timestamp() * 1000) + enable = True + flow = "xtls-rprx-vision" + + add_client(session, client_id, profile_name, tg_id, limit_ip, total_gb, expiry_time, enable, flow) + + connection_link = link(session, profile_name) + + await add_connection(tg_id, client_id, profile_name, expiry_time) + + user_message = f"Ключ создан:\n
{connection_link}
" + await bot.send_message(tg_id, user_message, parse_mode="HTML") + + await callback_query.message.reply("Ключ успешно создан и отправлен пользователю.") + except Exception as e: + await callback_query.message.reply(f"Ошибка при создании ключа: {e}") + + await state.clear() + +@dp.callback_query(F.data.startswith('reject_create_')) +async def process_admin_rejection(callback_query: types.CallbackQuery, state: FSMContext): + _, tg_id = callback_query.data.split('_', 1) + tg_id = int(tg_id) + + await bot.send_message(tg_id, "Создание ключа было отклонено администратором.") + await callback_query.message.reply("Запрос на создание ключа был отклонен.") + + await state.clear() + @dp.callback_query(F.data == 'view_stats') async def process_callback_view_stats(callback_query: types.CallbackQuery, state: FSMContext): tg_id = callback_query.from_user.id @@ -95,44 +167,6 @@ async def process_callback_view_expiry(callback_query: types.CallbackQuery): await callback_query.message.reply(message_text) await callback_query.answer() -@dp.message() -async def handle_text(message: types.Message, state: FSMContext): - current_state = await state.get_state() - - if current_state == Form.waiting_for_key_name.state: - tg_id = message.from_user.id - - # Проверка, есть ли уже активный ключ у клиента - if await has_active_key(tg_id): - await message.reply("У вас уже есть активный ключ. Вы не можете создать новый.") - await state.clear() - return - - try: - client_id = str(uuid.uuid4()) - email = message.text - limit_ip = 1 - total_gb = 0 - current_time = datetime.utcnow() - expiry_time = int((current_time + timedelta(days=30)).timestamp() * 1000) - enable = True - flow = "xtls-rprx-vision" - - # Создание клиента - add_client(session, client_id, email, tg_id, limit_ip, total_gb, expiry_time, enable, flow) - - # Получение ссылки на подключение - connection_link = link(session, email) - - # Сохранение данных о ключе в базе данных - await add_connection(tg_id, client_id, email, expiry_time) - - # Отправка ключа пользователю - await message.reply(f"Ключ создан:\n
{connection_link}
", parse_mode="HTML") - - await state.clear() - except Exception as e: - await message.reply(f"Ошибка: {e}") async def main():