diff --git a/handlers/admin/clusters/clusters_handler.py b/handlers/admin/clusters/clusters_handler.py
index 0132fbbd..504ce1ec 100644
--- a/handlers/admin/clusters/clusters_handler.py
+++ b/handlers/admin/clusters/clusters_handler.py
@@ -274,7 +274,6 @@ async def handle_cluster_availability(
callback_query: types.CallbackQuery, callback_data: AdminClusterCallback, session: Any
):
cluster_name = callback_data.data
-
servers = await get_servers(session)
cluster_servers = servers.get(cluster_name, [])
@@ -286,25 +285,28 @@ async def handle_cluster_availability(
f"🖥️ Проверка доступности серверов для кластера {cluster_name}.\n\n"
"Это может занять до 1 минуты, пожалуйста, подождите..."
)
-
await callback_query.message.edit_text(text=text)
total_online_users = 0
result_text = f"🖥️ Проверка доступности серверов\n\n⚙️ Кластер: {cluster_name}\n\n"
for server in cluster_servers:
- xui = AsyncApi(server["api_url"], username=ADMIN_USERNAME, password=ADMIN_PASSWORD, logger=logger)
-
+ xui = AsyncApi(server["api_url"], username=ADMIN_USERNAME, password=ADMIN_PASSWORD, logger=None)
try:
await xui.login()
- online_users = len(await xui.client.online())
- total_online_users += online_users
- result_text += f"🌍 {server['server_name']} - онлайн: {online_users}\n"
+ online_clients = await xui.client.online()
+ inbound_id = int(server["inbound_id"])
+ online_inbound_users = 0
+ for client_email in online_clients:
+ client = await xui.client.get_by_email(client_email)
+ if client and client.inbound_id == inbound_id:
+ online_inbound_users += 1
+ total_online_users += online_inbound_users
+ result_text += f"🌍 {server['server_name']} - {online_inbound_users} онлайн\n"
except Exception as e:
- result_text += f"❌ {server['server_name']} - ошибка: {e}\n"
+ result_text += f"❌ {server['server_name']} - ошибка: {str(e) if str(e).strip() else 'Сервер недоступен'}\n"
result_text += f"\n👥 Всего пользователей онлайн: {total_online_users}"
-
await callback_query.message.edit_text(text=result_text, reply_markup=build_admin_back_kb("clusters"))
diff --git a/handlers/keys/key_management.py b/handlers/keys/key_management.py
index 61817bce..5d08cf57 100644
--- a/handlers/keys/key_management.py
+++ b/handlers/keys/key_management.py
@@ -96,20 +96,14 @@ async def handle_key_creation(
extra_days = NOTIFY_EXTRA_DAYS if trial_status == -1 else 0
expiry_time = current_time + timedelta(days=TRIAL_TIME + extra_days)
logger.info(f"Доступен {TRIAL_TIME + extra_days}-дневный пробный период пользователю {tg_id}.")
- updated = await update_trial(tg_id, 1, session)
- if updated:
- await edit_or_send_message(
- target_message=message_or_query
- if isinstance(message_or_query, Message)
- else message_or_query.message,
- text=CREATING_CONNECTION_MSG,
- reply_markup=None,
- )
-
- await create_key(tg_id, expiry_time, state, session, message_or_query)
- return
- else:
- logger.error(f"Не удалось обновить статус триального периода для пользователя {tg_id}.")
+ await edit_or_send_message(
+ target_message=message_or_query if isinstance(message_or_query, Message) else message_or_query.message,
+ text=CREATING_CONNECTION_MSG,
+ reply_markup=None,
+ )
+ await state.update_data(is_trial=True)
+ await create_key(tg_id, expiry_time, state, session, message_or_query)
+ return
builder = InlineKeyboardBuilder()
for index, (plan_id, price) in enumerate(RENEWAL_PRICES.items()):
@@ -144,7 +138,7 @@ async def handle_key_creation(
@router.callback_query(F.data.startswith("select_plan_"))
-async def select_tariff_plan(callback_query: CallbackQuery, session: Any):
+async def select_tariff_plan(callback_query: CallbackQuery, session: Any, state: FSMContext):
tg_id = callback_query.message.chat.id
plan_id = callback_query.data.split("_")[-1]
plan_price = RENEWAL_PRICES.get(plan_id)
@@ -191,9 +185,8 @@ async def select_tariff_plan(callback_query: CallbackQuery, session: Any):
)
expiry_time = datetime.now(moscow_tz) + timedelta(days=duration_days)
- await create_key(tg_id, expiry_time, None, session, callback_query, None, plan_id)
- await update_balance(tg_id, -plan_price, session)
-
+ await state.update_data(plan_id=plan_id)
+ await create_key(tg_id, expiry_time, state, session, callback_query)
async def create_key(
tg_id: int,
@@ -214,13 +207,8 @@ async def create_key(
if USE_COUNTRY_SELECTION:
logger.info("[Country Selection] USE_COUNTRY_SELECTION включен. Получение наименее загруженного кластера")
least_loaded_cluster = await get_least_loaded_cluster()
- logger.info(
- f"[Country Selection] Наименее загруженный кластер: {least_loaded_cluster}. Получаем список серверов"
- )
- servers = await session.fetch(
- "SELECT server_name FROM servers WHERE cluster_name = $1",
- least_loaded_cluster,
- )
+ logger.info(f"[Country Selection] Наименее загруженный кластер: {least_loaded_cluster}. Получаем список серверов")
+ servers = await session.fetch("SELECT server_name FROM servers WHERE cluster_name = $1", least_loaded_cluster)
countries = [server["server_name"] for server in servers]
logger.info(f"[Country Selection] Список серверов: {countries}")
@@ -280,7 +268,14 @@ async def create_key(
least_loaded_cluster,
session,
)
- await update_trial(tg_id, 1, session)
+ data = await state.get_data()
+ if data.get("is_trial"):
+ trial_status = await get_trial(tg_id, session)
+ if trial_status in [0, -1]:
+ await update_trial(tg_id, 1, session)
+ if data.get("plan_id"):
+ plan_price = RENEWAL_PRICES.get(data["plan_id"])
+ await update_balance(tg_id, -plan_price, session)
logger.info(f"[Database] Ключ сохранён в базе данных для пользователя {tg_id}")
except Exception as e:
logger.error(f"[Error] Ошибка при создании ключа для пользователя {tg_id}: {e}")
@@ -375,7 +370,7 @@ async def change_location_callback(callback_query: CallbackQuery, session: Any):
@router.callback_query(F.data.startswith("select_country|"))
-async def handle_country_selection(callback_query: CallbackQuery, session: Any):
+async def handle_country_selection(callback_query: CallbackQuery, session: Any, state: FSMContext):
"""
Обрабатывает выбор страны.
Формат callback data:
@@ -402,7 +397,7 @@ async def handle_country_selection(callback_query: CallbackQuery, session: Any):
logger.info(f"Пользователь {tg_id} выбрал страну: {selected_country}")
logger.info(f"Получено время истечения (timestamp): {ts}")
- await finalize_key_creation(tg_id, expiry_time, selected_country, None, session, callback_query, old_key_name)
+ await finalize_key_creation(tg_id, expiry_time, selected_country, state, session, callback_query, old_key_name)
async def finalize_key_creation(
@@ -516,6 +511,14 @@ async def finalize_key_creation(
public_link,
selected_country,
)
+ data = await state.get_data()
+ if data.get("is_trial"):
+ trial_status = await get_trial(tg_id, session)
+ if trial_status in [0, -1]:
+ await update_trial(tg_id, 1, session)
+ if data.get("plan_id"):
+ plan_price = RENEWAL_PRICES.get(data["plan_id"])
+ await update_balance(tg_id, -plan_price, session)
except Exception as e:
logger.error(f"Error while creating the key for user {tg_id}: {e}")