Refactoring

This commit is contained in:
Zakhar Izmaylov
2024-11-12 08:10:28 +03:00
parent b37c724aa0
commit 5bbc248a4b
+55 -69
View File
@@ -7,13 +7,14 @@ from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup from aiogram.fsm.state import State, StatesGroup
from aiogram.types import CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup from aiogram.types import CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup
from loguru import logger from loguru import logger
from aiogram.utils.keyboard import InlineKeyboardBuilder
from bot import bot from bot import bot
from config import DATABASE_URL, SERVERS from config import DATABASE_URL, SERVERS
from database import get_client_id_by_email, update_key_expiry from database import get_client_id_by_email, update_key_expiry
from handlers.admin.admin_panel import back_to_admin_menu from handlers.admin.admin_panel import back_to_admin_menu
from handlers.keys.key_utils import delete_key_from_server, renew_server_key from handlers.keys.key_utils import delete_key_from_server, renew_server_key
from handlers.utils import sanitize_key_name from handlers.utils import sanitize_key_name
from filters.admin import IsAdminFilter
router = Router() router = Router()
@@ -26,13 +27,13 @@ class UserEditorState(StatesGroup):
waiting_for_expiry_time = State() waiting_for_expiry_time = State()
@router.callback_query(F.data == "search_by_tg_id") @router.callback_query(F.data == "search_by_tg_id",IsAdminFilter())
async def prompt_tg_id(callback_query: CallbackQuery, state: FSMContext): async def prompt_tg_id(callback_query: CallbackQuery, state: FSMContext):
await callback_query.message.edit_text("🔍 Введите Telegram ID клиента:") await callback_query.message.edit_text("🔍 Введите Telegram ID клиента:")
await state.set_state(UserEditorState.waiting_for_tg_id) await state.set_state(UserEditorState.waiting_for_tg_id)
@router.message(UserEditorState.waiting_for_tg_id, F.text.isdigit()) @router.message(UserEditorState.waiting_for_tg_id, F.text.isdigit(),IsAdminFilter())
async def handle_tg_id_input(message: types.Message, state: FSMContext): async def handle_tg_id_input(message: types.Message, state: FSMContext):
tg_id = int(message.text) tg_id = int(message.text)
@@ -85,7 +86,7 @@ async def handle_tg_id_input(message: types.Message, state: FSMContext):
await conn.close() await conn.close()
@router.callback_query(F.data.startswith("change_balance_")) @router.callback_query(F.data.startswith("change_balance_"),IsAdminFilter())
async def process_balance_change(callback_query: CallbackQuery, state: FSMContext): async def process_balance_change(callback_query: CallbackQuery, state: FSMContext):
tg_id = int(callback_query.data.split("_")[2]) tg_id = int(callback_query.data.split("_")[2])
await state.update_data(tg_id=tg_id) await state.update_data(tg_id=tg_id)
@@ -95,7 +96,7 @@ async def process_balance_change(callback_query: CallbackQuery, state: FSMContex
await state.set_state(UserEditorState.waiting_for_new_balance) await state.set_state(UserEditorState.waiting_for_new_balance)
@router.message(UserEditorState.waiting_for_new_balance) @router.message(UserEditorState.waiting_for_new_balance,IsAdminFilter())
async def handle_new_balance_input(message: types.Message, state: FSMContext): async def handle_new_balance_input(message: types.Message, state: FSMContext):
if not message.text.isdigit() or int(message.text) < 0: if not message.text.isdigit() or int(message.text) < 0:
await message.reply( await message.reply(
@@ -128,7 +129,7 @@ async def handle_new_balance_input(message: types.Message, state: FSMContext):
await state.clear() await state.clear()
@router.callback_query(F.data.startswith("edit_key_")) @router.callback_query(F.data.startswith("edit_key_"),IsAdminFilter())
async def process_key_edit(callback_query: CallbackQuery): async def process_key_edit(callback_query: CallbackQuery):
email = callback_query.data.split("_", 2)[2] email = callback_query.data.split("_", 2)[2]
@@ -204,22 +205,17 @@ async def process_key_edit(callback_query: CallbackQuery):
await conn.close() await conn.close()
except Exception as e: except Exception as e:
await handle_error( logger.error(f"Ошибка при получении информации о ключе: {e}")
callback_query.from_user.id,
callback_query,
f"Ошибка при получении информации о ключе: {e}",
)
await callback_query.answer() await callback_query.answer()
@router.callback_query(F.data == "search_by_key_name") @router.callback_query(F.data == "search_by_key_name",IsAdminFilter())
async def prompt_key_name(callback_query: CallbackQuery, state: FSMContext): async def prompt_key_name(callback_query: CallbackQuery, state: FSMContext):
await callback_query.message.edit_text("🔑 Введите имя ключа:") await callback_query.message.edit_text("🔑 Введите имя ключа:")
await state.set_state(UserEditorState.waiting_for_key_name) await state.set_state(UserEditorState.waiting_for_key_name)
@router.message(UserEditorState.waiting_for_key_name) @router.message(UserEditorState.waiting_for_key_name,IsAdminFilter())
async def handle_key_name_input(message: types.Message, state: FSMContext): async def handle_key_name_input(message: types.Message, state: FSMContext):
key_name = sanitize_key_name(message.text) key_name = sanitize_key_name(message.text)
@@ -241,7 +237,7 @@ async def handle_key_name_input(message: types.Message, state: FSMContext):
return return
response_messages = [] response_messages = []
key_buttons = [] key_buttons = InlineKeyboardBuilder()
for record in user_records: for record in user_records:
balance = record["balance"] balance = record["balance"]
@@ -262,24 +258,22 @@ async def handle_key_name_input(message: types.Message, state: FSMContext):
f"🌐 Сервер: <b>{server_name}</b>" f"🌐 Сервер: <b>{server_name}</b>"
) )
change_expiry_button = InlineKeyboardButton( key_buttons.row(
text="⏳ Изменить время истечения", text="⏳ Изменить время истечения",
callback_data=f"change_expiry|{email}", callback_data=f"change_expiry|{email}"
) )
delete_button = InlineKeyboardButton( key_buttons.row(
text="❌ Удалить ключ", callback_data=f"delete_key_admin|{email}" text="❌ Удалить ключ",
callback_data=f"delete_key_admin|{email}"
) )
key_buttons.append([change_expiry_button, delete_button]) key_buttons.row(
text="🔙 Назад",
key_buttons.append( callback_data="back_to_user_editor"
[InlineKeyboardButton(text="Назад", callback_data="back_to_user_editor")]
) )
keyboard = InlineKeyboardMarkup(inline_keyboard=key_buttons)
await message.reply( await message.reply(
"\n".join(response_messages), reply_markup=keyboard, parse_mode="HTML" "\n".join(response_messages), reply_markup=key_buttons.as_markup(), parse_mode="HTML"
) )
finally: finally:
@@ -288,7 +282,7 @@ async def handle_key_name_input(message: types.Message, state: FSMContext):
await state.clear() await state.clear()
@router.callback_query(F.data.startswith("change_expiry|")) @router.callback_query(F.data.startswith("change_expiry|"),IsAdminFilter())
async def prompt_expiry_change(callback_query: CallbackQuery, state: FSMContext): async def prompt_expiry_change(callback_query: CallbackQuery, state: FSMContext):
email = callback_query.data.split("|")[1] email = callback_query.data.split("|")[1]
await callback_query.message.edit_text( await callback_query.message.edit_text(
@@ -299,7 +293,7 @@ async def prompt_expiry_change(callback_query: CallbackQuery, state: FSMContext)
await state.set_state(UserEditorState.waiting_for_expiry_time) await state.set_state(UserEditorState.waiting_for_expiry_time)
@router.message(UserEditorState.waiting_for_expiry_time) @router.message(UserEditorState.waiting_for_expiry_time,IsAdminFilter())
async def handle_expiry_time_input(message: types.Message, state: FSMContext): async def handle_expiry_time_input(message: types.Message, state: FSMContext):
user_data = await state.get_data() user_data = await state.get_data()
email = user_data.get("email") email = user_data.get("email")
@@ -347,13 +341,14 @@ async def handle_expiry_time_input(message: types.Message, state: FSMContext):
response_message = f"✅ Время истечения ключа для клиента {client_id} ({email}) успешно обновлено на всех серверах." response_message = f"✅ Время истечения ключа для клиента {client_id} ({email}) успешно обновлено на всех серверах."
back_button = InlineKeyboardButton( builder = InlineKeyboardBuilder()
text="Назад", callback_data="back_to_user_editor" builder.row(
InlineKeyboardButton(
text="🔙 Назад", callback_data="back_to_user_editor"
)
) )
keyboard = InlineKeyboardMarkup(inline_keyboard=[[back_button]])
await message.reply( await message.reply(
response_message, reply_markup=keyboard, parse_mode="HTML" response_message, reply_markup=builder.as_markup(), parse_mode="HTML"
) )
finally: finally:
@@ -367,7 +362,7 @@ async def handle_expiry_time_input(message: types.Message, state: FSMContext):
await state.clear() await state.clear()
@router.callback_query(F.data.startswith("delete_key_admin|")) @router.callback_query(F.data.startswith("delete_key_admin|"),IsAdminFilter())
async def process_callback_delete_key(callback_query: types.CallbackQuery): async def process_callback_delete_key(callback_query: types.CallbackQuery):
tg_id = callback_query.from_user.id tg_id = callback_query.from_user.id
email = callback_query.data.split("|")[1] email = callback_query.data.split("|")[1]
@@ -386,27 +381,24 @@ async def process_callback_delete_key(callback_query: types.CallbackQuery):
) )
return return
confirmation_keyboard = types.InlineKeyboardMarkup( builder = InlineKeyboardBuilder()
inline_keyboard=[ builder.row(
[ types.InlineKeyboardButton(
types.InlineKeyboardButton( text="✅ Да, удалить",
text="✅ Да, удалить", callback_data=f"confirm_delete_admin|{client_id}"
callback_data=f"confirm_delete_admin|{client_id}", )
) )
], builder.row(
[ types.InlineKeyboardButton(
types.InlineKeyboardButton( text="❌ Нет, отменить",
text="❌ Нет, отменить", callback_data="view_keys" callback_data="view_keys"
) )
],
]
) )
await bot.edit_message_text( await bot.edit_message_text(
"<b>❓ Вы уверены, что хотите удалить ключ?</b>", "<b>❓ Вы уверены, что хотите удалить ключ?</b>",
chat_id=tg_id, chat_id=tg_id,
message_id=callback_query.message.message_id, message_id=callback_query.message.message_id,
reply_markup=confirmation_keyboard, reply_markup=builder.as_markup(),
parse_mode="HTML", parse_mode="HTML",
) )
finally: finally:
@@ -415,7 +407,7 @@ async def process_callback_delete_key(callback_query: types.CallbackQuery):
await callback_query.answer() await callback_query.answer()
@router.callback_query(F.data.startswith("confirm_delete_admin|")) @router.callback_query(F.data.startswith("confirm_delete_admin|"),IsAdminFilter())
async def process_callback_confirm_delete(callback_query: types.CallbackQuery): async def process_callback_confirm_delete(callback_query: types.CallbackQuery):
tg_id = callback_query.from_user.id tg_id = callback_query.from_user.id
client_id = callback_query.data.split("|")[1] client_id = callback_query.data.split("|")[1]
@@ -430,10 +422,12 @@ async def process_callback_confirm_delete(callback_query: types.CallbackQuery):
if record: if record:
email = record["email"] email = record["email"]
response_message = "✅ Ключ успешно удален." response_message = "✅ Ключ успешно удален."
back_button = types.InlineKeyboardButton( builder = InlineKeyboardBuilder()
text="Назад", callback_data="view_keys" builder.row(
InlineKeyboardButton(
text="⬅️ Назад", callback_data="view_keys"
)
) )
keyboard = types.InlineKeyboardMarkup(inline_keyboard=[[back_button]])
async def delete_key_from_servers(): async def delete_key_from_servers():
tasks = [] tasks = []
@@ -450,20 +444,21 @@ async def process_callback_confirm_delete(callback_query: types.CallbackQuery):
response_message, response_message,
chat_id=tg_id, chat_id=tg_id,
message_id=callback_query.message.message_id, message_id=callback_query.message.message_id,
reply_markup=keyboard, reply_markup=builder.as_markup(),
) )
else: else:
response_message = "🚫 Ключ не найден или уже удален." response_message = "🚫 Ключ не найден или уже удален."
back_button = types.InlineKeyboardButton( builder = InlineKeyboardBuilder()
text="Назад", callback_data="view_keys" builder.row(
InlineKeyboardButton(
text="⬅️ Назад", callback_data="view_keys"
)
) )
keyboard = types.InlineKeyboardMarkup(inline_keyboard=[[back_button]])
await bot.edit_message_text( await bot.edit_message_text(
response_message, response_message,
chat_id=tg_id, chat_id=tg_id,
message_id=callback_query.message.message_id, message_id=callback_query.message.message_id,
reply_markup=keyboard, reply_markup=builder.as_markup(),
) )
finally: finally:
@@ -493,12 +488,3 @@ async def delete_key_from_db(client_id):
@router.callback_query(F.data == "back_to_user_editor") @router.callback_query(F.data == "back_to_user_editor")
async def back_to_user_editor(callback_query: CallbackQuery): async def back_to_user_editor(callback_query: CallbackQuery):
await back_to_admin_menu(callback_query) await back_to_admin_menu(callback_query)
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,
parse_mode="HTML",
)