Files
astrbot_plugin_jx3/core/services/faction.py
T
2026-07-26 17:57:44 +08:00

420 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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