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