v3. Админка переведена на новую версию.

This commit is contained in:
Vladless
2024-11-08 06:02:07 +03:00
parent 8f16fa4c1a
commit 92fbe6ced5
2 changed files with 86 additions and 38 deletions
+20 -7
View File
@@ -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)
+66 -31
View File
@@ -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)