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

425 lines
14 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
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