Files
Solo_bot/handlers/keys/trial_key.py
T

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