112 lines
3.5 KiB
Python
112 lines
3.5 KiB
Python
import asyncpg
|
|
from loguru import logger
|
|
from py3xui import AsyncApi
|
|
|
|
from client import add_client, delete_client, extend_client_key
|
|
from config import ADMIN_PASSWORD, ADMIN_USERNAME, DATABASE_URL, SERVERS
|
|
|
|
|
|
async def create_key_on_server(server_id, tg_id, client_id, email, expiry_timestamp):
|
|
try:
|
|
xui = AsyncApi(
|
|
SERVERS[server_id]["API_URL"],
|
|
username=ADMIN_USERNAME,
|
|
password=ADMIN_PASSWORD,
|
|
)
|
|
|
|
conn = await asyncpg.connect(DATABASE_URL)
|
|
existing_key = await conn.fetchrow("SELECT 1 FROM keys WHERE email = $1", email)
|
|
|
|
if existing_key:
|
|
raise ValueError(f"Email {email} уже существует в базе данных.")
|
|
|
|
await add_client(
|
|
xui,
|
|
client_id,
|
|
email,
|
|
tg_id,
|
|
limit_ip=1,
|
|
total_gb=0,
|
|
expiry_time=expiry_timestamp,
|
|
enable=True,
|
|
flow="xtls-rprx-vision",
|
|
)
|
|
|
|
await conn.close()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Ошибка на сервере {server_id}: {e}")
|
|
raise e
|
|
|
|
|
|
async def renew_server_key(server_id, email, client_id, new_expiry_time):
|
|
"""
|
|
Функция для продления срока действия ключа на сервере и сброса трафика, если необходимо.
|
|
"""
|
|
try:
|
|
xui = AsyncApi(
|
|
SERVERS[server_id]["API_URL"],
|
|
username=ADMIN_USERNAME,
|
|
password=ADMIN_PASSWORD,
|
|
)
|
|
|
|
await extend_client_key(xui, email, new_expiry_time, client_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()
|
|
|
|
|
|
async def delete_key_from_server(server_id, email, client_id):
|
|
"""Удаление ключа с сервера"""
|
|
try:
|
|
xui = AsyncApi(
|
|
SERVERS[server_id]["API_URL"],
|
|
username=ADMIN_USERNAME,
|
|
password=ADMIN_PASSWORD,
|
|
)
|
|
|
|
await delete_client(xui, email, client_id)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Не удалось удалить ключ {client_id} на сервере {server_id}: {e}")
|
|
|
|
|
|
async def update_key_on_server(tg_id, client_id, email, expiry_time, server_id):
|
|
try:
|
|
xui = AsyncApi(
|
|
SERVERS[server_id]["API_URL"],
|
|
username=ADMIN_USERNAME,
|
|
password=ADMIN_PASSWORD,
|
|
)
|
|
await add_client(
|
|
xui,
|
|
client_id,
|
|
email,
|
|
tg_id,
|
|
limit_ip=1,
|
|
total_gb=0,
|
|
expiry_time=expiry_time,
|
|
enable=True,
|
|
flow="xtls-rprx-vision",
|
|
)
|
|
|
|
logger.info(f"Ключ успешно обновлен на сервере {server_id} для {client_id}")
|
|
|
|
except Exception as e:
|
|
logger.error(
|
|
f"Ошибка при обновлении ключа на сервере {server_id} для {client_id}: {e}"
|
|
)
|