Добавлена обработка таймаутов с использованием httpx в клиентских операциях
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
import httpx
|
||||||
import py3xui
|
import py3xui
|
||||||
|
|
||||||
from config import LIMIT_IP, SUPERNODE
|
from config import LIMIT_IP, SUPERNODE
|
||||||
@@ -54,6 +54,10 @@ async def add_client(xui: py3xui.AsyncApi, config: ClientConfig) -> dict[str, An
|
|||||||
logger.info(f"Клиент {config.email} успешно добавлен с ID {config.client_id}")
|
logger.info(f"Клиент {config.email} успешно добавлен с ID {config.client_id}")
|
||||||
|
|
||||||
return response if response else {"status": "failed"}
|
return response if response else {"status": "failed"}
|
||||||
|
|
||||||
|
except httpx.ConnectTimeout as e:
|
||||||
|
logger.error(f"Ошибка при добавлении клиента {config.email}: {e}")
|
||||||
|
return {"status": "failed", "error": "Timeout"}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
error_message = str(e)
|
error_message = str(e)
|
||||||
@@ -110,6 +114,10 @@ async def extend_client_key(
|
|||||||
await xui.client.reset_stats(inbound_id, email)
|
await xui.client.reset_stats(inbound_id, email)
|
||||||
logger.info(f"Ключ клиента {email} успешно продлён до {new_expiry_time}")
|
logger.info(f"Ключ клиента {email} успешно продлён до {new_expiry_time}")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
except httpx.ConnectTimeout as e:
|
||||||
|
logger.error(f"Ошибка при обновлении клиента {email}: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Ошибка при обновлении клиента с email {email}: {e}")
|
logger.error(f"Ошибка при обновлении клиента с email {email}: {e}")
|
||||||
@@ -151,6 +159,10 @@ async def delete_client(
|
|||||||
await xui.client.delete(inbound_id, client.id)
|
await xui.client.delete(inbound_id, client.id)
|
||||||
logger.info(f"Клиент с ID {client_id} был удален успешно")
|
logger.info(f"Клиент с ID {client_id} был удален успешно")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
except httpx.ConnectTimeout as e:
|
||||||
|
logger.error(f"Ошибка при удалении клиента {email}: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Ошибка при удалении клиента с ID {client_id}: {e}")
|
logger.error(f"Ошибка при удалении клиента с ID {client_id}: {e}")
|
||||||
@@ -178,6 +190,10 @@ async def get_client_traffic(xui: py3xui.AsyncApi, client_id: str) -> dict[str,
|
|||||||
|
|
||||||
logger.info(f"Трафик для клиента {client_id} успешно получен.")
|
logger.info(f"Трафик для клиента {client_id} успешно получен.")
|
||||||
return {"status": "success", "client_id": client_id, "traffic": traffic_data}
|
return {"status": "success", "client_id": client_id, "traffic": traffic_data}
|
||||||
|
|
||||||
|
except httpx.ConnectTimeout as e:
|
||||||
|
logger.error(f"Ошибка при получении трафика клиента {client_id}: {e}")
|
||||||
|
return {"status": "error", "error": "Timeout"}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Ошибка при получении трафика клиента {client_id}: {e}")
|
logger.error(f"Ошибка при получении трафика клиента {client_id}: {e}")
|
||||||
@@ -221,6 +237,11 @@ async def toggle_client(xui: py3xui.AsyncApi, inbound_id: int, email: str, clien
|
|||||||
logger.info(f"Клиент с email {email} и ID {client_id} успешно {status}.")
|
logger.info(f"Клиент с email {email} и ID {client_id} успешно {status}.")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
except httpx.ConnectTimeout as e:
|
||||||
|
status = "включении" if enable else "отключении"
|
||||||
|
logger.error(f"Ошибка при {status} клиента с email {email} и ID {client_id}: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
status = "включении" if enable else "отключении"
|
status = "включении" if enable else "отключении"
|
||||||
logger.error(f"Ошибка при {status} клиента с email {email} и ID {client_id}: {e}")
|
logger.error(f"Ошибка при {status} клиента с email {email} и ID {client_id}: {e}")
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ async def handle_servers_availability(
|
|||||||
total_online_users = 0
|
total_online_users = 0
|
||||||
|
|
||||||
for server in cluster_servers:
|
for server in cluster_servers:
|
||||||
xui = AsyncApi(server["api_url"], username=ADMIN_USERNAME, password=ADMIN_PASSWORD)
|
xui = AsyncApi(server["api_url"], username=ADMIN_USERNAME, password=ADMIN_PASSWORD, logger=logger)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await xui.login()
|
await xui.login()
|
||||||
@@ -383,6 +383,7 @@ async def handle_clusters_backup(
|
|||||||
server["api_url"],
|
server["api_url"],
|
||||||
username=ADMIN_USERNAME,
|
username=ADMIN_USERNAME,
|
||||||
password=ADMIN_PASSWORD,
|
password=ADMIN_PASSWORD,
|
||||||
|
logger=logger,
|
||||||
)
|
)
|
||||||
await create_backup_and_send_to_admins(xui)
|
await create_backup_and_send_to_admins(xui)
|
||||||
|
|
||||||
|
|||||||
@@ -449,6 +449,7 @@ async def finalize_key_creation(
|
|||||||
old_server_info["api_url"],
|
old_server_info["api_url"],
|
||||||
username=ADMIN_USERNAME,
|
username=ADMIN_USERNAME,
|
||||||
password=ADMIN_PASSWORD,
|
password=ADMIN_PASSWORD,
|
||||||
|
logger=logger,
|
||||||
)
|
)
|
||||||
deletion_success = await delete_client(
|
deletion_success = await delete_client(
|
||||||
xui,
|
xui,
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ async def create_client_on_server(
|
|||||||
server_info["api_url"],
|
server_info["api_url"],
|
||||||
username=ADMIN_USERNAME,
|
username=ADMIN_USERNAME,
|
||||||
password=ADMIN_PASSWORD,
|
password=ADMIN_PASSWORD,
|
||||||
|
logger=logger,
|
||||||
)
|
)
|
||||||
|
|
||||||
inbound_id = server_info.get("inbound_id")
|
inbound_id = server_info.get("inbound_id")
|
||||||
@@ -129,6 +130,7 @@ async def renew_key_in_cluster(cluster_id, email, client_id, new_expiry_time, to
|
|||||||
server_info["api_url"],
|
server_info["api_url"],
|
||||||
username=ADMIN_USERNAME,
|
username=ADMIN_USERNAME,
|
||||||
password=ADMIN_PASSWORD,
|
password=ADMIN_PASSWORD,
|
||||||
|
logger=logger,
|
||||||
)
|
)
|
||||||
|
|
||||||
inbound_id = server_info.get("inbound_id")
|
inbound_id = server_info.get("inbound_id")
|
||||||
@@ -180,6 +182,7 @@ async def delete_key_from_cluster(cluster_id, email, client_id):
|
|||||||
server_info["api_url"],
|
server_info["api_url"],
|
||||||
username=ADMIN_USERNAME,
|
username=ADMIN_USERNAME,
|
||||||
password=ADMIN_PASSWORD,
|
password=ADMIN_PASSWORD,
|
||||||
|
logger=logger,
|
||||||
)
|
)
|
||||||
|
|
||||||
inbound_id = server_info.get("inbound_id")
|
inbound_id = server_info.get("inbound_id")
|
||||||
@@ -230,6 +233,7 @@ async def update_key_on_cluster(tg_id, client_id, email, expiry_time, cluster_id
|
|||||||
server_info["api_url"],
|
server_info["api_url"],
|
||||||
username=ADMIN_USERNAME,
|
username=ADMIN_USERNAME,
|
||||||
password=ADMIN_PASSWORD,
|
password=ADMIN_PASSWORD,
|
||||||
|
logger=logger,
|
||||||
)
|
)
|
||||||
|
|
||||||
inbound_id = server_info.get("inbound_id")
|
inbound_id = server_info.get("inbound_id")
|
||||||
@@ -357,7 +361,7 @@ async def get_user_traffic(session: Any, tg_id: int, email: str) -> dict[str, An
|
|||||||
Получает трафик с сервера для заданного client_id.
|
Получает трафик с сервера для заданного client_id.
|
||||||
Возвращает кортеж: (server, used_gb) или (server, ошибка).
|
Возвращает кортеж: (server, used_gb) или (server, ошибка).
|
||||||
"""
|
"""
|
||||||
xui = AsyncApi(api_url, username=ADMIN_USERNAME, password=ADMIN_PASSWORD)
|
xui = AsyncApi(api_url, username=ADMIN_USERNAME, password=ADMIN_PASSWORD, logger=logger)
|
||||||
try:
|
try:
|
||||||
traffic_info = await get_client_traffic(xui, client_id)
|
traffic_info = await get_client_traffic(xui, client_id)
|
||||||
if traffic_info["status"] == "success" and traffic_info["traffic"]:
|
if traffic_info["status"] == "success" and traffic_info["traffic"]:
|
||||||
@@ -424,6 +428,7 @@ async def toggle_client_on_cluster(cluster_id: str, email: str, client_id: str,
|
|||||||
server_info["api_url"],
|
server_info["api_url"],
|
||||||
username=ADMIN_USERNAME,
|
username=ADMIN_USERNAME,
|
||||||
password=ADMIN_PASSWORD,
|
password=ADMIN_PASSWORD,
|
||||||
|
logger=logger,
|
||||||
)
|
)
|
||||||
|
|
||||||
inbound_id = server_info.get("inbound_id")
|
inbound_id = server_info.get("inbound_id")
|
||||||
|
|||||||
@@ -42,3 +42,4 @@ urllib3==2.2.3
|
|||||||
wrapt==1.16.0
|
wrapt==1.16.0
|
||||||
yarl==1.15.5
|
yarl==1.15.5
|
||||||
yookassa==3.3.0
|
yookassa==3.3.0
|
||||||
|
httpx
|
||||||
|
|||||||
Reference in New Issue
Block a user