11
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user