from datetime import datetime from typing import Any, Dict, List, Optional from astrbot.api import logger from .base import DATA_PROCESSING_ERRORS, BaseDomainService class AdventureService(BaseDomainService): async def yanhuachaxun(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_yanhuachaxun", params=params ) if not data: return_data["msg"] = "获取接口信息失败" return return_data # 3. 处理返回数据 try: for item in data: if isinstance(item, dict): timestamp = item.get("time") if timestamp and isinstance(timestamp, (int, float)): item["time"] = datetime.fromtimestamp(timestamp).strftime( "%Y-%m-%d %H:%M:%S" ) else: item["time"] = "未知时间" 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, "yanhuan.html"): return return_data return_data["code"] = 200 return return_data async def pianzhi(self, uid: str) -> Dict[str, Any]: """骗子查询""" return_data = self.new_result() # 1. 构造请求参数 params = {"uid": uid} # 2. 调用基础请求 data: Optional[Dict[str, Any]] = await self.request( "jx3_pianzhi", params=params ) if not data: return_data["msg"] = "获取接口信息失败" return return_data # 3. 处理返回数据 try: records = data["records"] if not records: result_msg = "未找到该用户行骗记录,很棒!继续保持!" else: result_msg = "" for record in records: result_msg += ( f"区服:{record['server']} 标签:{record['tieba']}\n\n" ) for item in record["data"]: result_msg += f"标题:{item['title']}\n" result_msg += f"地址:{item['url']}\n" result_msg += f"ID:{item['tid']}\n" result_msg += f"内容:{item['text']}\n" item_time = datetime.fromtimestamp(item["time"]).strftime( "%Y-%m-%d %H:%M:%S" ) result_msg += f"时间:{item_time}\n\n" result_msg += "\n\n" return_data["data"] = result_msg 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 juesheqiyu(self, name: str, server: 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_juesheqiyu", params=params ) if not data: return_data["msg"] = "未找到改角色奇遇信息" return return_data # 3. 处理返回数据 try: return_data["data"]["ptqy"] = [] return_data["data"]["jsqy"] = [] return_data["data"]["cwqy"] = [] for item in data: item["time"] = datetime.fromtimestamp(item["time"]).strftime( "%Y-%m-%d %H:%M:%S" ) if item["level"] == 1: return_data["data"]["ptqy"].append(item) if item["level"] == 2: return_data["data"]["jsqy"].append(item) if item["level"] == 3: return_data["data"]["cwqy"].append(item) 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, "juesheqiyu.html"): return return_data return_data["code"] = 200 return return_data async def weizuoqiyu(self, name: str, server: 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_weizuoqiyu", params=params ) if not data: return_data["msg"] = "未查询到未做奇遇信息" return return_data if not isinstance(data, list): return_data["msg"] = "获取接口信息失败或数据格式错误" return return_data # 3. 处理返回数据 try: return_data["data"]["ptqy"] = [] return_data["data"]["jsqy"] = [] return_data["data"]["name"] = name return_data["data"]["server"] = server for item in data: event_name = item.get("name") if not event_name: continue try: level = int(item.get("level", 0)) except (TypeError, ValueError): continue event_item = {"event": event_name, "time": "未触发"} if level == 1: return_data["data"]["ptqy"].append(event_item) elif level == 2: return_data["data"]["jsqy"].append(event_item) if not return_data["data"]["ptqy"] and not return_data["data"]["jsqy"]: return_data["msg"] = "未查询到未做普通或绝世奇遇" return return_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, "weizuoqiyu.html"): return return_data return_data["code"] = 200 return return_data async def qiyutongji(self, name: str, server: str) -> Dict[str, Any]: """奇遇统计""" return_data = self.new_result() params = {"server": server, "name": name} data_list: Optional[List[Dict[str, Any]]] = await self.request( "jx3_qiyutongji", params=params ) if not data_list or not isinstance(data_list, list): return_data["msg"] = "获取接口信息失败或数据格式错误" return return_data # 格式化时间 try: for item in data_list: item["time"] = datetime.fromtimestamp(item["time"]).strftime( "%Y-%m-%d %H:%M:%S" ) except DATA_PROCESSING_ERRORS as e: logger.error(f"数据处理时出错: {e}") return_data["msg"] = "处理接口返回信息时出错" return return_data # 准备模板渲染数据 try: return_data["data"] = { "items": data_list, "server": server, "update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "qiyuname": name, } except DATA_PROCESSING_ERRORS as e: logger.error(f"模板数据准备失败: {e}") return_data["msg"] = "系统错误:模板渲染数据准备失败" return return_data # 加载模板 if not await self.attach_template(return_data, "qiyuliebiao.html"): return return_data return_data["code"] = 200 return return_data async def jinqiqiyu(self, server: str) -> Dict[str, Any]: """近期奇遇""" return_data = self.new_result() params = {"server": server} data_list: Optional[List[Dict[str, Any]]] = await self.request( "jx3_jinqiqiyu", params=params ) if not data_list or not isinstance(data_list, list): return_data["msg"] = "未查询到近期奇遇信息" return return_data # 格式化时间 try: for item in data_list: event_time = item.get("time") if event_time: try: item["time"] = datetime.fromtimestamp(int(event_time)).strftime( "%Y-%m-%d %H:%M:%S" ) except (TypeError, ValueError, OSError): item["time"] = str(event_time) else: item["time"] = "" except DATA_PROCESSING_ERRORS as e: logger.error(f"数据处理时出错: {e}") return_data["msg"] = "处理接口返回信息时出错" return return_data # 准备模板渲染数据 try: return_data["data"] = { "items": data_list, "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, "jinqiqiyu.html"): return return_data return_data["code"] = 200 return return_data async def qiyuhuizong(self, server: str, num: int = 7) -> Dict[str, Any]: """奇遇汇总""" return_data = self.new_result() if num < 1 or num > 30: return_data["msg"] = "汇总天数需在 1-30 天之间" return return_data params = {"server": server, "num": num} data_list: Optional[List[Dict[str, Any]]] = await self.request( "jx3_qiyuhuizong", params=params ) if not data_list or not isinstance(data_list, list): return_data["msg"] = "未查询到奇遇汇总信息" return return_data # 整理最近一次触发信息 try: for item in data_list: latest = item.get("data") if not isinstance(latest, dict): latest = {} item["latest_name"] = latest.get("name", "") latest_time = latest.get("time") if latest_time: try: item["latest_time"] = datetime.fromtimestamp( int(latest_time) ).strftime("%Y-%m-%d %H:%M:%S") except (TypeError, ValueError, OSError): item["latest_time"] = str(latest_time) else: item["latest_time"] = "" except DATA_PROCESSING_ERRORS as e: logger.error(f"数据处理时出错: {e}") return_data["msg"] = "处理接口返回信息时出错" return return_data # 准备模板渲染数据 try: return_data["data"] = { "items": data_list, "server": server, "num": num, "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, "qiyuhuizong.html"): return return_data return_data["code"] = 200 return return_data async def qiyugonglue(self, name: str) -> Dict[str, Any]: """奇遇攻略""" return_data = self.new_result() # 1. 构造请求参数 params = {"name": name} # 2. 调用基础请求 data: Optional[list[Dict[str, Any]]] = await self.request( "jx3box_qiyugonglue", params=params, out_key="list" ) if not data: return_data["msg"] = "未找到该奇遇" return return_data # 提取dwID dwID = data[0]["dwID"] data1 = await self.request( "jx3box_serendipity_achievement", out_key="", path_params={"dw_id": dwID}, ) if not data1 or not data1.get("achievement_id"): return_data["msg"] = "获取奇遇成就 ID 失败" return return_data # 获取奇遇攻略 data2 = await self.request( "jx3box_achievement_wiki", out_key="data", path_params={"achievement_id": data1["achievement_id"]}, ) if not data2: return_data["msg"] = "获取攻略数据异常" return return_data # 4. 处理数据 try: return_data["data"] = {} content = data2["post"]["content"] return_data["temp"] = content except DATA_PROCESSING_ERRORS: logger.exception("处理返回数据失败") return_data["msg"] = "处理返回数据失败" return return_data return_data["code"] = 200 return return_data