88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
import asyncio
|
|
import uuid
|
|
from datetime import datetime, timedelta
|
|
from typing import Any
|
|
|
|
import pytz
|
|
from py3xui import AsyncApi
|
|
|
|
from client import ClientConfig, add_client
|
|
from config import ADMIN_PASSWORD, ADMIN_USERNAME, LIMIT_IP, PUBLIC_LINK, SUPERNODE, TOTAL_GB, TRIAL_TIME
|
|
from database import get_servers, get_trial, store_key, update_trial
|
|
from handlers.texts import INSTRUCTIONS
|
|
from handlers.utils import generate_random_email, get_least_loaded_cluster
|
|
from logger import logger
|
|
|
|
|
|
async def create_trial_key(tg_id: int, session: Any):
|
|
try:
|
|
trial_status = await get_trial(tg_id, session)
|
|
if trial_status == 1:
|
|
return {"error": "Вы уже использовали пробную версию."}
|
|
except Exception as e:
|
|
logger.error(f"Ошибка при проверке триала: {e}")
|
|
|
|
client_id = str(uuid.uuid4())
|
|
base_email = generate_random_email()
|
|
public_link = f"{PUBLIC_LINK}{base_email}/{tg_id}"
|
|
instructions = INSTRUCTIONS
|
|
result = {"key": public_link, "instructions": instructions, "email": base_email}
|
|
|
|
moscow_tz = pytz.timezone("Europe/Moscow")
|
|
current_time = datetime.now(moscow_tz)
|
|
expiry_time = current_time + timedelta(days=TRIAL_TIME)
|
|
expiry_timestamp = int(expiry_time.timestamp() * 1000)
|
|
|
|
clusters = await get_servers(session)
|
|
least_loaded_cluster = await get_least_loaded_cluster()
|
|
if least_loaded_cluster not in clusters:
|
|
raise ValueError(f"Кластер {least_loaded_cluster} не найден в базе данных.")
|
|
|
|
servers_in_cluster = clusters[least_loaded_cluster]
|
|
tasks = []
|
|
|
|
for server_info in servers_in_cluster:
|
|
server_name = server_info.get("server_name", "unknown")
|
|
|
|
if SUPERNODE:
|
|
email = f"{base_email}_{server_name.lower()}"
|
|
else:
|
|
email = base_email
|
|
|
|
tasks.append(
|
|
add_client(
|
|
AsyncApi(
|
|
server_info["api_url"],
|
|
username=ADMIN_USERNAME,
|
|
password=ADMIN_PASSWORD,
|
|
),
|
|
ClientConfig(
|
|
client_id=client_id,
|
|
email=email,
|
|
tg_id=tg_id,
|
|
limit_ip=LIMIT_IP,
|
|
total_gb=TOTAL_GB,
|
|
expiry_time=expiry_timestamp,
|
|
enable=True,
|
|
flow="xtls-rprx-vision",
|
|
inbound_id=int(server_info["inbound_id"]),
|
|
sub_id=base_email,
|
|
),
|
|
)
|
|
)
|
|
|
|
await asyncio.gather(*tasks)
|
|
|
|
await store_key(
|
|
tg_id,
|
|
client_id,
|
|
base_email,
|
|
expiry_timestamp,
|
|
public_link,
|
|
server_id=least_loaded_cluster,
|
|
session=session,
|
|
)
|
|
|
|
await update_trial(tg_id, 1, session)
|
|
return result
|