This commit is contained in:
2026-07-26 17:57:44 +08:00
parent a555f785ba
commit 069f1bafe1
27 changed files with 4893 additions and 3846 deletions
+419
View File
@@ -0,0 +1,419 @@
from datetime import datetime
from typing import Any, Dict, List, Optional
from astrbot.api import logger
from .base import DATA_PROCESSING_ERRORS, BaseDomainService
ROLE_RANK_NAMES = {
"名士五十强",
"老江湖五十强",
"兵甲藏家五十强",
"名师五十强",
"阵营英雄五十强",
"薪火相传五十强",
"庐园广记一百强",
}
TONG_RANK_NAMES = {
"浩气神兵宝甲五十强",
"恶人神兵宝甲五十强",
"浩气爱心帮会五十强",
"恶人爱心帮会五十强",
"赛季恶人五十强",
"赛季浩气五十强",
"上周恶人五十强",
"上周浩气五十强",
"本周恶人五十强",
"本周浩气五十强",
}
class FactionService(BaseDomainService):
async def zilipaixing(self, school: str, server: str) -> Dict[str, Any]:
"""资历排行"""
return_data = self.new_result()
params = {
"server": server,
"school": school,
}
data: Optional[List[Dict[str, Any]]] = await self.request(
"jx3_zilipaixing", params=params
)
if not data or not isinstance(data, list):
return_data["msg"] = "未查询到资历排行信息"
return return_data
try:
return_data["data"] = {
"items": data,
"school": school,
"server": server,
"update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
}
except DATA_PROCESSING_ERRORS as e:
logger.error(f"处理资历排行数据失败: {e}")
return_data["msg"] = "处理资历排行数据失败"
return return_data
if not await self.attach_template(return_data, "zilipaixing.html"):
return return_data
return_data["code"] = 200
return return_data
async def shilianpaixing(self, name: str, server: str) -> Dict[str, Any]:
"""试炼排行"""
return_data = self.new_result()
params = {
"server": server,
"name": name,
}
data: Optional[Dict[str, Any]] = await self.request(
"jx3_shilianpaixing", params=params
)
if not data or not isinstance(data, dict):
return_data["msg"] = "未查询到试炼排行信息"
return return_data
try:
items = data.get("data", [])
if not isinstance(items, list) or not items:
return_data["msg"] = "未查询到试炼排行信息"
return return_data
update_time = data.get("time")
if update_time:
try:
update_time = datetime.fromtimestamp(int(update_time)).strftime(
"%Y-%m-%d %H:%M:%S"
)
except (TypeError, ValueError, OSError):
update_time = str(update_time)
else:
update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return_data["data"] = {
"items": items,
"name": data.get("name", name),
"server": data.get("server", server),
"update_time": update_time,
}
except DATA_PROCESSING_ERRORS as e:
logger.error(f"处理试炼排行数据失败: {e}")
return_data["msg"] = "处理试炼排行数据失败"
return return_data
if not await self.attach_template(return_data, "shilianpaixing.html"):
return return_data
return_data["code"] = 200
return return_data
async def shapan(self, server: str) -> Dict[str, Any]:
"""区服沙盘"""
return_data = self.new_result()
# 1. 构造请求参数
params = {"serverName": server}
# 2. 调用基础请求
data: Optional[Dict[str, Any]] = await self.request(
"aijx3_shapan", params=params
)
if not data:
return_data["msg"] = "获取接口信息失败"
return return_data
# 3. 处理返回数据 (直接提取图片 URL)
pic_url = data.get("picUrl")
if pic_url:
return_data["data"] = pic_url
else:
return_data["msg"] = "接口未返回图片URL"
return return_data
return_data["code"] = 200
return return_data
async def zhengyingpaimai(self, server: str, name: str) -> Dict[str, Any]:
"""阵营拍卖"""
return_data = self.new_result()
# 1. 构造请求参数
params = {"server": server, "name": name}
# 2. 调用基础请求
data: Optional[List[Dict[str, Any]]] = await self.request(
"jx3_zhengyingpaimai", params=params
)
if not data:
return_data["msg"] = "获取接口信息失败"
return return_data
# 3. 处理返回数据
try:
for item in data:
item["time"] = datetime.fromtimestamp(item["time"]).strftime(
"%Y-%m-%d %H:%M:%S"
)
return_data["data"]["list"] = data
except DATA_PROCESSING_ERRORS as e:
logger.error(f"处理返回数据失败: {e}")
return_data["msg"] = "处理返回数据失败"
return return_data
# 4. 加载模板
if not await self.attach_template(return_data, "zhengyingpaimai.html"):
return return_data
return_data["code"] = 200
return return_data
async def bangzhanjilu(self, server: str) -> Dict[str, Any]:
"""帮战记录"""
return_data = self.new_result()
params = {
"server": server,
}
data: Optional[List[Dict[str, Any]]] = await self.request(
"jx3_bangzhanjilu", params=params
)
if not data or not isinstance(data, list):
return_data["msg"] = "未查询到帮战记录"
return return_data
try:
def format_time(value: Any) -> str:
if not value:
return ""
try:
return datetime.fromtimestamp(int(value)).strftime(
"%Y-%m-%d %H:%M:%S"
)
except (TypeError, ValueError, OSError):
return str(value)
def format_duration(value: Any) -> str:
if value in (None, ""):
return ""
try:
seconds = max(0, int(value))
except (TypeError, ValueError):
return str(value)
hours = seconds // 3600
minutes = (seconds % 3600) // 60
secs = seconds % 60
return f"{hours}{minutes:02d}{secs:02d}"
items = []
for item in data:
if not isinstance(item, dict):
continue
items.append(
{
"zoneName": item.get("zoneName", ""),
"serverName": item.get("serverName", ""),
"declaringTongName": item.get("declaringTongName", ""),
"acceptingTongName": item.get("acceptingTongName", ""),
"startTime": format_time(item.get("startTime")),
"matchDuration": format_duration(item.get("matchDuration")),
"endTime": format_time(item.get("endTime")),
}
)
if not items:
return_data["msg"] = "未查询到帮战记录"
return return_data
return_data["data"] = {
"items": items,
"server": server,
"update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
}
except DATA_PROCESSING_ERRORS as e:
logger.error(f"处理帮战记录数据失败: {e}")
return_data["msg"] = "处理帮战记录数据失败"
return return_data
if not await self.attach_template(return_data, "bangzhanjilu.html"):
return return_data
return_data["code"] = 200
return return_data
async def tongzhanyy(self, server: str) -> Dict[str, Any]:
"""统战歪歪"""
return_data = self.new_result()
params = {
"server": server,
}
data: Optional[List[Dict[str, Any]]] = await self.request(
"jx3_tongzhanyy", params=params
)
if not data or not isinstance(data, list):
return_data["msg"] = "未查询到统战歪歪信息"
return return_data
try:
lines = ["统战歪歪"]
has_channel = False
for group in data:
if not isinstance(group, dict):
continue
group_server = group.get("server", "")
channels = group.get("data", [])
if not isinstance(channels, list) or not channels:
continue
if len(lines) > 1:
lines.append("")
lines.append(f"服务器:{group_server}")
for item in channels:
if not isinstance(item, dict):
continue
has_channel = True
short_id = item.get("esid") or item.get("asid", "")
lines.extend(
[
f"阵营:{item.get('campName', '')}",
f"频道ID{item.get('sid', '')}",
f"短位ID{short_id}",
f"在线人数:{item.get('users', '')}",
f"频道名:{item.get('snick', '')}",
"",
]
)
if not has_channel:
return_data["msg"] = "未查询到统战歪歪信息"
return return_data
return_data["data"] = "\n".join(lines).rstrip()
except DATA_PROCESSING_ERRORS as e:
logger.error(f"处理统战歪歪数据失败: {e}")
return_data["msg"] = "处理统战歪歪数据失败"
return return_data
return_data["code"] = 200
return return_data
async def dilujilu(self, server: str) -> Dict[str, Any]:
"""的卢记录"""
return_data = self.new_result()
# 1. 构造请求参数
params = {"server": server}
# 2. 调用基础请求
data: Optional[List[Dict[str, Any]]] = await self.request(
"jx3_dilujilu", params=params
)
if not data:
return_data["msg"] = "获取接口信息失败"
return return_data
# 3. 处理返回数据
try:
for item in data:
item["refresh_time"] = datetime.fromtimestamp(
item["refresh_time"]
).strftime("%Y-%m-%d %H:%M:%S")
item["capture_time"] = datetime.fromtimestamp(
item["capture_time"]
).strftime("%Y-%m-%d %H:%M:%S")
item["auction_time"] = datetime.fromtimestamp(
item["auction_time"]
).strftime("%Y-%m-%d %H:%M:%S")
return_data["data"]["list"] = data
except DATA_PROCESSING_ERRORS as e:
logger.error(f"数据处理时出错: {e}")
return_data["msg"] = "处理接口返回信息时出错"
return return_data
# 4. 加载模板
if not await self.attach_template(return_data, "dilujilu.html"):
return return_data
return_data["code"] = 200
return return_data
async def rank_statistical(self, name: str, server: str) -> Dict[str, Any]:
"""各类风云录榜单"""
return_data = self.new_result()
if name in ROLE_RANK_NAMES:
template_name = "rank_role.html"
elif name in TONG_RANK_NAMES:
template_name = "rank_tong.html"
else:
return_data["msg"] = "榜单名称错误"
return return_data
# 1. 构造请求参数
params = {"server": server, "name": name}
# 2. 调用基础请求
data: Optional[Dict[str, Any]] = await self.request(
"jx3_rank_statistical", params=params
)
if not data or not isinstance(data, dict):
return_data["msg"] = "未查询到榜单信息"
return return_data
# 3. 处理返回数据
try:
items = data.get("data", [])
if not isinstance(items, list) or not items:
return_data["msg"] = "未查询到榜单信息"
return return_data
return_data["data"] = {
"items": items,
"server": data.get("server", server),
"rank_name": data.get("name", name),
"update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
}
except DATA_PROCESSING_ERRORS as e:
logger.error(f"数据处理时出错: {e}")
return_data["msg"] = "处理接口返回信息时出错"
return return_data
# 4. 加载模板
if not await self.attach_template(return_data, template_name):
return return_data
return_data["code"] = 200
return return_data