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