diff --git a/README.md b/README.md index a43d05e..3d378c5 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,18 @@ 帮战记录:帮战 服务器 阵营沙盘:沙盘 服务器 诛恶事件:诛恶 服务器 +【角色名片】 +名片缓存:名片 服务器 角色 +名片历史:全名片 服务器 角色 +随机名片:随机秀 服务器 [门派] [体型] +【奇遇相关】 +奇遇记录:奇遇 服务器 角色 | 查询 服务器 角色 +未触发的:未出 服务器 角色 +奇遇汇总:汇总 服务器 [天数] +近期奇遇:近期 服务器 [数量] +奇遇统计:统计 奇遇 [服务器] [数量] +奇遇攻略:攻略 奇遇 + ## 安装与依赖 diff --git a/core/aijx3_data.py b/core/aijx3_data.py index 3066243..4a8970f 100644 --- a/core/aijx3_data.py +++ b/core/aijx3_data.py @@ -125,29 +125,4 @@ class AIJX3Service: processor=processor, template="" ) - return_data = self._init_return_data() - - # 1. 构造请求参数 - params = {"serverName": server} - - # 2. 调用基础请求 - data: Optional[Dict[str, Any]] = await self._base_request( - "aijx3_shapan", "POST", 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 diff --git a/core/jx3api_data.py b/core/jx3api_data.py index 486d870..484943c 100644 --- a/core/jx3api_data.py +++ b/core/jx3api_data.py @@ -725,6 +725,213 @@ class JX3APIService: ) + async def jueshemingpian(self, server: str, name: str) -> Dict[str, Any]: + """名片缓存""" + async def processor(data: Any, return_data: Dict[str, Any]) -> None: + url = data.get("showAvatar") + if not url: + return_data["msg"] = "未获取到名片图片" + return return_data + + server_name = data.get("serverName", server) + role_name = data.get("roleName", name) + show_like = data.get("showLike", 0) + msg0 = f"{server_name}-{role_name}" + msg1 = f"点赞:{show_like}" + + return_data["data"] = [ + Comp.Plain(msg0), + Comp.Image.fromURL(url), + Comp.Plain(msg1) + ] + + return await self._request_api( + path="/card/cached", + params={"server": server, "name": name, "token": self.token}, + processor=processor, + template="" + ) + + + async def shuijimingpian(self, server:str, force: str, body:str,) -> Dict[str, Any]: + """随机名片""" + async def processor(data: Any, return_data: Dict[str, Any]) -> None: + url = data.get("showAvatar") + if not url: + return_data["msg"] = "未获取到名片图片" + return return_data + + server_name = data.get("serverName") + role_name = data.get("roleName") + msg = f"{server_name}-{role_name}" + + return_data["data"] = [ + Comp.Plain(msg), + Comp.Image.fromURL(url), + ] + + return await self._request_api( + path="/card/random", + params={"server": server, "body": body, "force":force, "token": self.token}, + processor=processor, + template="" + ) + + + async def shuoyoumingpian(self, server: str, name: str) -> Dict[str, Any]: + """名片历史""" + async def processor(data: Any, return_data: Dict[str, Any]) -> None: + chain = [] + for m in data: + status = "当前展示" if m.get("showActive") else "未展示" + msg = f"第{m.get('showIndex')}张 {status}" + url = m.get("showAvatar") + + if not url: + logger.warning(f"第{m.get('showIndex')}张名片缺少图片URL,已跳过") + continue + + chain.extend([ + Comp.Plain(msg), + Comp.Image.fromURL(url), + ]) + + if not chain: + return_data["msg"] = "未获取到有效的名片数据" + return return_data + + return_data["data"] = chain + + return await self._request_api( + path="/card/records", + params={"server": server, "name": name, "token": self.token}, + processor=processor, + template="" + ) + + + async def qiyuhuizong(self, server: str, num: int) -> Dict[str, Any]: + """奇遇汇总""" + async def processor(data: Any, return_data: Dict[str, Any]) -> None: + for item in data: + latest = item.get("last") + item["latest_name"] = latest.get("name") + item["latest_time"] = format_time(latest.get("time")) + + return_data["data"] = { + "items": data, + "server": server, + "num": num, + "update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S") + } + + return await self._request_api( + path="/event/collect", + params={"server": server, "num": num, "token": self.token}, + processor=processor, + template="qiyuhuizong.html" + ) + + + async def weizuoqiyu(self, server: str, name: str, ) -> Dict[str, Any]: + """未出奇遇""" + async def processor(data: Any, return_data: Dict[str, Any]) -> None: + return_data["data"]["ptqy"] = [] + return_data["data"]["jsqy"] = [] + return_data["data"]["name"] = name + return_data["data"]["server"] = server + + for item in data: + try: + level = int(item.get("level", 0)) + except (TypeError, ValueError): + continue + + event_item = { + "event": item.get("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 + + return await self._request_api( + path="/event/missing", + params={"server": server, "name": name, "token": self.token}, + processor=processor, + template="weizuoqiyu.html" + ) + + + async def jinqiqiyu(self, server: str, limit: int) -> Dict[str, Any]: + """近期奇遇""" + async def processor(data: Any, return_data: Dict[str, Any]) -> None: + for item in data: + item["time"] = format_time(item.get("time")) + + return_data["data"] = { + "items": data, + "server": server, + "update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S") + } + + return await self._request_api( + path="/event/recent", + params={"server": server, "limit": limit, "token": self.token}, + processor=processor, + template="jinqiqiyu.html" + ) + + + async def juesheqiyu(self, server: str, name: str, full: int) -> Dict[str, Any]: + """角色奇遇""" + async def processor(data: Any, return_data: Dict[str, Any]) -> None: + 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) + + return await self._request_api( + path="/event/records", + params= {"server": server, "name": name, "full": full, "token": self.token}, + processor=processor, + template="juesheqiyu.html" + ) + + + async def qiyutongji(self, name: str, server: str, limit: int) -> Dict[str, Any]: + """奇遇统计""" + async def processor(data: Any, return_data: Dict[str, Any]) -> None: + for item in data: + item["time"] = format_time(item.get("time")) + + return_data["data"] = { + "items": data, + "server": server, + "update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "qiyuname": name + } + + return await self._request_api( + path="/event/statistics", + params={"name": name, "server": server, "limit": limit, "token": self.token}, + processor=processor, + template="qiyuliebiao.html" + ) @@ -1694,294 +1901,19 @@ class JX3APIService: return return_data - async def juesheqiyu(self, name: str, server: str) -> Dict[str, Any]: - """角色奇遇""" - return_data = self._init_return_data() - - # 1. 构造请求参数 - params = {"server": server, "name": name, "token": self.token} - - # 2. 调用基础请求 - data: Optional[List[Dict[str, Any]]] = await self._base_request( - "jx3_juesheqiyu", "GET", 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 Exception as e: - logger.error(f"处理返回数据失败: {e}") - return_data["msg"] = "处理返回数据失败" - return return_data - - # 4. 加载模板 - try: - return_data["temp"] = await load_template("juesheqiyu.html") - except FileNotFoundError as e: - logger.error(f"加载模板失败: {e}") - return_data["msg"] = "系统错误:模板文件不存在" - return return_data - - return_data["code"] = 200 - - return return_data - async def weizuoqiyu(self, name: str, server: str) -> Dict[str, Any]: - """未做奇遇""" - return_data = self._init_return_data() - - # 1. 构造请求参数 - params = {"server": server, "name": name, "token": self.token} - - # 2. 调用基础请求 - data: Optional[List[Dict[str, Any]]] = await self._base_request( - "jx3_weizuoqiyu", "GET", 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") or item.get("event") - 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 Exception as e: - logger.error(f"处理返回数据失败: {e}") - return_data["msg"] = "处理返回数据失败" - return return_data - - # 4. 加载模板 - try: - return_data["temp"] = await load_template("weizuoqiyu.html") - except FileNotFoundError as e: - logger.error(f"加载模板失败: {e}") - return_data["msg"] = "系统错误:模板文件不存在" - return return_data - - return_data["code"] = 200 - - return return_data - async def qiyutongji(self, name: str, server: str) -> Dict[str, Any]: - """奇遇统计""" - return_data = self._init_return_data() - - params = {"server": server, "name": name, "token": self.token} - - data_list: Optional[List[Dict[str, Any]]] = await self._base_request("jx3_qiyutongji", "GET", 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 Exception 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 Exception as e: - logger.error(f"模板数据准备失败: {e}") - return_data["msg"] = "系统错误:模板渲染数据准备失败" - return return_data - - # 加载模板 - try: - return_data["temp"] = await load_template("qiyuliebiao.html") - except FileNotFoundError as e: - logger.error(f"加载模板失败: {e}") - return_data["msg"] = "系统错误:模板文件不存在" - return return_data - - return_data["code"] = 200 - - return return_data - async def jinqiqiyu(self, server: str) -> Dict[str, Any]: - """近期奇遇""" - return_data = self._init_return_data() - - params = {"server": server, "token": self.token} - - data_list: Optional[List[Dict[str, Any]]] = await self._base_request( - "jx3_jinqiqiyu", "GET", 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 Exception 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 Exception as e: - logger.error(f"模板数据准备失败: {e}") - return_data["msg"] = "系统错误:模板渲染数据准备失败" - return return_data - - # 加载模板 - try: - return_data["temp"] = await load_template("jinqiqiyu.html") - except FileNotFoundError as e: - logger.error(f"加载模板失败: {e}") - return_data["msg"] = "系统错误:模板文件不存在" - 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._init_return_data() - if num < 1 or num > 30: - return_data["msg"] = "汇总天数需在 1-30 天之间" - return return_data - - params = {"server": server, "num": num, "token": self.token} - - data_list: Optional[List[Dict[str, Any]]] = await self._base_request( - "jx3_qiyuhuizong", "GET", 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 Exception 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 Exception as e: - logger.error(f"模板数据准备失败: {e}") - return_data["msg"] = "系统错误:模板渲染数据准备失败" - return return_data - - # 加载模板 - try: - return_data["temp"] = await load_template("qiyuhuizong.html") - except FileNotFoundError as e: - logger.error(f"加载模板失败: {e}") - return_data["msg"] = "系统错误:模板文件不存在" - return return_data - - return_data["code"] = 200 - - return return_data @@ -2436,46 +2368,7 @@ class JX3APIService: return return_data - async def jueshemingpian(self, server: str, name: str) -> Dict[str, Any]: - """单张名片""" - return_data = self._init_return_data() - # 1. 构造请求参数 - params = {"server": server, "name": name, "token": self.token} - - # 2. 调用基础请求 - data: Optional[Dict[str, Any]] = await self._base_request( - "jx3_jieshemingpian", "GET", params=params - ) - - if not data or not isinstance(data, dict): - return_data["msg"] = "未找到该角色名片" - return return_data - - # 3. 处理返回数据 - try: - url = data.get("showAvatar") - if not url: - return_data["msg"] = "未获取到名片图片" - return return_data - - server_name = data.get("serverName", server) - role_name = data.get("roleName", name) - show_like = data.get("showLike", 0) - msg = f"{server_name}-{role_name} 点赞:{show_like}" - - return_data["data"] = [ - Comp.Plain(msg), - Comp.Image.fromURL(url), - ] - except Exception as e: - logger.error(f"数据处理时出错: {e}") - return_data["msg"] = "处理接口返回信息时出错" - return return_data - - return_data["code"] = 200 - - return return_data async def jingnai(self, name: str, server: str) -> Dict[str, Any]: @@ -2558,76 +2451,10 @@ class JX3APIService: return return_data - async def shuoyoumingpian(self, server: str, name: str) -> Dict[str, Any]: - """所有名片""" - return_data = self._init_return_data() - - # 1. 构造请求参数 - params = {"server": server, "name": name, "token": self.token} - - # 2. 调用基础请求 - data: Optional[list[Dict[str, Any]]] = await self._base_request( - "jx3_allmingpian", "GET", params=params - ) - - if not data: - return_data["msg"] = "未找到该角色" - return return_data - - # 3. 处理返回数据 - try: - chain = [] - for m in data: - status = "已启用" if m.get("showActive") else "未启用" - msg = f"第{m.get('showIndex')}张 {status}" - url = m.get("showAvatar") - - if not url: - logger.warning(f"第{m.get('showIndex')}张名片缺少图片URL,已跳过") - continue - - chain.extend([ - Comp.Plain(msg), - Comp.Image.fromURL(url), - ]) - - if not chain: - return_data["msg"] = "未获取到有效的名片数据" - return return_data - - except Exception as e: - logger.error(f"数据处理时出错: {e}") - return_data["msg"] = "处理接口返回信息时出错" - return return_data - - return_data["data"] = chain - return_data["code"] = 200 - - return return_data - async def shuijimingpian(self, force: str, body:str, server:str) -> Dict[str, Any]: - """随机名片""" - return_data = self._init_return_data() - # 1. 构造请求参数 - params = {"server": server, "body": body, "force":force, "token": self.token} - - # 2. 调用基础请求 - data: Optional[Dict[str, Any]] = await self._base_request( - "jx3_shuijimingpian", "GET", params=params - ) - - if not data: - return_data["msg"] = "获取接口信息失败" - return return_data - - # 3. 处理返回数据 (直接提取图片 URL) - return_data["data"] = data['showAvatar'] - return_data["code"] = 200 - - return return_data @@ -2901,50 +2728,7 @@ class JX3APIService: return return_data - async def qiyugonglue(self, name: str) -> Dict[str, Any]: - """奇遇攻略""" - return_data = self._init_return_data() - - # 1. 构造请求参数 - params = {"name": name} - - # 2. 调用基础请求 - data: Optional[list[Dict[str, Any]]] = await self._base_request( - "jx3box_qiyugonglue", "GET", params=params, out_key="list" - ) - - if not data: - return_data["msg"] = "未找到该奇遇" - return return_data - - # 提取dwID - dwID = data[0]["dwID"] - url = f"https://node.jx3box.com/serendipity/{dwID}/achievement" - logger.debug(f"获取ID接口地址:{url}") - data1 = await self._api.get(url) - url1 = f"https://cms.jx3box.com/api/cms/wiki/post/type/achievement/source/{data1['achievement_id']}" - logger.debug(f"获取攻略接口地址:{url1}") - - # 获取奇遇攻略 - data2 = await self._api.get(url1, out_key="data") - if not data2: - return_data["msg"] = "获取攻略数据异常" - return return_data - - # 4. 处理数据 - try: - return_data["data"] = {} - content = data2["post"]["content"] - return_data["temp"] = content - except Exception as e: - logger.exception("处理返回数据失败") - return_data["msg"] = "处理返回数据失败" - return return_data - - return_data["code"] = 200 - - return return_data async def hong1(self, name: str) -> Dict[str, Any]: diff --git a/core/jx3box_data.py b/core/jx3box_data.py new file mode 100644 index 0000000..ecb23ec --- /dev/null +++ b/core/jx3box_data.py @@ -0,0 +1,85 @@ +import json +import html +import re +from datetime import datetime, timedelta +from typing import Dict, Any, Optional, List, Union +from inspect import isawaitable +from typing import Any, Awaitable, Callable, Dict, Optional + +from astrbot.api import logger +from astrbot.api import AstrBotConfig +import astrbot.api.message_components as Comp + +from .request import APIClient +from .sqlite import AsyncSQLiteDB +from .fun_basic import load_template,gold_to_parts,week_to_num,compare_date_str,format_time,format_remaining + + +class JX3BOXService: + def __init__(self, config: AstrBotConfig, sqlite: AsyncSQLiteDB, cache_sqlite: Optional[AsyncSQLiteDB] = None): + # 实例化 API Client + self._api: APIClient = APIClient() + # 引用插件配置文件 + self._config = config + # 引用sqlite + self._sql_db = sqlite + self._cache_db = cache_sqlite or sqlite + + + + async def close(self): + """释放底层 APIClient 资源""" + if self._api: + await self._api.close() + + + def _init_return_data(self) -> Dict[str, Any]: + """初始化标准的返回数据结构""" + return { + "code": 0, + "msg": "功能函数未执行", + "data": {}, + "temp": "", + "icons": {} + } + + + async def qiyugonglue(self, name: str) -> Dict[str, Any]: + """奇遇攻略""" + return_data = self._init_return_data() + + # 1. 调用基础请求 + api_url = "https://node.jx3box.com/serendipities" + data = await self._api.get(api_url, params={"name": name}, out_key="list") + if not data: + return_data["msg"] = "未找到该奇遇" + return return_data + + # 提取dwID + dwID = data[0]["dwID"] + url = f"https://node.jx3box.com/serendipity/{dwID}/achievement" + logger.debug(f"获取ID接口地址:{url}") + + data1 = await self._api.get(url) + url1 = f"https://cms.jx3box.com/api/cms/wiki/post/type/achievement/source/{data1['achievement_id']}" + logger.debug(f"获取攻略接口地址:{url1}") + + # 获取奇遇攻略 + data2 = await self._api.get(url1, out_key="data") + if not data2: + return_data["msg"] = "获取攻略数据异常" + return return_data + + # 4. 处理数据 + try: + return_data["data"] = {} + content = data2["post"]["content"] + return_data["temp"] = content + except Exception as e: + logger.exception("处理返回数据失败") + return_data["msg"] = "处理返回数据失败" + return return_data + + return_data["code"] = 200 + + return return_data diff --git a/core/message.py b/core/message.py index 6f53ae5..348f652 100644 --- a/core/message.py +++ b/core/message.py @@ -8,6 +8,7 @@ from astrbot.core.utils.session_waiter import ( from .jx3api_data import JX3APIService from .aijx3_data import AIJX3Service +from .jx3box_data import JX3BOXService from .async_task import AsyncTask from .bilei_data import BiLeidata @@ -37,10 +38,19 @@ class MessageBuilder: "18:剑侠录总览" ) - def __init__(self, server: str, jx3api: JX3APIService, aijx3: AIJX3Service,bilei: BiLeidata, jx3at: AsyncTask, icons: dict[str, dict[str, str]]): + def __init__(self, + server: str, + jx3api: JX3APIService, + aijx3: AIJX3Service, + jx3box: JX3BOXService, + bilei: BiLeidata, + jx3at: AsyncTask, + icons: dict[str, dict[str, str]] + ): self.server = server self.jx3api = jx3api self.aijx3 = aijx3 + self.jx3box = jx3box self.bilei = bilei self.jx3at = jx3at self.icons = icons @@ -449,6 +459,45 @@ class MessageBuilder: """ 诛恶事件 服务器""" return await self.T2I_image_msg(event, lambda: self.jx3api.zhueevent(server,20)) + async def jueshemingpian(self, event: AstrMessageEvent, server: str , name: str , ): + """ 名片 服务器 角色 """ + return await self.plain_chain(event, lambda: self.jx3api.jueshemingpian(server, name)) + + async def shuoyoumingpian(self, event: AstrMessageEvent, server: str, name: str, ): + """ 全名片 服务器 角色 """ + return await self.plain_chain(event, lambda: self.jx3api.shuoyoumingpian(server,name)) + + async def shuijimingpian(self, event: AstrMessageEvent,server: str, force: str = "", body: str = "", ): + """ 随机秀 服务器 门派 体型 """ + return await self.plain_chain(event, lambda: self.jx3api.shuijimingpian(server,force,body)) + + async def qiyuhuizong(self, event: AstrMessageEvent,server: str, num: str = "7" ): + """ 汇总 服务器 天数 """ + return await self.T2I_image_msg(event, lambda: self.jx3api.qiyuhuizong(server, num)) + + async def weizuoqiyu(self, event: AstrMessageEvent,server: str, name: str, ): + """ 未出 服务器 角色 """ + return await self.T2I_image_msg(event, lambda: self.jx3api.weizuoqiyu(server,name)) + + async def jinqiqiyu(self, event: AstrMessageEvent,server: str, limit: int = 20): + """ 近期 服务器 数量""" + return await self.T2I_image_msg(event, lambda: self.jx3api.jinqiqiyu(server,limit)) + + async def juesheqiyu(self, event: AstrMessageEvent, server: str, name: str): + """ 奇遇 服务器 角色 """ + return await self.T2I_image_msg(event, lambda: self.jx3api.juesheqiyu(server,name, 0)) + + async def qiyutongji(self, event: AstrMessageEvent,adventureName: str, server: str = "",limit: int = 20): + """ 统计 奇遇 服务器 数量""" + return await self.T2I_image_msg(event, lambda: self.jx3api.qiyutongji(adventureName,server,limit)) + + async def qiyugonglue(self, event: AstrMessageEvent,name: str): + """ 攻略 奇遇""" + return await self.T2I_image_msg(event, lambda: self.jx3box.qiyugonglue(name)) + + + + @@ -593,37 +642,18 @@ class MessageBuilder: return await self.plain_msg(event, lambda: self.jx3api.pianzhi(qq)) - async def juesheqiyu(self, event: AstrMessageEvent,name: str = "飞翔大野猪", server: str = ""): - """ 奇遇 角色名称 服务器""" - return await self.T2I_image_msg(event, lambda: self.jx3api.juesheqiyu(name, self.serverdefault(server))) + - async def weizuoqiyu(self, event: AstrMessageEvent,name: str = "飞翔大野猪", server: str = ""): - """ 未做奇遇 角色名称 服务器""" - return await self.T2I_image_msg(event, lambda: self.jx3api.weizuoqiyu(name, self.serverdefault(server))) + - async def qiyutongji(self, event: AstrMessageEvent,adventureName: str = "阴阳两界", server: str = ""): - """ 奇遇统计 奇遇名称 服务器""" - return await self.T2I_image_msg(event, lambda: self.jx3api.qiyutongji(adventureName,self.serverdefault(server))) - async def jinqiqiyu(self, event: AstrMessageEvent,server: str = ""): - """ 近期奇遇 服务器""" - return await self.T2I_image_msg(event, lambda: self.jx3api.jinqiqiyu(self.serverdefault(server))) - async def qiyuhuizong(self, event: AstrMessageEvent,num_or_server: str = "7", server: str = ""): - """ 奇遇汇总 天数 服务器""" - num = 7 - target_server = server - if str(num_or_server).isdigit(): - num = int(num_or_server) - else: - target_server = num_or_server - return await self.T2I_image_msg(event, lambda: self.jx3api.qiyuhuizong(self.serverdefault(target_server), num)) @@ -653,9 +683,7 @@ class MessageBuilder: return await self.plain_msg(event, lambda: self.jx3api.jueshe(name, self.serverdefault(server))) - async def jueshemingpian(self, event: AstrMessageEvent, name: str = "飞翔大野猪", server: str = ""): - """ 名片 角色 服务器""" - return await self.plain_chain(event, lambda: self.jx3api.jueshemingpian(self.serverdefault(server), name)) + async def jingnai(self, event: AstrMessageEvent, name: str = "飞翔大野猪", server: str = ""): @@ -663,14 +691,10 @@ class MessageBuilder: return await self.T2I_image_msg(event, lambda: self.jx3api.jingnai(name, self.serverdefault(server))) - async def shuoyoumingpian(self, event: AstrMessageEvent, name: str = "飞翔大野猪", server: str = ""): - """ 所有名片 角色 服务器""" - return await self.plain_chain(event, lambda: self.jx3api.shuoyoumingpian( self.serverdefault(server),name)) - async def shuijimingpian(self, event: AstrMessageEvent,force: str = "万花", body: str = "萝莉", server: str = ""): - """ 随机名片 职业 体型 服务器""" - return await self.image_msg(event, lambda: self.jx3api.shuijimingpian(force,body, self.serverdefault(server))) + + @@ -718,9 +742,7 @@ class MessageBuilder: return await self.plain_msg(event, lambda: self.jx3api.bagua(name)) - async def qiyugonglue(self, event: AstrMessageEvent,name: str): - """ 奇遇攻略 奇遇名称""" - return await self.T2I_image_msg(event, lambda: self.jx3api.qiyugonglue(name)) + async def hong(self, event: AstrMessageEvent,name: str = "易筋经"): diff --git a/main.py b/main.py index 99ebafc..f907988 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,7 @@ from astrbot.api import AstrBotConfig from .core.sqlite import AsyncSQLiteDB from .core.jx3api_data import JX3APIService from .core.aijx3_data import AIJX3Service +from .core.jx3box_data import JX3BOXService from .core.async_task import AsyncTask from .core.bilei_data import BiLeidata from .core.message import MessageBuilder @@ -90,6 +91,9 @@ class Jx3ApiPlugin(Star): if self.aijx3: await self.aijx3.close() + if self.jx3box: + await self.jx3box.close() + if self.local_sql_db: await self.local_sql_db.close() @@ -149,8 +153,9 @@ class Jx3ApiPlugin(Star): self.bilei = BiLeidata(self.local_sql_db) self.jx3api = JX3APIService(self.conf, self.plugin_sql_db, self.local_sql_db) self.aijx3 = AIJX3Service(self.conf, self.plugin_sql_db, self.local_sql_db) + self.jx3box = JX3BOXService(self.conf, self.plugin_sql_db, self.local_sql_db) self.jx3at = AsyncTask(cast(Context, self.context), self.conf, self.jx3api, self.local_sql_db) - self.jx3cmd = MessageBuilder(self.server, self.jx3api, self.aijx3, self.bilei, self.jx3at, self.icons) + self.jx3cmd = MessageBuilder(self.server, self.jx3api, self.aijx3, self.jx3box, self.bilei, self.jx3at, self.icons) async def init_bilei_data(self): @@ -245,6 +250,16 @@ class Jx3ApiPlugin(Star): "帮战": self. jx3cmd.bangzhanjilu, "沙盘": self. jx3cmd.shapan, "诛恶": self. jx3cmd.zhueevent, + "名片": self. jx3cmd.jueshemingpian, + "全名片": self. jx3cmd.shuoyoumingpian, + "随机秀": self. jx3cmd.shuijimingpian, + "奇遇": self. jx3cmd.juesheqiyu, + "查询": self. jx3cmd.juesheqiyu, + "未出": self. jx3cmd.weizuoqiyu, + "汇总": self. jx3cmd.qiyuhuizong, + "近期": self. jx3cmd.jinqiqiyu, + "统计": self. jx3cmd.qiyutongji, + "攻略": self. jx3cmd.qiyugonglue, "科举": self. jx3cmd.keju, @@ -268,7 +283,7 @@ class Jx3ApiPlugin(Star): "资历": self. jx3cmd.zili, "解密": self. jx3cmd.jiemi, - "攻略": self. jx3cmd.qiyugonglue, + "宏": self. jx3cmd.hong, "配装": self. jx3cmd.peizhuang, "百战": self. jx3cmd.baizhan, @@ -282,21 +297,21 @@ class Jx3ApiPlugin(Star): "骗子": self. jx3cmd.pianzhi, - "奇遇": self. jx3cmd.juesheqiyu, - "未做奇遇": self. jx3cmd.weizuoqiyu, - "奇遇统计": self. jx3cmd.qiyutongji, - "近期奇遇": self. jx3cmd.jinqiqiyu, - "奇遇汇总": self. jx3cmd.qiyuhuizong, + + + + + "招募": self. jx3cmd.tuanduizhaomu, "拜师": self. jx3cmd.baishi, "收徒": self. jx3cmd.shoutu, "角色": self. jx3cmd.jueshe, - "名片": self. jx3cmd.jueshemingpian, + "精耐": self. jx3cmd.jingnai, - "所有名片": self. jx3cmd.shuoyoumingpian, - "随机名片": self. jx3cmd.shuijimingpian, + +