diff --git a/handlers/admin/clusters/clusters_handler.py b/handlers/admin/clusters/clusters_handler.py index c01b78d6..a82898ff 100644 --- a/handlers/admin/clusters/clusters_handler.py +++ b/handlers/admin/clusters/clusters_handler.py @@ -208,8 +208,8 @@ async def handle_subscription_url_input(message: Message, state: FSMContext): await state.update_data(subscription_url=subscription_url) await message.answer( - text=f"Введите inbound_id для сервера {server_name} в кластере {cluster_name}:\n\n" - f"Для Remnawave это UUID Инбаунда, для 3x-ui — просто ID (например, 1).", + text=f"Введите inbound_id/Squads для сервера {server_name} в кластере {cluster_name}:\n\n" + f"Для Remnawave это UUID Squads, для 3x-ui — просто ID (например, 1).", reply_markup=build_admin_back_kb("clusters"), ) await state.set_state(AdminClusterStates.waiting_for_inbound_id) @@ -393,21 +393,19 @@ async def handle_cluster_availability( total_online_users += online_remna_users nodes_info = nodes_data["nodes"] - if len(nodes_info) > 1: - result_text += f"🌍 {prefix} {server_name} - {online_remna_users} онлайн\n" - for node_info in nodes_info: - country_code = node_info.get("country_code", "Unknown") - node_name = node_info.get("name", "Unknown") - online_users = node_info.get("online_users", 0) + result_text += f"🌍 {prefix} {server_name} - {online_remna_users} онлайн\n" + seen = set() + for node_info in nodes_info: + node_name = node_info.get("name", "Unknown") + if node_name in seen: + continue + seen.add(node_name) - if country_code != "Unknown" and len(country_code) == 2: - flag = "".join(chr(ord(c) + 127397) for c in country_code.upper()) - else: - flag = country_code + country_code = node_info.get("country_code", "Unknown") + online_users = node_info.get("online_users", 0) - result_text += f" ↳ {flag} ({node_name}): {online_users} онлайн\n" - else: - result_text += f"🌍 {prefix} {server_name} - {online_remna_users} онлайн\n" + flag = "".join(chr(ord(c) + 127397) for c in country_code.upper()) if country_code != "Unknown" and len(country_code) == 2 else country_code + result_text += f" ↳ {flag} ({node_name}): {online_users} онлайн\n" except Exception as e: error_text = str(e) or "Сервер недоступен" diff --git a/handlers/admin/servers/keyboard.py b/handlers/admin/servers/keyboard.py index 98480301..38e2fbd6 100644 --- a/handlers/admin/servers/keyboard.py +++ b/handlers/admin/servers/keyboard.py @@ -63,7 +63,7 @@ def build_edit_server_fields_kb(server_name: str, server_data: dict) -> InlineKe ) ) - builder.row(InlineKeyboardButton(text="🔑 Inbound ID", callback_data=f"edit_server_field|{server_name}|inbound_id")) + builder.row(InlineKeyboardButton(text="🔑 Inbound ID/Squads", callback_data=f"edit_server_field|{server_name}|inbound_id")) builder.row(InlineKeyboardButton(text="⚙️ Тип панели", callback_data=f"select_panel_type|{server_name}")) diff --git a/handlers/admin/servers/servers_handler.py b/handlers/admin/servers/servers_handler.py index 4e84b6bb..10abd580 100644 --- a/handlers/admin/servers/servers_handler.py +++ b/handlers/admin/servers/servers_handler.py @@ -77,7 +77,7 @@ async def handle_server_manage( text += f"🌐 Subscription URL: {subscription_url}\n" text += ( - f"🔑 Inbound ID: {inbound_id}\n" + f"🔑 Inbound ID/Squads: {inbound_id}\n" f"⚙️ Тип панели: {panel_type}\n" f"📈 Лимит ключей: {limit_display}\n" ) @@ -258,7 +258,7 @@ async def toggle_server_enabled( f"🔧 Информация о сервере {server_name}:\n\n" f"📡 API URL: {server['api_url']}\n" f"🌐 Subscription URL: {server['subscription_url']}\n" - f"🔑 Inbound ID: {server['inbound_id']}\n" + f"🔑 Inbound ID/Squads: {server['inbound_id']}\n" f"📈 Лимит ключей: {limit_display}" ) @@ -311,7 +311,7 @@ async def save_server_limit(message: types.Message, state: FSMContext, session: f"🔧 Информация о сервере {server_name}:\n\n" f"📡 API URL: {server['api_url']}\n" f"🌐 Subscription URL: {server['subscription_url']}\n" - f"🔑 Inbound ID: {server['inbound_id']}\n" + f"🔑 Inbound ID/Squads: {server['inbound_id']}\n" f"📈 Лимит ключей: {limit_display}" ) @@ -361,7 +361,7 @@ async def ask_new_field_value(callback: CallbackQuery, state: FSMContext, sessio "server_name": "имя сервера", "api_url": "API URL", "subscription_url": "Subscription URL", - "inbound_id": "Inbound ID", + "inbound_id": "Inbound ID/Squads", } await callback.message.edit_text( @@ -438,7 +438,7 @@ async def apply_field_edit(message: types.Message, state: FSMContext, session: A "server_name": "имя сервера", "api_url": "API URL", "subscription_url": "Subscription URL", - "inbound_id": "Inbound ID", + "inbound_id": "Inbound ID/Squads", } await message.answer( diff --git a/handlers/keys/key_utils.py b/handlers/keys/key_utils.py index 33cd4391..1ac39f30 100644 --- a/handlers/keys/key_utils.py +++ b/handlers/keys/key_utils.py @@ -108,7 +108,7 @@ async def create_key_on_cluster( "trafficLimitStrategy": "NO_RESET", "expireAt": expire_at, "telegramId": tg_id, - "activeUserInbounds": inbound_ids, + "activeInternalSquads": inbound_ids, } if traffic_limit_bytes and traffic_limit_bytes > 0: @@ -352,7 +352,7 @@ async def renew_key_in_cluster( "trafficLimitStrategy": "NO_RESET", "expireAt": expire_iso, "telegramId": tg_id, - "activeUserInbounds": remnawave_inbound_ids, + "activeInternalSquads": remnawave_inbound_ids, } if remnawave_link and "/" in remnawave_link: user_data["shortUuid"] = remnawave_link.rstrip("/").split("/")[-1] @@ -567,7 +567,7 @@ async def update_key_on_cluster( "trafficLimitStrategy": "NO_RESET", "expireAt": expire_iso, "telegramId": tg_id, - "activeUserInbounds": inbound_ids, + "activeInternalSquads": inbound_ids, } if traffic_limit is not None: user_data["trafficLimitBytes"] = traffic_limit * 1024**3 diff --git a/panels/remnawave.cpython-312-x86_64-linux-gnu.so b/panels/remnawave.cpython-312-x86_64-linux-gnu.so index aa974232..72236b42 100644 Binary files a/panels/remnawave.cpython-312-x86_64-linux-gnu.so and b/panels/remnawave.cpython-312-x86_64-linux-gnu.so differ