fxdyz
This commit is contained in:
@@ -116,6 +116,49 @@ class JX3APIService:
|
||||
}
|
||||
)
|
||||
|
||||
async def token_stats(self) -> Optional[Dict[str, Any]]:
|
||||
"""查询当前配置 JX3API Token 的等级、用量及有效状态。"""
|
||||
if not str(self.token or "").strip():
|
||||
return None
|
||||
|
||||
try:
|
||||
data = await self._api.post(
|
||||
"https://www.jx3api.com/token/stats",
|
||||
data={"token": self.token},
|
||||
out_key="data",
|
||||
success_codes=(200, "200"),
|
||||
return_error=True,
|
||||
)
|
||||
except Exception as exc:
|
||||
logger.warning(f"查询 JX3API Token 统计失败: {exc}")
|
||||
return None
|
||||
|
||||
if isinstance(data, APIErrorResponse):
|
||||
logger.warning(
|
||||
f"JX3API Token 统计返回错误: "
|
||||
f"code={data.code}, msg={data.message or '未知错误'}"
|
||||
)
|
||||
return None
|
||||
if not isinstance(data, dict):
|
||||
return None
|
||||
|
||||
def nonnegative_int(value: Any) -> Optional[int]:
|
||||
if isinstance(value, bool):
|
||||
return None
|
||||
try:
|
||||
number = int(value)
|
||||
except (TypeError, ValueError):
|
||||
return None
|
||||
return number if number >= 0 else None
|
||||
|
||||
valid = data.get("valid")
|
||||
return {
|
||||
"level": nonnegative_int(data.get("level")),
|
||||
"used": nonnegative_int(data.get("used")),
|
||||
"remaining": nonnegative_int(data.get("remaining")),
|
||||
"valid": valid if isinstance(valid, bool) else None,
|
||||
}
|
||||
|
||||
|
||||
def _init_return_data(self) -> Dict[str, Any]:
|
||||
"""初始化标准的返回数据结构"""
|
||||
|
||||
+17
-5
@@ -1,5 +1,6 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import re
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
@@ -87,11 +88,21 @@ class WebUIService:
|
||||
raise ValueError("别名必须是字符串或数组")
|
||||
|
||||
async def dashboard(self):
|
||||
bindings = await self.server_binding.list_bindings()
|
||||
subscriptions = await self.event_push.list_subscription_statuses()
|
||||
aliases = await self.server_binding.list_aliases()
|
||||
kungfu = await self.kungfu_alias.list_kungfu()
|
||||
session_control = await self.session_control.get_state()
|
||||
(
|
||||
bindings,
|
||||
subscriptions,
|
||||
aliases,
|
||||
kungfu,
|
||||
session_control,
|
||||
token_stats,
|
||||
) = await asyncio.gather(
|
||||
self.server_binding.list_bindings(),
|
||||
self.event_push.list_subscription_statuses(),
|
||||
self.server_binding.list_aliases(),
|
||||
self.kungfu_alias.list_kungfu(),
|
||||
self.session_control.get_state(),
|
||||
self.jx3api.token_stats(),
|
||||
)
|
||||
return json_response(
|
||||
{
|
||||
"bindings": bindings,
|
||||
@@ -103,6 +114,7 @@ class WebUIService:
|
||||
str(action): name for action, name in EVENT_NAMES.items()
|
||||
},
|
||||
"session_control": session_control,
|
||||
"token_stats": token_stats,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user