From 92fbe6ced52f15ffb69194bd8d67b5d4c842bfb2 Mon Sep 17 00:00:00 2001 From: Vladless Date: Fri, 8 Nov 2024 06:02:07 +0300 Subject: [PATCH] =?UTF-8?q?v3.=20=D0=90=D0=B4=D0=BC=D0=B8=D0=BD=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2=D1=83=D1=8E=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=81=D0=B8=D1=8E.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handlers/admin/admin_panel.py | 27 +++++++--- handlers/admin/user_editor.py | 97 ++++++++++++++++++++++++----------- 2 files changed, 86 insertions(+), 38 deletions(-) diff --git a/handlers/admin/admin_panel.py b/handlers/admin/admin_panel.py index f0af4b91..f33a01ec 100644 --- a/handlers/admin/admin_panel.py +++ b/handlers/admin/admin_panel.py @@ -23,7 +23,7 @@ class UserEditorState(StatesGroup): @router.message(Command('admin')) async def handle_admin_command(message: types.Message): if message.from_user.id != ADMIN_ID: - await message.reply("У вас нет доступа к этой команде.") + await bot.send_message(message.chat.id, "У вас нет доступа к этой команде.") return keyboard = InlineKeyboardMarkup(inline_keyboard=[ @@ -33,7 +33,8 @@ async def handle_admin_command(message: types.Message): [InlineKeyboardButton(text="Создать бэкап", callback_data="backups")], [InlineKeyboardButton(text="Перезапустить бота", callback_data="restart_bot")] ]) - await message.reply("Панель администратора", reply_markup=keyboard) + await bot.send_message(message.chat.id, "Панель администратора", reply_markup=keyboard) + @router.callback_query(lambda c: c.data == "user_stats") async def user_stats_menu(callback_query: CallbackQuery): @@ -99,11 +100,23 @@ async def user_editor_menu(callback_query: CallbackQuery): @router.callback_query(lambda c: c.data == "back_to_admin_menu") async def back_to_admin_menu(callback_query: CallbackQuery): - keyboard = InlineKeyboardMarkup(inline_keyboard=[ - [InlineKeyboardButton(text="Статистика пользователей", callback_data="user_stats")], - [InlineKeyboardButton(text="Редактор пользователей", callback_data="user_editor")] - ]) - await callback_query.message.edit_text("Панель администратора", reply_markup=keyboard) + try: + await callback_query.message.delete() + except Exception: + pass + + tg_id = callback_query.from_user.id + if tg_id == ADMIN_ID: + keyboard = InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text="Статистика пользователей", callback_data="user_stats")], + [InlineKeyboardButton(text="Редактор пользователей", callback_data="user_editor")], + [InlineKeyboardButton(text="Отправить сообщение всем клиентам", callback_data="send_to_alls")], + [InlineKeyboardButton(text="Создать бэкап", callback_data="backups")], + [InlineKeyboardButton(text="Перезапустить бота", callback_data="restart_bot")] + ]) + await bot.send_message(tg_id, "Панель администратора", reply_markup=keyboard) + else: + await bot.send_message(tg_id, "У вас нет доступа к этой команде.") async def handle_error(tg_id, callback_query, message): await bot.edit_message_text(message, chat_id=tg_id, message_id=callback_query.message.message_id) diff --git a/handlers/admin/user_editor.py b/handlers/admin/user_editor.py index b308d4e0..a9679c8f 100644 --- a/handlers/admin/user_editor.py +++ b/handlers/admin/user_editor.py @@ -14,6 +14,12 @@ from config import ADMIN_PASSWORD, ADMIN_USERNAME, DATABASE_URL, SERVERS from database import (get_client_id_by_email, get_tg_id_by_client_id, update_key_expiry) from handlers.admin.admin_panel import back_to_admin_menu +import asyncio +import logging + + +logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) router = Router() @@ -254,8 +260,6 @@ async def handle_expiry_time_input(message: types.Message, state: FSMContext): await state.clear() return - await update_key_expiry(client_id, expiry_time) - conn = await asyncpg.connect(DATABASE_URL) try: record = await conn.fetchrow('SELECT server_id FROM keys WHERE client_id = $1', client_id) @@ -263,39 +267,46 @@ async def handle_expiry_time_input(message: types.Message, state: FSMContext): await message.reply("Клиент не найден в базе данных.") await state.clear() return - - server_id = record['server_id'] + tg_id = await get_tg_id_by_client_id(client_id) - session = await login_with_credentials(server_id, ADMIN_USERNAME, ADMIN_PASSWORD) + async def update_key_on_all_servers(): + tasks = [] + for server_id in SERVERS: + tasks.append(asyncio.create_task( + renew_server_key(server_id, tg_id, client_id, email, expiry_time) + )) + await asyncio.gather(*tasks) - print(f"Попытка обновить панель для server_id: {server_id}, tg_id: {tg_id}, client_id: {client_id}, email: {email}, expiryTime: {expiry_time}") + await update_key_on_all_servers() - success = await extend_client_key_admin(session, server_id, tg_id, client_id, email, expiry_time) + await update_key_expiry(client_id, expiry_time) - print(f"Статус обновления панели: {'Успешно' if success else 'Не удалось'}") - if success: - response_message = ( - f"Время истечения ключа для клиента {client_id} ({email}) успешно обновлено и синхронизировано с панелью." - ) - else: - response_message = ( - f"Время истечения ключа для клиента {client_id} ({email}) обновлено, но не удалось синхронизировать с панелью." - ) + response_message = ( + f"Время истечения ключа для клиента {client_id} ({email}) успешно обновлено на всех серверах." + ) back_button = InlineKeyboardButton(text="Назад", callback_data="back_to_user_editor") keyboard = InlineKeyboardMarkup(inline_keyboard=[[back_button]]) await message.reply(response_message, reply_markup=keyboard, parse_mode="HTML") - + finally: await conn.close() + except ValueError: await message.reply("Пожалуйста, используйте формат: YYYY-MM-DD HH:MM:SS.") except Exception as e: await message.reply(f"Произошла ошибка: {e}") - await state.clear() + await state.clear() + +async def renew_server_key(server_id, tg_id, client_id, email, new_expiry_time): + try: + session = await login_with_credentials(server_id, ADMIN_USERNAME, ADMIN_PASSWORD) + await extend_client_key_admin(session, server_id, tg_id, client_id, email, new_expiry_time) + except Exception as e: + logger.error(f"Не удалось обновить ключ {client_id} на сервере {server_id}: {e}") @router.callback_query(lambda c: c.data.startswith('delete_key_admin|')) async def process_callback_delete_key(callback_query: types.CallbackQuery): @@ -329,27 +340,30 @@ async def process_callback_confirm_delete(callback_query: types.CallbackQuery): try: conn = await asyncpg.connect(DATABASE_URL) try: - record = await conn.fetchrow('SELECT email, server_id FROM keys WHERE client_id = $1', client_id) + record = await conn.fetchrow('SELECT email FROM keys WHERE client_id = $1', client_id) if record: email = record['email'] - server_id = record['server_id'] - session = await login_with_credentials(server_id, ADMIN_USERNAME, ADMIN_PASSWORD) - success = await delete_client(session, server_id, client_id) + response_message = "Ключ успешно удален." + back_button = types.InlineKeyboardButton(text='Назад', callback_data='view_keys') + keyboard = types.InlineKeyboardMarkup(inline_keyboard=[[back_button]]) - if success: - await conn.execute('DELETE FROM keys WHERE client_id = $1', client_id) - response_message = "Ключ был успешно удален." - else: - response_message = "Ошибка при удалении клиента через API." + async def delete_key_from_servers(): + tasks = [] + for server_id in SERVERS: + tasks.append(delete_key_from_server(server_id, client_id)) + await asyncio.gather(*tasks) + await delete_key_from_servers() + await delete_key_from_db(client_id) + + await bot.edit_message_text(response_message, chat_id=tg_id, message_id=callback_query.message.message_id, reply_markup=keyboard) else: response_message = "Ключ не найден или уже удален." + back_button = types.InlineKeyboardButton(text='Назад', callback_data='view_keys') + keyboard = types.InlineKeyboardMarkup(inline_keyboard=[[back_button]]) - back_button = types.InlineKeyboardButton(text='Назад', callback_data='view_keys') - keyboard = types.InlineKeyboardMarkup(inline_keyboard=[[back_button]]) - - await bot.edit_message_text(response_message, chat_id=tg_id, message_id=callback_query.message.message_id, reply_markup=keyboard) + await bot.edit_message_text(response_message, chat_id=tg_id, message_id=callback_query.message.message_id, reply_markup=keyboard) finally: await conn.close() @@ -359,6 +373,27 @@ async def process_callback_confirm_delete(callback_query: types.CallbackQuery): await callback_query.answer() +async def delete_key_from_server(server_id, client_id): + """Удаление ключа с сервера""" + try: + session = await login_with_credentials(server_id, ADMIN_USERNAME, ADMIN_PASSWORD) + success = await delete_client(session, server_id, client_id) + + if not success: + logger.error(f"Ошибка удаления ключа {client_id} на сервере {server_id}") + except Exception as e: + logger.error(f"Ошибка при удалении ключа {client_id} с сервера {server_id}: {e}") + +async def delete_key_from_db(client_id): + """Удаление ключа из базы данных""" + try: + conn = await asyncpg.connect(DATABASE_URL) + await conn.execute('DELETE FROM keys WHERE client_id = $1', client_id) + except Exception as e: + logger.error(f"Ошибка при удалении ключа {client_id} из базы данных: {e}") + finally: + await conn.close() + @router.callback_query(lambda c: c.data == "back_to_user_editor") async def back_to_user_editor(callback_query: CallbackQuery): await back_to_admin_menu(callback_query)