diff --git a/database.py b/database.py index 8dba5f4a..0b21d734 100644 --- a/database.py +++ b/database.py @@ -1295,3 +1295,38 @@ async def delete_key(identifier, session): logger.info(f"Ключ с идентификатором {identifier} успешно удалён") except Exception as e: logger.error(f"Ошибка при удалении ключа с идентификатором {identifier} из базы данных: {e}") + + +async def add_server_to_db( + cluster_name: str, server_name: str, api_url: str, subscription_url: str, inbound_id: int, session: Any +): + """ + Добавляет новый сервер в базу данных. + + Args: + cluster_name (str): Название кластера + server_name (str): Название сервера + api_url (str): URL API сервера + subscription_url (str): URL подписки + inbound_id (int): ID входящего подключения + session (Any): Сессия базы данных + + Raises: + Exception: В случае ошибки при добавлении сервера + """ + try: + await session.execute( + """ + INSERT INTO servers (cluster_name, server_name, api_url, subscription_url, inbound_id) + VALUES ($1, $2, $3, $4, $5) + """, + cluster_name, + server_name, + api_url, + subscription_url, + inbound_id, + ) + logger.info(f"Сервер {server_name} успешно добавлен в кластер {cluster_name}") + except Exception as e: + logger.error(f"Ошибка при добавлении сервера {server_name} в кластер {cluster_name}: {e}") + raise diff --git a/handlers/admin/admin_servers.py b/handlers/admin/admin_servers.py index 1a039c77..2e8aefc4 100644 --- a/handlers/admin/admin_servers.py +++ b/handlers/admin/admin_servers.py @@ -1,4 +1,5 @@ import asyncio +from typing import Any import asyncpg from aiogram import F, Router, types @@ -10,7 +11,7 @@ from py3xui import AsyncApi from backup import create_backup_and_send_to_admins from config import ADMIN_PASSWORD, ADMIN_USERNAME, DATABASE_URL -from database import check_unique_server_name, get_servers_from_db +from database import add_server_to_db, check_unique_server_name, get_servers_from_db from filters.admin import IsAdminFilter from handlers.keys.key_utils import create_key_on_cluster from logger import logger @@ -211,7 +212,7 @@ async def handle_subscription_url_input(message: types.Message, state: FSMContex @router.message(UserEditorState.waiting_for_inbound_id, IsAdminFilter()) -async def handle_inbound_id_input(message: types.Message, state: FSMContext): +async def handle_inbound_id_input(message: types.Message, state: FSMContext, session: Any): inbound_id = message.text.strip() if not inbound_id.isdigit(): @@ -224,19 +225,14 @@ async def handle_inbound_id_input(message: types.Message, state: FSMContext): api_url = user_data.get("api_url") subscription_url = user_data.get("subscription_url") - conn = await asyncpg.connect(DATABASE_URL) - await conn.execute( - """ - INSERT INTO servers (cluster_name, server_name, api_url, subscription_url, inbound_id) - VALUES ($1, $2, $3, $4, $5) - """, - cluster_name, - server_name, - api_url, - subscription_url, - inbound_id, + await add_server_to_db( + cluster_name=cluster_name, + server_name=server_name, + api_url=api_url, + subscription_url=subscription_url, + inbound_id=inbound_id, + session=session, ) - await conn.close() builder = InlineKeyboardBuilder() builder.row(InlineKeyboardButton(text="🔙 Назад к кластерам", callback_data="servers_editor")) diff --git a/servers.py b/servers.py index 4a2b0b81..af439a0b 100644 --- a/servers.py +++ b/servers.py @@ -9,7 +9,7 @@ from ping3 import ping from bot import bot from config import ADMIN_ID, DATABASE_URL, PING_TIME -from database import get_servers_from_db +from database import add_server_to_db, get_servers_from_db from logger import logger try: @@ -44,16 +44,13 @@ async def sync_servers_with_db(): ) if not exists: - await conn.execute( - """ - INSERT INTO servers (cluster_name, server_name, api_url, subscription_url, inbound_id) - VALUES ($1, $2, $3, $4, $5) - """, - cluster_name, - server_info["name"], - server_info["API_URL"], - server_info["SUBSCRIPTION"], - server_info["INBOUND_ID"], + await add_server_to_db( + cluster_name=cluster_name, + server_name=server_info["name"], + api_url=server_info["API_URL"], + subscription_url=server_info["SUBSCRIPTION"], + inbound_id=server_info["INBOUND_ID"], + session=conn, ) logger.info(f"Сервер {server_info['name']} из кластера {cluster_name} добавлен в базу данных.") else: