diff --git a/handlers/__pycache__/keys.cpython-310.pyc b/handlers/__pycache__/keys.cpython-310.pyc index 2099e2e5..f452fd24 100644 Binary files a/handlers/__pycache__/keys.cpython-310.pyc and b/handlers/__pycache__/keys.cpython-310.pyc differ diff --git a/handlers/keys.py b/handlers/keys.py index 0e1e46e8..a3281f4c 100644 --- a/handlers/keys.py +++ b/handlers/keys.py @@ -6,6 +6,7 @@ from database import get_balance, update_balance, get_trial from client import extend_client_key from config import ADMIN_USERNAME, DATABASE_URL, ADMIN_PASSWORD from auth import login_with_credentials +from client import extend_client_key, delete_client router = Router() @@ -54,12 +55,10 @@ 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 - key_name, client_id = callback_query.data.split('_')[2], callback_query.data.split('_')[3] # Получаем имя ключа и client_id + key_name, client_id = callback_query.data.split('_')[2], callback_query.data.split('_')[3] try: conn = await asyncpg.connect(DATABASE_URL) @@ -82,11 +81,12 @@ async def process_callback_view_key(callback_query: types.CallbackQuery): f"Дата окончания: {expiry_date.strftime('%Y-%m-%d %H:%M:%S')}\n" f"{days_left_message}") - # Кнопки для продления и инструкций + # Кнопки для продления, инструкций и удаления renew_button = types.InlineKeyboardButton(text='Продлить ключ', callback_data=f'renew_key_{client_id}') instructions_button = types.InlineKeyboardButton(text='Инструкции по использованию', callback_data='instructions') + delete_button = types.InlineKeyboardButton(text='Удалить ключ', callback_data=f'delete_key_{client_id}') back_button = types.InlineKeyboardButton(text='Назад в профиль', callback_data='view_profile') - keyboard = types.InlineKeyboardMarkup(inline_keyboard=[[renew_button], [instructions_button], [back_button]]) + keyboard = types.InlineKeyboardMarkup(inline_keyboard=[[renew_button], [instructions_button], [delete_button], [back_button]]) await bot.edit_message_text(response_message, chat_id=tg_id, message_id=callback_query.message.message_id, reply_markup=keyboard, parse_mode="HTML") else: @@ -101,7 +101,58 @@ async def process_callback_view_key(callback_query: types.CallbackQuery): await callback_query.answer() -# Обработка запроса на продление ключа +# Обработка запроса на удаление ключа +@router.callback_query(lambda c: c.data.startswith('delete_key_')) +async def process_callback_delete_key(callback_query: types.CallbackQuery): + tg_id = callback_query.from_user.id + client_id = callback_query.data.split('_')[2] # Получаем client_id + + confirmation_keyboard = types.InlineKeyboardMarkup(inline_keyboard=[ + [types.InlineKeyboardButton(text='Да, удалить', callback_data=f'confirm_delete_{client_id}')], + [types.InlineKeyboardButton(text='Нет, отменить', callback_data='view_keys')] + ]) + + await bot.send_message(tg_id, "Вы уверены, что хотите удалить ключ?", reply_markup=confirmation_keyboard) + await callback_query.answer() + +@router.callback_query(lambda c: c.data.startswith('confirm_delete_')) +async def process_callback_confirm_delete(callback_query: types.CallbackQuery): + tg_id = callback_query.from_user.id + client_id = callback_query.data.split('_')[2] # Получаем client_id + + try: + conn = await asyncpg.connect(DATABASE_URL) + try: + # Получаем email для удаления через API + record = await conn.fetchrow('SELECT email FROM keys WHERE client_id = $1', client_id) + + if record: + email = record['email'] + + # Создаем сессию для API-запросов + session = login_with_credentials(ADMIN_USERNAME, ADMIN_PASSWORD) + + # Удаляем клиента через API + success = delete_client(session, client_id) + + if success: + # Удаляем ключ из базы данных + await conn.execute('DELETE FROM keys WHERE client_id = $1', client_id) + await bot.send_message(tg_id, "Ключ был успешно удален.") + else: + await bot.send_message(tg_id, "Ошибка при удалении клиента через API.") + + else: + await bot.send_message(tg_id, "Ключ не найден или уже удален.") + + finally: + await conn.close() + + except Exception as e: + await bot.send_message(tg_id, f"Ошибка при удалении ключа: {e}") + + await callback_query.answer() + @router.callback_query(lambda c: c.data.startswith('renew_key_')) async def process_callback_renew_key(callback_query: types.CallbackQuery): tg_id = callback_query.from_user.id diff --git a/key_management.py b/key_management.py index 6a595d6c..f6a3d9df 100644 --- a/key_management.py +++ b/key_management.py @@ -28,12 +28,20 @@ class Form(StatesGroup): waiting_for_key_name = State() viewing_profile = State() -# Обработка нажатия кнопки создания ключа @dp.callback_query(F.data == 'create_key') async def process_callback_create_key(callback_query: CallbackQuery, state: FSMContext): tg_id = callback_query.from_user.id - - if await has_active_key(tg_id): + + # Получаем данные о trial из базы данных + conn = await asyncpg.connect(DATABASE_URL) + try: + existing_connection = await conn.fetchrow('SELECT trial FROM connections WHERE tg_id = $1', tg_id) + finally: + await conn.close() + + trial_status = existing_connection['trial'] if existing_connection else 0 + + if trial_status == 1: await callback_query.message.edit_text( "У вас уже есть активный ключ. Вы можете создать новый ключ за дополнительную плату в размере 100 рублей. " "Хотите продолжить?", @@ -49,16 +57,28 @@ async def process_callback_create_key(callback_query: CallbackQuery, state: FSMC await callback_query.answer() -@dp.callback_query(F.data == 'cancel_create_key') -async def cancel_create_key(callback_query: CallbackQuery, state: FSMContext): - await process_callback_view_profile(callback_query, state) - await callback_query.answer() - @dp.callback_query(F.data == 'confirm_create_new_key') async def confirm_create_new_key(callback_query: CallbackQuery, state: FSMContext): + tg_id = callback_query.from_user.id + + # Проверяем баланс перед созданием нового ключа + balance = await get_balance(tg_id) + if balance < 100: + replenish_button = InlineKeyboardButton(text='Перейти в профиль', callback_data='view_profile') + keyboard = InlineKeyboardMarkup(inline_keyboard=[[replenish_button]]) + await callback_query.message.edit_text("Недостаточно средств на балансе для создания нового ключа.", reply_markup=keyboard) + await state.clear() + return + await callback_query.message.edit_text("Пожалуйста, выберите имя для вашего нового ключа:") await state.set_state(Form.waiting_for_key_name) await state.update_data(creating_new_key=True) + + await callback_query.answer() + +@dp.callback_query(F.data == 'cancel_create_key') +async def cancel_create_key(callback_query: CallbackQuery, state: FSMContext): + await process_callback_view_profile(callback_query, state) await callback_query.answer() # Обработка текстовых сообщений