Refactoring user editor

This commit is contained in:
Zakhar Izmaylov
2024-11-12 08:10:40 +03:00
parent 3aeada3f33
commit 4df89ea7a9
+74 -75
View File
@@ -5,16 +5,17 @@ import asyncpg
from aiogram import F, Router, types from aiogram import F, Router, types
from aiogram.fsm.context import FSMContext 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
from loguru import logger
from aiogram.utils.keyboard import InlineKeyboardBuilder from aiogram.utils.keyboard import InlineKeyboardBuilder
from filters.admin import IsAdminFilter
from loguru import logger
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()
@@ -27,13 +28,13 @@ class UserEditorState(StatesGroup):
waiting_for_expiry_time = State() waiting_for_expiry_time = State()
@router.callback_query(F.data == "search_by_tg_id",IsAdminFilter()) @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(),IsAdminFilter()) @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)
@@ -52,25 +53,26 @@ async def handle_tg_id_input(message: types.Message, state: FSMContext):
await state.clear() await state.clear()
return return
key_buttons = [ builder = InlineKeyboardBuilder()
[InlineKeyboardButton(text=email, callback_data=f"edit_key_{email}")]
for email, in key_records # Добавляем кнопки ключей
] for (email,) in key_records:
keyboard = InlineKeyboardMarkup( builder.row(
inline_keyboard=[ InlineKeyboardButton(
*key_buttons, text=f"🔑 {email}", callback_data=f"edit_key_{email}"
[ )
InlineKeyboardButton( )
text="📝 Изменить баланс",
callback_data=f"change_balance_{tg_id}", # Кнопка изменения баланса
) builder.row(
], InlineKeyboardButton(
[ text="📝 Изменить баланс", callback_data=f"change_balance_{tg_id}"
InlineKeyboardButton( )
text="Назад", callback_data="back_to_user_editor" )
)
], # Кнопка возврата
] builder.row(
InlineKeyboardButton(text="🔙 Назад", callback_data="back_to_user_editor")
) )
user_info = ( user_info = (
@@ -79,14 +81,16 @@ async def handle_tg_id_input(message: types.Message, state: FSMContext):
f"👥 Количество рефералов: <b>{referral_count}</b>\n" f"👥 Количество рефералов: <b>{referral_count}</b>\n"
f"🔑 Ключи (для редактирования нажмите на ключ):" f"🔑 Ключи (для редактирования нажмите на ключ):"
) )
await message.reply(user_info, reply_markup=keyboard, parse_mode="HTML") await message.reply(
user_info, reply_markup=builder.as_markup(), parse_mode="HTML"
)
await state.set_state(UserEditorState.displaying_user_info) await state.set_state(UserEditorState.displaying_user_info)
finally: finally:
await conn.close() await conn.close()
@router.callback_query(F.data.startswith("change_balance_"),IsAdminFilter()) @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)
@@ -96,7 +100,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,IsAdminFilter()) @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(
@@ -116,12 +120,16 @@ async def handle_new_balance_input(message: types.Message, state: FSMContext):
response_message = f"✅ Баланс успешно изменен на <b>{new_balance}</b>." response_message = f"✅ Баланс успешно изменен на <b>{new_balance}</b>."
back_button = InlineKeyboardButton( builder = InlineKeyboardBuilder()
text="Назад в меню админа", callback_data="back_to_user_editor" builder.row(
InlineKeyboardButton(
text="🔙 Назад в меню администратора",
callback_data="back_to_user_editor",
)
)
await message.reply(
response_message, reply_markup=builder.as_markup(), parse_mode="HTML"
) )
keyboard = InlineKeyboardMarkup(inline_keyboard=[[back_button]])
await message.reply(response_message, reply_markup=keyboard, parse_mode="HTML")
finally: finally:
await conn.close() await conn.close()
@@ -129,7 +137,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_"),IsAdminFilter()) @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]
@@ -174,27 +182,26 @@ async def process_key_edit(callback_query: CallbackQuery):
f"Сервер: <b>{server_name}</b>" f"Сервер: <b>{server_name}</b>"
) )
change_expiry_button = types.InlineKeyboardButton( builder = InlineKeyboardBuilder()
text="⏳ Изменить время истечения", builder.row(
callback_data=f"change_expiry|{email}", InlineKeyboardButton(
text="⏳ Изменить время истечения",
callback_data=f"change_expiry|{email}",
),
InlineKeyboardButton(
text="❌ Удалить ключ",
callback_data=f"delete_key_admin|{email}",
),
) )
delete_button = types.InlineKeyboardButton( builder.row(
text="❌ Удалить ключ", callback_data=f"delete_key_admin|{email}" InlineKeyboardButton(
text="🔙 Назад", callback_data="back_to_user_editor"
)
) )
keyboard = types.InlineKeyboardMarkup(
inline_keyboard=[
[change_expiry_button, delete_button],
[
InlineKeyboardButton(
text="Назад", callback_data="back_to_user_editor"
)
],
]
)
await callback_query.message.edit_text( await callback_query.message.edit_text(
response_message, reply_markup=keyboard, parse_mode="HTML" response_message,
reply_markup=builder.as_markup(),
parse_mode="HTML",
) )
else: else:
await callback_query.message.edit_text( await callback_query.message.edit_text(
@@ -209,13 +216,13 @@ async def process_key_edit(callback_query: CallbackQuery):
await callback_query.answer() await callback_query.answer()
@router.callback_query(F.data == "search_by_key_name",IsAdminFilter()) @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,IsAdminFilter()) @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)
@@ -260,20 +267,18 @@ async def handle_key_name_input(message: types.Message, state: FSMContext):
key_buttons.row( key_buttons.row(
text="⏳ Изменить время истечения", text="⏳ Изменить время истечения",
callback_data=f"change_expiry|{email}" callback_data=f"change_expiry|{email}",
) )
key_buttons.row( key_buttons.row(
text="❌ Удалить ключ", text="❌ Удалить ключ", callback_data=f"delete_key_admin|{email}"
callback_data=f"delete_key_admin|{email}"
) )
key_buttons.row( key_buttons.row(text="🔙 Назад", callback_data="back_to_user_editor")
text="🔙 Назад",
callback_data="back_to_user_editor"
)
await message.reply( await message.reply(
"\n".join(response_messages), reply_markup=key_buttons.as_markup(), parse_mode="HTML" "\n".join(response_messages),
reply_markup=key_buttons.as_markup(),
parse_mode="HTML",
) )
finally: finally:
@@ -282,7 +287,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|"),IsAdminFilter()) @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(
@@ -293,7 +298,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,IsAdminFilter()) @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")
@@ -362,7 +367,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|"),IsAdminFilter()) @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]
@@ -384,14 +389,12 @@ async def process_callback_delete_key(callback_query: types.CallbackQuery):
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.row( 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( 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(
@@ -407,7 +410,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|"),IsAdminFilter()) @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]
@@ -424,9 +427,7 @@ async def process_callback_confirm_delete(callback_query: types.CallbackQuery):
response_message = "✅ Ключ успешно удален." response_message = "✅ Ключ успешно удален."
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.row( builder.row(
InlineKeyboardButton( InlineKeyboardButton(text="⬅️ Назад", callback_data="view_keys")
text="⬅️ Назад", callback_data="view_keys"
)
) )
async def delete_key_from_servers(): async def delete_key_from_servers():
@@ -450,9 +451,7 @@ async def process_callback_confirm_delete(callback_query: types.CallbackQuery):
response_message = "🚫 Ключ не найден или уже удален." response_message = "🚫 Ключ не найден или уже удален."
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.row( builder.row(
InlineKeyboardButton( InlineKeyboardButton(text="⬅️ Назад", callback_data="view_keys")
text="⬅️ Назад", callback_data="view_keys"
)
) )
await bot.edit_message_text( await bot.edit_message_text(
response_message, response_message,