diff --git a/handlers/keys/key_mode/key_cluster_mode.py b/handlers/keys/key_mode/key_cluster_mode.py index 91c8853f..52a216ba 100644 --- a/handlers/keys/key_mode/key_cluster_mode.py +++ b/handlers/keys/key_mode/key_cluster_mode.py @@ -13,6 +13,7 @@ from config import ( CONNECT_PHONE_BUTTON, RENEWAL_PRICES, SUPPORT_CHAT_URL, + DEFAULT_HWID_LIMIT ) from database import ( get_key_details, @@ -61,7 +62,17 @@ async def key_cluster_mode( try: least_loaded_cluster = await get_least_loaded_cluster() - await create_key_on_cluster(least_loaded_cluster, tg_id, client_id, email, expiry_timestamp, plan, session) + await create_key_on_cluster( + least_loaded_cluster, + tg_id, + client_id, + email, + expiry_timestamp, + plan, + session, + hwid_limit=DEFAULT_HWID_LIMIT, + ) + logger.info(f"[Key Creation] Ключ создан на кластере {least_loaded_cluster} для пользователя {tg_id}") key_record = await get_key_details(email, session) diff --git a/handlers/keys/key_mode/key_country_mode.py b/handlers/keys/key_mode/key_country_mode.py index 1d414a8f..c1b6d909 100644 --- a/handlers/keys/key_mode/key_country_mode.py +++ b/handlers/keys/key_mode/key_country_mode.py @@ -23,6 +23,7 @@ from config import ( REMNAWAVE_PASSWORD, RENEWAL_PRICES, SUPPORT_CHAT_URL, + DEFAULT_HWID_LIMIT ) from database import ( add_user, @@ -352,6 +353,7 @@ async def finalize_key_creation( "expireAt": expire_at, "telegramId": tg_id, "activeUserInbounds": [server_info["inbound_id"]], + "hwidDeviceLimit": DEFAULT_HWID_LIMIT, } result = await remna.create_user(user_data) if not result: diff --git a/handlers/keys/key_utils.py b/handlers/keys/key_utils.py index 569bce8a..dfef9fe5 100644 --- a/handlers/keys/key_utils.py +++ b/handlers/keys/key_utils.py @@ -1,7 +1,7 @@ import asyncio from datetime import datetime, timezone -from typing import Any +from typing import Any, Optional import asyncpg @@ -14,6 +14,7 @@ from config import ( REMNAWAVE_PASSWORD, SUPERNODE, TOTAL_GB, + DEFAULT_HWID_LIMIT ) from database import delete_notification, get_servers, store_key from handlers.utils import check_server_key_limit, get_least_loaded_cluster @@ -39,6 +40,7 @@ async def create_key_on_cluster( plan: int = None, session=None, remnawave_link: str = None, + hwid_limit: Optional[int] = DEFAULT_HWID_LIMIT, ): try: servers = await get_servers(include_enabled=True) @@ -65,13 +67,11 @@ async def create_key_on_cluster( async with asyncpg.create_pool(DATABASE_URL) as pool: async with pool.acquire() as conn: remnawave_servers = [ - s - for s in enabled_servers + s for s in enabled_servers if s.get("panel_type", "3x-ui").lower() == "remnawave" and await check_server_key_limit(s, conn) ] xui_servers = [ - s - for s in enabled_servers + s for s in enabled_servers if s.get("panel_type", "3x-ui").lower() == "3x-ui" and await check_server_key_limit(s, conn) ] @@ -80,7 +80,6 @@ async def create_key_on_cluster( return semaphore = asyncio.Semaphore(2) - remnawave_created = False remnawave_key = None remnawave_client_id = None @@ -113,6 +112,8 @@ async def create_key_on_cluster( if short_uuid: user_data["shortUuid"] = short_uuid + if hwid_limit is not None: + user_data["hwidDeviceLimit"] = hwid_limit result = await remna.create_user(user_data) if not result: @@ -130,25 +131,13 @@ async def create_key_on_cluster( if SUPERNODE: for server_info in xui_servers: await create_client_on_server( - server_info, - tg_id, - final_client_id, - email, - expiry_timestamp, - semaphore, - plan=plan, + server_info, tg_id, final_client_id, email, expiry_timestamp, semaphore, plan=plan ) else: await asyncio.gather( *( create_client_on_server( - server, - tg_id, - final_client_id, - email, - expiry_timestamp, - semaphore, - plan=plan, + server, tg_id, final_client_id, email, expiry_timestamp, semaphore, plan=plan ) for server in xui_servers ), @@ -223,7 +212,7 @@ async def create_client_on_server( await asyncio.sleep(0.7) -async def renew_key_in_cluster(cluster_id, email, client_id, new_expiry_time, total_gb): +async def renew_key_in_cluster(cluster_id, email, client_id, new_expiry_time, total_gb, hwid_device_limit=DEFAULT_HWID_LIMIT): try: servers = await get_servers() cluster = servers.get(cluster_id) @@ -292,6 +281,7 @@ async def renew_key_in_cluster(cluster_id, email, client_id, new_expiry_time, to expire_at=expire_iso, active_user_inbounds=remnawave_inbound_ids, traffic_limit_bytes=total_gb, + hwid_device_limit=DEFAULT_HWID_LIMIT, ) if updated: logger.info(f"Подписка Remnawave {client_id} успешно продлена")