修改8
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
## 更新记录
|
## 更新记录
|
||||||
|
|
||||||
|
### version: 3.0:
|
||||||
|
|
||||||
|
大部分功能重写,还有部分未写完。
|
||||||
|
|
||||||
### version: 2.7:
|
### version: 2.7:
|
||||||
|
|
||||||
重构 **交易行 物品名称 [服务器]** 指令,改为免令牌图片查询。
|
重构 **交易行 物品名称 [服务器]** 指令,改为免令牌图片查询。
|
||||||
|
|||||||
@@ -60,7 +60,29 @@
|
|||||||
资历榜单:资历排行 [服务器] [门派]
|
资历榜单:资历排行 [服务器] [门派]
|
||||||
技能信息:技能 心法
|
技能信息:技能 心法
|
||||||
奇穴信息:奇穴 心法
|
奇穴信息:奇穴 心法
|
||||||
|
【游戏社区】
|
||||||
|
角色聊天;聊天 服务器 角色 [条数] [页数]
|
||||||
|
统战歪歪:统战 [服务器]
|
||||||
|
家园鲜花:花价 服务器 [名称] [地图]
|
||||||
|
家园装饰:装饰 名称
|
||||||
|
器物图谱:器物 地图名称
|
||||||
|
师徒列表:拜师 服务器 [关键词] | 收徒 服务器 [关键词]
|
||||||
|
维护公告:维护 [数量]
|
||||||
|
新闻资讯:新闻 [数量]
|
||||||
|
团队招募:招募 服务器 [副本] | 团长 服务器 [名称] | 团牌 服务器 [内容]
|
||||||
|
骚话语录:答案之书 | 舔狗语录 | 疯狂星期四 | 彩虹屁 | 毒鸡汤 | 朋友圈 | 喝什么 | 吃什么 | 骚话 | 渣男语录
|
||||||
|
【百度贴吧】
|
||||||
|
外观记录:贴吧物价 名称 [服务器] [数量]
|
||||||
|
百度贴吧:818 [服务器] [数量]
|
||||||
|
【系统工具】
|
||||||
|
科举答案:科举 题目 [条数]
|
||||||
|
大区状态:区服 | 开服 服务器
|
||||||
|
技改记录:技改
|
||||||
|
秘境方位:解密
|
||||||
|
掉落统计:掉落 物品 [服务器] [数量]
|
||||||
|
【魔盒数据】
|
||||||
|
资历查询:资历 角色 服务器
|
||||||
|
魔盒宏:交易行 物品名称 服务器
|
||||||
|
|
||||||
|
|
||||||
## 安装与依赖
|
## 安装与依赖
|
||||||
|
|||||||
+393
-1350
File diff suppressed because it is too large
Load Diff
+523
-2
@@ -14,6 +14,29 @@ from .request import APIClient
|
|||||||
from .sqlite import AsyncSQLiteDB
|
from .sqlite import AsyncSQLiteDB
|
||||||
from .fun_basic import load_template,gold_to_parts,week_to_num,compare_date_str,format_time,format_remaining
|
from .fun_basic import load_template,gold_to_parts,week_to_num,compare_date_str,format_time,format_remaining
|
||||||
|
|
||||||
|
ACHIEVEMENT_CHOICES = [
|
||||||
|
(0, None, "资历总览"),
|
||||||
|
(1, "1", "杂闻总览"),
|
||||||
|
(2, "2", "武学总览"),
|
||||||
|
(3, "3", "修为总览"),
|
||||||
|
(4, "4", "装备总览"),
|
||||||
|
(5, "5", "技艺总览"),
|
||||||
|
(6, "6", "阅读总览"),
|
||||||
|
(7, "7", "任务总览"),
|
||||||
|
(8, "8", "足迹总览"),
|
||||||
|
(9, "9", "战斗总览"),
|
||||||
|
(10, "10", "声望总览"),
|
||||||
|
(11, "11", "秘境总览"),
|
||||||
|
(12, "12", "帮会总览"),
|
||||||
|
(13, "13", "阵营总览"),
|
||||||
|
(14, "15", "节日总览"),
|
||||||
|
(15, "16", "活动总览"),
|
||||||
|
(16, "17", "风雨江湖路总览"),
|
||||||
|
(17, "40", "家园总览"),
|
||||||
|
(18, "41", "剑侠录总览"),
|
||||||
|
]
|
||||||
|
|
||||||
|
ACHIEVEMENT_CHOICE_MAP = {index: (menu_id, title) for index, menu_id, title in ACHIEVEMENT_CHOICES}
|
||||||
|
|
||||||
class JX3BOXService:
|
class JX3BOXService:
|
||||||
def __init__(self, config: AstrBotConfig, sqlite: AsyncSQLiteDB, cache_sqlite: Optional[AsyncSQLiteDB] = None):
|
def __init__(self, config: AstrBotConfig, sqlite: AsyncSQLiteDB, cache_sqlite: Optional[AsyncSQLiteDB] = None):
|
||||||
@@ -25,7 +48,7 @@ class JX3BOXService:
|
|||||||
self._sql_db = sqlite
|
self._sql_db = sqlite
|
||||||
self._cache_db = cache_sqlite or sqlite
|
self._cache_db = cache_sqlite or sqlite
|
||||||
|
|
||||||
|
self.token = self._config.get("jx3api_token", "")
|
||||||
|
|
||||||
async def close(self):
|
async def close(self):
|
||||||
"""释放底层 APIClient 资源"""
|
"""释放底层 APIClient 资源"""
|
||||||
@@ -143,4 +166,502 @@ class JX3BOXService:
|
|||||||
|
|
||||||
return_data["code"] = 200
|
return_data["code"] = 200
|
||||||
|
|
||||||
return return_data
|
return return_data
|
||||||
|
|
||||||
|
|
||||||
|
async def hong1(self, name: str) -> Dict[str, Any]:
|
||||||
|
"""宏 心法"""
|
||||||
|
return_data = self._init_return_data()
|
||||||
|
|
||||||
|
# 数据库查询数据
|
||||||
|
result = await self._sql_db.select_one(
|
||||||
|
"kungfu",
|
||||||
|
"name=? OR name1=? OR name2=? OR name3=? OR name4=? OR name5=?",
|
||||||
|
(name, name, name, name, name, name)
|
||||||
|
)
|
||||||
|
|
||||||
|
if result is None:
|
||||||
|
return_data["msg"] = "未找到该心法"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
kungfu = result.get("name", None)
|
||||||
|
if kungfu is None:
|
||||||
|
return_data["msg"] = "未找到该心法"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
logger.debug(f"查询到数据:{kungfu}")
|
||||||
|
|
||||||
|
# 1. 构造请求参数
|
||||||
|
params = {"subtype": kungfu}
|
||||||
|
|
||||||
|
# 2. 调用基础请求
|
||||||
|
api_url = "https://cms.jx3box.com/api/cms/posts"
|
||||||
|
data: Optional[Dict[str, Any]] = await self._api.get(api_url, params=params, out_key="data")
|
||||||
|
|
||||||
|
if not data:
|
||||||
|
return_data["msg"] = "未找到该心法一键宏"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
# 提取ID
|
||||||
|
pid_list = [0]
|
||||||
|
msg = "按照热度排列\n"
|
||||||
|
n = 1
|
||||||
|
try:
|
||||||
|
for m in data.get('list',[]):
|
||||||
|
msg += f"{n}、{m['author']}\t{m['post_title']}\n"
|
||||||
|
pid_list.append(m["ID"])
|
||||||
|
n += 1
|
||||||
|
|
||||||
|
return_data["msg"] = msg
|
||||||
|
return_data["data"]["list"] = pid_list
|
||||||
|
return_data["data"]["num"] = n
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception("处理返回数据失败")
|
||||||
|
return_data["msg"] = "处理返回数据失败"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
return_data["code"] = 200
|
||||||
|
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
|
||||||
|
async def hong2(self, pid: str) -> Dict[str, Any]:
|
||||||
|
"""宏 心法"""
|
||||||
|
return_data = self._init_return_data()
|
||||||
|
|
||||||
|
url = f"https://cms.jx3box.com/api/cms/post/{pid}"
|
||||||
|
logger.debug(f"获取宏接口地址:{url}")
|
||||||
|
|
||||||
|
data = await self._api.get(url, out_key="data")
|
||||||
|
|
||||||
|
if not isinstance(data, dict):
|
||||||
|
return_data["msg"] = "获取宏数据异常"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 文章正文
|
||||||
|
return_data["temp"] = data.get("post_content", "")
|
||||||
|
|
||||||
|
# 安全获取宏数据,避免 KeyError
|
||||||
|
macro_list = data.get("post_meta", {}).get("data", [])
|
||||||
|
|
||||||
|
msg = ""
|
||||||
|
|
||||||
|
for m in macro_list:
|
||||||
|
msg += f"【宏名称】\n{m.get('name', '')}\n"
|
||||||
|
msg += f"【使用说明】\n{m.get('desc', '')}\n"
|
||||||
|
msg += f"【宏脚本】\n{m.get('macro', '')}\n\n"
|
||||||
|
|
||||||
|
# 没有宏数据时返回文章信息
|
||||||
|
if not msg:
|
||||||
|
msg = (
|
||||||
|
f"标题:{data.get('post_title', '')}\n"
|
||||||
|
f"作者:{data.get('author', '')}\n"
|
||||||
|
"该帖子没有宏数据"
|
||||||
|
)
|
||||||
|
|
||||||
|
return_data["data"] = msg
|
||||||
|
return_data["code"] = 200
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
logger.exception("处理返回数据失败")
|
||||||
|
return_data["msg"] = "处理返回数据失败"
|
||||||
|
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
|
||||||
|
async def _load_achievement_cache(self, key: str) -> tuple[Optional[Any], bool]:
|
||||||
|
"""读取资历基础数据缓存,返回数据和是否已过期"""
|
||||||
|
try:
|
||||||
|
row = await self._cache_db.select_one("achievement_cache", "key=?", (key,))
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"读取资历缓存失败: {e}")
|
||||||
|
return None, True
|
||||||
|
|
||||||
|
if not row:
|
||||||
|
return None, True
|
||||||
|
|
||||||
|
try:
|
||||||
|
payload = json.loads(row.get("content", "{}"))
|
||||||
|
updated_at = datetime.strptime(row.get("updated_at", ""), "%Y-%m-%d %H:%M:%S")
|
||||||
|
expired = datetime.now() - updated_at > timedelta(days=30)
|
||||||
|
return payload, expired
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"解析资历缓存失败: {e}")
|
||||||
|
return None, True
|
||||||
|
|
||||||
|
|
||||||
|
async def _save_achievement_cache(self, key: str, payload: Any):
|
||||||
|
"""写入资历基础数据缓存"""
|
||||||
|
try:
|
||||||
|
await self._cache_db.execute(
|
||||||
|
"""
|
||||||
|
INSERT INTO achievement_cache (key, content, updated_at)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
ON CONFLICT(key) DO UPDATE SET
|
||||||
|
content=excluded.content,
|
||||||
|
updated_at=excluded.updated_at
|
||||||
|
""",
|
||||||
|
(
|
||||||
|
key,
|
||||||
|
json.dumps(payload, ensure_ascii=False),
|
||||||
|
datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"写入资历缓存失败: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
async def _get_achievement_base_data(self, cache_key: str, config_key: str) -> Optional[Dict[str, Any]]:
|
||||||
|
"""获取资历菜单或点数数据,优先使用未过期缓存"""
|
||||||
|
cached, expired = await self._load_achievement_cache(cache_key)
|
||||||
|
if cached and not expired:
|
||||||
|
return cached
|
||||||
|
|
||||||
|
data: Optional[Dict[str, Any]] = await self._base_request(config_key, "GET")
|
||||||
|
if data and isinstance(data, dict):
|
||||||
|
await self._save_achievement_cache(cache_key, data)
|
||||||
|
return data
|
||||||
|
|
||||||
|
if cached:
|
||||||
|
logger.warning(f"资历基础数据接口失败,使用旧缓存: {cache_key}")
|
||||||
|
return cached
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
async def _get_trade_item_groups(self) -> Optional[List[Dict[str, Any]]]:
|
||||||
|
"""获取交易行物品库,优先使用未过期缓存"""
|
||||||
|
cache_key = "trade_item_groups"
|
||||||
|
cached, expired = await self._load_achievement_cache(cache_key)
|
||||||
|
if isinstance(cached, list) and not expired:
|
||||||
|
return cached
|
||||||
|
|
||||||
|
|
||||||
|
api_url = "https://cms.jx3box.com/api/cms/pvx/item/group"
|
||||||
|
data = await self._api.get(api_url, params={"client":"std"}, out_key="data")
|
||||||
|
if isinstance(data, list) and data:
|
||||||
|
await self._save_achievement_cache(cache_key, data)
|
||||||
|
return data
|
||||||
|
|
||||||
|
if isinstance(cached, list) and cached:
|
||||||
|
logger.warning("交易行物品库接口失败,使用旧缓存")
|
||||||
|
return cached
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _flatten_trade_items(self, groups: List[Dict[str, Any]]) -> list[Dict[str, Any]]:
|
||||||
|
"""从交易行物品分组中提取可查询物品"""
|
||||||
|
items = []
|
||||||
|
for group in groups:
|
||||||
|
if not isinstance(group, dict):
|
||||||
|
continue
|
||||||
|
for item in group.get("items", []) or []:
|
||||||
|
if not isinstance(item, dict):
|
||||||
|
continue
|
||||||
|
item_id = item.get("item_id")
|
||||||
|
label = item.get("label")
|
||||||
|
if not item_id or not label:
|
||||||
|
continue
|
||||||
|
items.append(
|
||||||
|
{
|
||||||
|
"item_id": str(item_id),
|
||||||
|
"label": str(label),
|
||||||
|
"icon": str(item.get("icon") or ""),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return items
|
||||||
|
|
||||||
|
|
||||||
|
def _match_trade_items(self, items: list[Dict[str, Any]], keyword: str, limit: int = 50) -> list[Dict[str, Any]]:
|
||||||
|
"""按物品名模糊匹配交易行物品"""
|
||||||
|
keyword = (keyword or "").strip()
|
||||||
|
if not keyword:
|
||||||
|
return []
|
||||||
|
|
||||||
|
matched = []
|
||||||
|
seen = set()
|
||||||
|
for item in items:
|
||||||
|
label = item.get("label", "")
|
||||||
|
item_id = item.get("item_id", "")
|
||||||
|
if keyword not in label or item_id in seen:
|
||||||
|
continue
|
||||||
|
seen.add(item_id)
|
||||||
|
if label == keyword:
|
||||||
|
rank = 0
|
||||||
|
elif label.startswith(keyword):
|
||||||
|
rank = 1
|
||||||
|
else:
|
||||||
|
rank = 2
|
||||||
|
matched.append((rank, len(label), label, item))
|
||||||
|
|
||||||
|
matched.sort(key=lambda row: (row[0], row[1], row[2]))
|
||||||
|
return [row[3] for row in matched[:limit]]
|
||||||
|
|
||||||
|
|
||||||
|
def _flatten_achievement_ids(self, values: Any) -> list[int]:
|
||||||
|
"""展开菜单中的单个资历 ID 和数组资历 ID"""
|
||||||
|
result = []
|
||||||
|
|
||||||
|
if isinstance(values, list):
|
||||||
|
for item in values:
|
||||||
|
result.extend(self._flatten_achievement_ids(item))
|
||||||
|
return result
|
||||||
|
|
||||||
|
try:
|
||||||
|
result.append(int(values))
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _category_achievement_ids(self, category: Dict[str, Any]) -> list[int]:
|
||||||
|
"""提取分类及其子分类包含的资历 ID"""
|
||||||
|
ids = self._flatten_achievement_ids(category.get("achievements", []))
|
||||||
|
for child in category.get("children", []) or []:
|
||||||
|
if isinstance(child, dict):
|
||||||
|
ids.extend(self._flatten_achievement_ids(child.get("achievements", [])))
|
||||||
|
return ids
|
||||||
|
|
||||||
|
|
||||||
|
def _build_achievement_progress(
|
||||||
|
self,
|
||||||
|
name: str,
|
||||||
|
achievement_ids: list[int],
|
||||||
|
point_map: Dict[str, Any],
|
||||||
|
completed_ids: set[int],
|
||||||
|
) -> Dict[str, Any]:
|
||||||
|
"""按资历点数计算完成进度"""
|
||||||
|
unique_ids = set(achievement_ids)
|
||||||
|
total_points = 0
|
||||||
|
completed_points = 0
|
||||||
|
completed_count = 0
|
||||||
|
|
||||||
|
for achievement_id in unique_ids:
|
||||||
|
try:
|
||||||
|
point = int(point_map.get(str(achievement_id), 0) or 0)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
point = 0
|
||||||
|
|
||||||
|
total_points += point
|
||||||
|
if achievement_id in completed_ids:
|
||||||
|
completed_count += 1
|
||||||
|
completed_points += point
|
||||||
|
|
||||||
|
percent = round(completed_points / total_points * 100, 2) if total_points else 0
|
||||||
|
|
||||||
|
return {
|
||||||
|
"name": name,
|
||||||
|
"total_points": total_points,
|
||||||
|
"completed_points": completed_points,
|
||||||
|
"percent": percent,
|
||||||
|
"percent_text": f"{percent:.2f}%",
|
||||||
|
"achievement_count": len(unique_ids),
|
||||||
|
"completed_count": completed_count,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def zili(self, name: str, server: str, choice: int) -> Dict[str, Any]:
|
||||||
|
"""角色资历"""
|
||||||
|
return_data = self._init_return_data()
|
||||||
|
|
||||||
|
if choice not in ACHIEVEMENT_CHOICE_MAP:
|
||||||
|
return_data["msg"] = "无效序号,结束会话"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
role_params = {"server": server, "name": name, "token": self.token}
|
||||||
|
api_url = "https://www.jx3api.com/role/detail"
|
||||||
|
role_data: Optional[Dict[str, Any]] = await self._api.get(api_url, params=role_params, out_key="data")
|
||||||
|
|
||||||
|
if not role_data or not isinstance(role_data, dict):
|
||||||
|
return_data["msg"] = "未查询到角色"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
global_id = role_data.get("globalId")
|
||||||
|
if not global_id:
|
||||||
|
return_data["msg"] = "无法获取角色全区 ID"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
achievement_data = await self._api.get(
|
||||||
|
"https://next2.jx3box.com/api/next2/user-achievements",
|
||||||
|
params={"jx3id": global_id},
|
||||||
|
out_key="data",
|
||||||
|
)
|
||||||
|
if not achievement_data or not isinstance(achievement_data, dict):
|
||||||
|
return_data["msg"] = "未查询到资历数据"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
completed_ids = set()
|
||||||
|
achievements = achievement_data.get("achievements") or ""
|
||||||
|
if isinstance(achievements, str):
|
||||||
|
for item in achievements.split(","):
|
||||||
|
try:
|
||||||
|
completed_ids.add(int(item.strip()))
|
||||||
|
except ValueError:
|
||||||
|
continue
|
||||||
|
elif isinstance(achievements, list):
|
||||||
|
completed_ids = set(self._flatten_achievement_ids(achievements))
|
||||||
|
|
||||||
|
menu_payload = await self._get_achievement_base_data(
|
||||||
|
"achievement_menus",
|
||||||
|
"jx3box_achievement_menus",
|
||||||
|
)
|
||||||
|
point_payload = await self._get_achievement_base_data(
|
||||||
|
"achievement_points",
|
||||||
|
"jx3box_achievement_points",
|
||||||
|
)
|
||||||
|
if not menu_payload or not point_payload:
|
||||||
|
return_data["msg"] = "基础资历数据获取失败"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
menus = menu_payload.get("menus", {})
|
||||||
|
points = point_payload.get("points", {})
|
||||||
|
if not isinstance(menus, dict) or not isinstance(points, dict):
|
||||||
|
return_data["msg"] = "基础资历数据格式异常"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
selected_menu_id, selected_title = ACHIEVEMENT_CHOICE_MAP[choice]
|
||||||
|
items = []
|
||||||
|
|
||||||
|
if choice == 0:
|
||||||
|
total_ids = []
|
||||||
|
for _, menu_id, title in ACHIEVEMENT_CHOICES[1:]:
|
||||||
|
category = menus.get(str(menu_id), {})
|
||||||
|
if not isinstance(category, dict):
|
||||||
|
continue
|
||||||
|
category_ids = self._category_achievement_ids(category)
|
||||||
|
total_ids.extend(category_ids)
|
||||||
|
items.append(
|
||||||
|
self._build_achievement_progress(title, category_ids, points, completed_ids)
|
||||||
|
)
|
||||||
|
summary = self._build_achievement_progress(selected_title, total_ids, points, completed_ids)
|
||||||
|
else:
|
||||||
|
category = menus.get(str(selected_menu_id), {})
|
||||||
|
if not isinstance(category, dict) or not category:
|
||||||
|
return_data["msg"] = "未找到该资历分类"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
category_ids = self._category_achievement_ids(category)
|
||||||
|
summary = self._build_achievement_progress(selected_title, category_ids, points, completed_ids)
|
||||||
|
for child in category.get("children", []) or []:
|
||||||
|
if not isinstance(child, dict):
|
||||||
|
continue
|
||||||
|
child_ids = self._flatten_achievement_ids(child.get("achievements", []))
|
||||||
|
items.append(
|
||||||
|
self._build_achievement_progress(child.get("name", "未命名"), child_ids, points, completed_ids)
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
return_data["temp"] = await load_template("zili.html")
|
||||||
|
except FileNotFoundError as e:
|
||||||
|
logger.error(f"加载模板失败: {e}")
|
||||||
|
return_data["msg"] = "系统错误:模板文件不存在"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
return_data["data"] = {
|
||||||
|
"title": selected_title,
|
||||||
|
"summary": summary,
|
||||||
|
"items": items,
|
||||||
|
"role_name": role_data.get("roleName", name),
|
||||||
|
"server": role_data.get("serverName", server),
|
||||||
|
"zone": role_data.get("zoneName", ""),
|
||||||
|
"force_name": role_data.get("forceName", "无"),
|
||||||
|
"camp_name": role_data.get("campName", "无"),
|
||||||
|
"tong_name": role_data.get("tongName", "无"),
|
||||||
|
"updated_at": achievement_data.get("updated_at", ""),
|
||||||
|
"update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||||
|
}
|
||||||
|
return_data["code"] = 200
|
||||||
|
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
|
||||||
|
async def jiaoyihang(self, name: str , server: str) -> Dict[str, Any]:
|
||||||
|
"""区服交易行"""
|
||||||
|
return_data = self._init_return_data()
|
||||||
|
|
||||||
|
item_groups = await self._get_trade_item_groups()
|
||||||
|
if not item_groups:
|
||||||
|
return_data["msg"] = "交易行基础物品数据获取失败"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
trade_items = self._flatten_trade_items(item_groups)
|
||||||
|
matched_items = self._match_trade_items(trade_items, name, 50)
|
||||||
|
if not matched_items:
|
||||||
|
return_data["msg"] = "未找到匹配的交易行物品"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
item_map = {item["item_id"]: item for item in matched_items}
|
||||||
|
params = {
|
||||||
|
"item_ids": list(item_map.keys()),
|
||||||
|
"server": server,
|
||||||
|
"aggregate_type": "hourly",
|
||||||
|
}
|
||||||
|
api_url = "https://next2.jx3box.com/api/auction/"
|
||||||
|
price_data: Optional[List[Dict[str, Any]]] = await self._api.post(api_url, data=params, out_key="")
|
||||||
|
|
||||||
|
|
||||||
|
if not price_data or not isinstance(price_data, list):
|
||||||
|
return_data["msg"] = "未查询到交易行价格数据"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = []
|
||||||
|
for price_item in price_data:
|
||||||
|
if not isinstance(price_item, dict):
|
||||||
|
continue
|
||||||
|
|
||||||
|
item_id = str(price_item.get("item_id") or "")
|
||||||
|
base_item = item_map.get(item_id)
|
||||||
|
if not base_item:
|
||||||
|
continue
|
||||||
|
|
||||||
|
timestamp = price_item.get("timestamp")
|
||||||
|
try:
|
||||||
|
created = datetime.fromtimestamp(int(timestamp)).strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
except (TypeError, ValueError, OSError):
|
||||||
|
created = ""
|
||||||
|
|
||||||
|
result.append(
|
||||||
|
{
|
||||||
|
"item_id": item_id,
|
||||||
|
"name": base_item.get("label", ""),
|
||||||
|
"icon": f"https://icon.jx3box.com/icon/{base_item.get('icon', '')}.png",
|
||||||
|
"server": price_item.get("server", server),
|
||||||
|
"price": price_item.get("price", 0),
|
||||||
|
"price_parts": gold_to_parts(price_item.get("price", 0)),
|
||||||
|
"sample": price_item.get("sample", 0),
|
||||||
|
"created": created,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if not result:
|
||||||
|
return_data["msg"] = "未查询到交易行价格数据"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
return_data["data"] = {
|
||||||
|
"search_name": name,
|
||||||
|
"server": server,
|
||||||
|
"matched_count": len(matched_items),
|
||||||
|
"result_count": len(result),
|
||||||
|
"list": result,
|
||||||
|
"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
|
||||||
|
|
||||||
|
# 5. 模板渲染
|
||||||
|
try:
|
||||||
|
return_data["temp"] = await load_template("jiaoyihang.html")
|
||||||
|
return_data["code"] = 200
|
||||||
|
except FileNotFoundError as e:
|
||||||
|
logger.error(f"加载模板失败: {e}")
|
||||||
|
return_data["msg"] = "系统错误:模板文件不存在"
|
||||||
|
return return_data
|
||||||
|
|
||||||
|
return return_data
|
||||||
+108
-192
@@ -246,7 +246,7 @@ class MessageBuilder:
|
|||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
data = await self.jx3api.zili(name, server, choice)
|
data = await self.jx3box.zili(name, server, choice)
|
||||||
if data["code"] != 200:
|
if data["code"] != 200:
|
||||||
await new_event.send(MessageChain().message(data.get("msg", "获取资历数据失败")))
|
await new_event.send(MessageChain().message(data.get("msg", "获取资历数据失败")))
|
||||||
controller.stop()
|
controller.stop()
|
||||||
@@ -532,244 +532,160 @@ class MessageBuilder:
|
|||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.qixue(name,0))
|
return await self.T2I_image_msg(event, lambda: self.jx3api.qixue(name,0))
|
||||||
|
|
||||||
async def liaotian(self, event: AstrMessageEvent, server:str, name: str, limit:int = 20, page:int = 1):
|
async def liaotian(self, event: AstrMessageEvent, server:str, name: str, limit:int = 20, page:int = 1):
|
||||||
""" 奇穴 心法"""
|
""" 聊天 服务器 角色 条数 页数"""
|
||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.juesheliaotian(server,name,limit,page))
|
return await self.T2I_image_msg(event, lambda: self.jx3api.juesheliaotian(server,name,limit,page))
|
||||||
|
|
||||||
|
async def tongzhanyy(self, event: AstrMessageEvent, server: str = ""):
|
||||||
|
""" 统战 服务器"""
|
||||||
|
return await self.plain_msg(event, lambda: self.jx3api.tongzhanyy(server))
|
||||||
|
|
||||||
|
async def xiaoyao(self, event: AstrMessageEvent, name:str = ""):
|
||||||
|
""" 小药 心法"""
|
||||||
|
return await self.T2I_image_msg(event, lambda: self.jx3api.xiaoyao(name))
|
||||||
|
|
||||||
async def keju(self, event: AstrMessageEvent,subject: str, limit: int = 5):
|
async def pianzhi(self, event: AstrMessageEvent, uid: str, server:str = ""):
|
||||||
""" 科举"""
|
""" 骗子 uid 服务器"""
|
||||||
return await self.plain_msg(event, lambda: self.jx3api.keju(subject,limit))
|
return await self.plain_msg(event, lambda: self.jx3api.pianzhi(server,uid))
|
||||||
|
|
||||||
|
|
||||||
async def huajia(self, event: AstrMessageEvent, name: str= "", server: str = "", map: str= ""):
|
|
||||||
""" 花价 名称 服务器 地图"""
|
|
||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.huajia(self.serverdefault(server),name,map))
|
|
||||||
|
|
||||||
|
async def huajia(self, event: AstrMessageEvent, server: str, name: str= "" , map: str= ""):
|
||||||
|
""" 花价 服务器 名称 地图"""
|
||||||
|
return await self.T2I_image_msg(event, lambda: self.jx3api.huajia(server,name,map))
|
||||||
|
|
||||||
async def zhuangshi(self, event: AstrMessageEvent, name: str):
|
async def zhuangshi(self, event: AstrMessageEvent, name: str):
|
||||||
""" 装饰 名称"""
|
""" 装饰 名称"""
|
||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.zhuangshi(name))
|
return await self.T2I_image_msg(event, lambda: self.jx3api.zhuangshi(name))
|
||||||
|
|
||||||
|
|
||||||
async def qiwu(self, event: AstrMessageEvent, name: str):
|
async def qiwu(self, event: AstrMessageEvent, name: str):
|
||||||
""" 器物 地图名称"""
|
""" 器物 地图名称"""
|
||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.qiwu(name))
|
return await self.T2I_image_msg(event, lambda: self.jx3api.qiwu(name))
|
||||||
|
|
||||||
|
async def baishi(self, event: AstrMessageEvent, server: str, keyword: str = ""):
|
||||||
|
""" 拜师 服务器 关键词 """
|
||||||
|
return await self.T2I_image_msg(event, lambda: self.jx3api.shitu(2, server, keyword, 50))
|
||||||
|
|
||||||
async def xinwen(self, event: AstrMessageEvent,num:int = 5):
|
async def shoutu(self, event: AstrMessageEvent, server: str, keyword: str = ""):
|
||||||
""" 新闻"""
|
""" 收徒 服务器 关键词 """
|
||||||
return await self.plain_msg(event, lambda: self.jx3api.xinwen(num))
|
return await self.T2I_image_msg(event, lambda: self.jx3api.shitu(1, server, keyword, 50))
|
||||||
|
|
||||||
|
async def weihu(self, event: AstrMessageEvent,limit:int = 5):
|
||||||
|
""" 维护 数量"""
|
||||||
|
return await self.plain_msg(event, lambda: self.jx3api.weihu(limit))
|
||||||
|
|
||||||
async def weihu(self, event: AstrMessageEvent,num:int = 5):
|
async def xinwen(self, event: AstrMessageEvent,limit:int = 5):
|
||||||
""" 维护"""
|
""" 新闻 数量"""
|
||||||
return await self.plain_msg(event, lambda: self.jx3api.weihu(num))
|
return await self.plain_msg(event, lambda: self.jx3api.xinwen(limit))
|
||||||
|
|
||||||
|
|
||||||
async def qufu(self, event: AstrMessageEvent,name: str = "双梦镇"):
|
async def tuanduizhaomu(self, event: AstrMessageEvent,server: str, keyword: str = ""):
|
||||||
""" 区服"""
|
""" 招募 服务器 副本"""
|
||||||
return await self.plain_msg(event, lambda: self.jx3api.qufu(name))
|
return await self.T2I_image_msg(event, lambda: self.jx3api.tuanduizhaomu( server,1,keyword,50))
|
||||||
|
|
||||||
|
async def tuanzhang(self, event: AstrMessageEvent,server: str, keyword: str = ""):
|
||||||
|
""" 团长 服务器 名字"""
|
||||||
|
return await self.T2I_image_msg(event, lambda: self.jx3api.tuanduizhaomu( server,2,keyword,50))
|
||||||
|
|
||||||
async def kaifu(self, event: AstrMessageEvent,server: str = ""):
|
async def tuanpai(self, event: AstrMessageEvent,server: str, keyword: str = ""):
|
||||||
""" 开服 服务器"""
|
""" 团牌 服务器 内容"""
|
||||||
return await self.plain_msg(event, lambda: self.jx3api.kaifu(self.serverdefault(server)))
|
return await self.T2I_image_msg(event, lambda: self.jx3api.tuanduizhaomu( server,3,keyword,50))
|
||||||
|
|
||||||
|
async def daanzhishu(self, event: AstrMessageEvent):
|
||||||
|
""" 答案之书"""
|
||||||
|
return await self.plain_msg(event, self.jx3api.daanzhishu)
|
||||||
|
|
||||||
|
async def tiangou(self, event: AstrMessageEvent):
|
||||||
|
""" 舔狗语录"""
|
||||||
|
return await self.plain_msg(event, self.jx3api.tiangou)
|
||||||
|
|
||||||
|
async def fkxq4(self, event: AstrMessageEvent):
|
||||||
|
""" 疯狂星期四"""
|
||||||
|
return await self.plain_msg(event, lambda: self.jx3api.fengleiyulu("疯狂星期四"))
|
||||||
|
|
||||||
|
async def caihongpi(self, event: AstrMessageEvent):
|
||||||
|
""" 彩虹屁"""
|
||||||
|
return await self.plain_msg(event, lambda: self.jx3api.fengleiyulu("彩虹屁"))
|
||||||
|
|
||||||
|
async def dujitang(self, event: AstrMessageEvent):
|
||||||
|
""" 毒鸡汤"""
|
||||||
|
return await self.plain_msg(event, lambda: self.jx3api.fengleiyulu("毒鸡汤"))
|
||||||
|
|
||||||
|
async def pengyouquan(self, event: AstrMessageEvent):
|
||||||
|
""" 朋友圈"""
|
||||||
|
return await self.plain_msg(event, lambda: self.jx3api.fengleiyulu("朋友圈"))
|
||||||
|
|
||||||
|
async def heshengme(self, event: AstrMessageEvent,):
|
||||||
|
""" 喝什么"""
|
||||||
|
return await self.plain_msg(event, self.jx3api.heshengme)
|
||||||
|
|
||||||
|
async def chishengme(self, event: AstrMessageEvent,):
|
||||||
|
""" 吃什么"""
|
||||||
|
return await self.plain_msg(event, self.jx3api.chishengme)
|
||||||
|
|
||||||
|
async def shaohua(self, event: AstrMessageEvent,):
|
||||||
|
""" 骚话"""
|
||||||
|
return await self.plain_msg(event, self.jx3api.shaohua)
|
||||||
|
|
||||||
|
async def zhananyulu(self, event: AstrMessageEvent,):
|
||||||
|
""" 渣男语录"""
|
||||||
|
return await self.plain_msg(event, self.jx3api.zhananyulu)
|
||||||
|
|
||||||
|
async def keju(self, event: AstrMessageEvent,subject: str, limit: int = 5):
|
||||||
|
""" 科举 题目 条数"""
|
||||||
|
return await self.plain_msg(event, lambda: self.jx3api.keju(subject,limit))
|
||||||
|
|
||||||
async def zhuangtai(self, event: AstrMessageEvent):
|
async def zhuangtai(self, event: AstrMessageEvent):
|
||||||
""" 状态"""
|
""" 区服"""
|
||||||
return await self.T2I_image_msg(event, self.jx3api.zhuangtai)
|
return await self.T2I_image_msg(event, lambda: self.jx3api.zhuangtai(""))
|
||||||
|
|
||||||
|
async def kaifu(self, event: AstrMessageEvent,server: str):
|
||||||
|
""" 开服 服务器"""
|
||||||
|
return await self.plain_msg(event, lambda: self.jx3api.kaifu(server))
|
||||||
|
|
||||||
async def jigai(self, event: AstrMessageEvent,):
|
async def jigai(self, event: AstrMessageEvent,):
|
||||||
""" 技改"""
|
""" 技改"""
|
||||||
return await self.plain_msg(event, self.jx3api.jigai)
|
return await self.plain_msg(event, self.jx3api.jigai)
|
||||||
|
|
||||||
|
async def jiemi(self, event: AstrMessageEvent):
|
||||||
|
""" 解密"""
|
||||||
|
return await self.plain_msg(event, self.jx3api.jiemi)
|
||||||
|
|
||||||
async def xiaoyao(self, event: AstrMessageEvent):
|
async def tiebawujia(self, event: AstrMessageEvent, name: str, server: str = "", limit: str = "5", ):
|
||||||
""" 小药"""
|
""" 贴吧物价 名称 服务器 数量 """
|
||||||
return await self.T2I_image_msg(event, self.jx3api.xiaoyao)
|
return await self.plain_msg(event, lambda: self.jx3api.tiebawujia(name, server, limit))
|
||||||
|
|
||||||
|
async def bagua(self, event: AstrMessageEvent, server:str = "", limit:str = 10):
|
||||||
|
""" 818 """
|
||||||
|
return await self.plain_msg(event, lambda: self.jx3api.bagua(818,server,limit))
|
||||||
|
|
||||||
|
async def diaoluo(self, event: AstrMessageEvent, name: str, server: str = "", limit: str = "20",):
|
||||||
|
""" 掉落 物品 服务器 数量 """
|
||||||
|
return await self.T2I_image_msg(event, lambda: self.jx3api.diaoluo(name, server, limit))
|
||||||
|
|
||||||
|
async def hong(self, event: AstrMessageEvent,name: str = "易筋经"):
|
||||||
|
""" 宏 心法"""
|
||||||
|
return await self.handler_plain_image_msg(event, lambda: self.jx3box.hong1(name), self.jx3box.hong2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def zilipaihang(self, event: AstrMessageEvent):
|
|
||||||
""" 资历排行 """
|
|
||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.zilipaixing("", ""))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def shaohua(self, event: AstrMessageEvent,):
|
|
||||||
""" 骚话"""
|
|
||||||
return await self.plain_msg(event, self.jx3api.shaohua)
|
|
||||||
|
|
||||||
|
|
||||||
async def zili(self, event: AstrMessageEvent, name: str, server: str = ""):
|
async def zili(self, event: AstrMessageEvent, name: str, server: str = ""):
|
||||||
""" 资历 角色名称 服务器"""
|
""" 资历 角色名称 服务器"""
|
||||||
return await self.handler_zili_msg(event, name, self.serverdefault(server))
|
return await self.handler_zili_msg(event, name, self.serverdefault(server))
|
||||||
|
|
||||||
|
|
||||||
async def jiemi(self, event: AstrMessageEvent):
|
|
||||||
""" 解密"""
|
|
||||||
return await self.plain_msg(event, self.jx3api.jiemi)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def fuyaojjiutian(self, event: AstrMessageEvent,server: str = ""):
|
|
||||||
""" 扶摇九天 服务器"""
|
|
||||||
return await self.plain_msg(event, lambda: self.jx3api.fuyaojjiutian( self.serverdefault(server)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def tongzhanyy(self, event: AstrMessageEvent, server: str = ""):
|
|
||||||
""" 统战歪歪 服务器"""
|
|
||||||
return await self.plain_msg(event, lambda: self.jx3api.tongzhanyy(self.serverdefault(server)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def pianzhi(self, event: AstrMessageEvent,qq: str):
|
|
||||||
""" 骗子 QQ"""
|
|
||||||
return await self.plain_msg(event, lambda: self.jx3api.pianzhi(qq))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def tuanduizhaomu(self, event: AstrMessageEvent,keyword: str = "25人普通会战弓月城", server: str = ""):
|
|
||||||
""" 招募 副本 服务器"""
|
|
||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.tuanduizhaomu( self.serverdefault(server),keyword))
|
|
||||||
|
|
||||||
|
|
||||||
async def baishi(self, event: AstrMessageEvent,keyword: str = "", server: str = ""):
|
|
||||||
""" 拜师 搜索关键词 服务器"""
|
|
||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.shitu(2, keyword, self.serverdefault(server)))
|
|
||||||
|
|
||||||
|
|
||||||
async def shoutu(self, event: AstrMessageEvent,keyword: str = "", server: str = ""):
|
|
||||||
""" 收徒 搜索关键词 服务器"""
|
|
||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.shitu(1, keyword, self.serverdefault(server)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def jiaoyihang(self, event: AstrMessageEvent,Name: str = "守缺式",server: str = ""):
|
async def jiaoyihang(self, event: AstrMessageEvent,Name: str = "守缺式",server: str = ""):
|
||||||
""" 交易行 物品名称 服务器"""
|
""" 交易行 物品名称 服务器"""
|
||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.jiaoyihang(Name, self.serverdefault(server)))
|
return await self.T2I_image_msg(event, lambda: self.jx3box.jiaoyihang(Name, self.serverdefault(server)))
|
||||||
|
|
||||||
|
|
||||||
async def tiebawujia(self, event: AstrMessageEvent, name: str = "狐金", limit_or_server: str = "5", server: str = ""):
|
|
||||||
""" 贴吧物价 物品名称 数量 服务器"""
|
|
||||||
limit = 5
|
|
||||||
target_server = server
|
|
||||||
|
|
||||||
if str(limit_or_server).isdigit():
|
|
||||||
limit = int(limit_or_server)
|
|
||||||
else:
|
|
||||||
target_server = limit_or_server
|
|
||||||
|
|
||||||
return await self.plain_msg(event, lambda: self.jx3api.tiebawujia(name, limit, self.serverdefault(target_server)))
|
|
||||||
|
|
||||||
|
|
||||||
async def diaoluo(self, event: AstrMessageEvent, name: str = "玄晶", limit_or_server: str = "20", server: str = ""):
|
|
||||||
""" 掉落 物品名称 数量 服务器"""
|
|
||||||
limit = 20
|
|
||||||
target_server = server
|
|
||||||
|
|
||||||
if str(limit_or_server).isdigit():
|
|
||||||
limit = int(limit_or_server)
|
|
||||||
else:
|
|
||||||
target_server = limit_or_server
|
|
||||||
|
|
||||||
return await self.T2I_image_msg(event, lambda: self.jx3api.diaoluo(name, limit, self.serverdefault(target_server)))
|
|
||||||
|
|
||||||
|
|
||||||
async def bagua(self, event: AstrMessageEvent,name: str = "818"):
|
|
||||||
""" 八卦 类型"""
|
|
||||||
return await self.plain_msg(event, lambda: self.jx3api.bagua(name))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def hong(self, event: AstrMessageEvent,name: str = "易筋经"):
|
|
||||||
""" 宏 心法"""
|
|
||||||
return await self.handler_plain_image_msg(event, lambda: self.jx3api.hong1(name), self.jx3api.hong2)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ from .core.fun_basic import load_as_base64
|
|||||||
@register("astrbot_plugin_jx3",
|
@register("astrbot_plugin_jx3",
|
||||||
"fxdyz",
|
"fxdyz",
|
||||||
"通过调用剑网三API接口获取游戏数据,处理发送。",
|
"通过调用剑网三API接口获取游戏数据,处理发送。",
|
||||||
"2.8",
|
"3.0",
|
||||||
"https://github.com/qsc20001102/astrbot_plugin_jx3"
|
"https://github.com/qsc20001102/astrbot_plugin_jx3"
|
||||||
)
|
)
|
||||||
class Jx3ApiPlugin(Star):
|
class Jx3ApiPlugin(Star):
|
||||||
@@ -270,66 +270,44 @@ class Jx3ApiPlugin(Star):
|
|||||||
"技能": self. jx3cmd.jineng,
|
"技能": self. jx3cmd.jineng,
|
||||||
"奇穴": self. jx3cmd.qixue,
|
"奇穴": self. jx3cmd.qixue,
|
||||||
"聊天": self. jx3cmd.liaotian,
|
"聊天": self. jx3cmd.liaotian,
|
||||||
|
"统战": self. jx3cmd.tongzhanyy,
|
||||||
|
"小药": self. jx3cmd.xiaoyao,
|
||||||
|
"骗子": self. jx3cmd.pianzhi,
|
||||||
|
|
||||||
|
|
||||||
"科举": self. jx3cmd.keju,
|
|
||||||
"花价": self. jx3cmd.huajia,
|
"花价": self. jx3cmd.huajia,
|
||||||
"装饰": self. jx3cmd.zhuangshi,
|
"装饰": self. jx3cmd.zhuangshi,
|
||||||
"器物": self. jx3cmd.qiwu,
|
"器物": self. jx3cmd.qiwu,
|
||||||
"公告": self. jx3cmd.xinwen,
|
|
||||||
"维护": self. jx3cmd.weihu,
|
|
||||||
"区服": self. jx3cmd.qufu,
|
|
||||||
"开服": self. jx3cmd.kaifu,
|
|
||||||
"状态": self. jx3cmd.zhuangtai,
|
|
||||||
"技改": self. jx3cmd.jigai,
|
|
||||||
"小药": self. jx3cmd.xiaoyao,
|
|
||||||
|
|
||||||
|
|
||||||
"全服资历排行": self. jx3cmd.zilipaihang,
|
|
||||||
|
|
||||||
"骚话": self. jx3cmd.shaohua,
|
|
||||||
"资历": self. jx3cmd.zili,
|
|
||||||
"解密": self. jx3cmd.jiemi,
|
|
||||||
|
|
||||||
|
|
||||||
"宏": self. jx3cmd.hong,
|
|
||||||
|
|
||||||
|
|
||||||
"扶摇": self. jx3cmd.fuyaojjiutian,
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"统战": self. jx3cmd.tongzhanyy,
|
|
||||||
|
|
||||||
|
|
||||||
"骗子": self. jx3cmd.pianzhi,
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"招募": self. jx3cmd.tuanduizhaomu,
|
|
||||||
"拜师": self. jx3cmd.baishi,
|
"拜师": self. jx3cmd.baishi,
|
||||||
"收徒": self. jx3cmd.shoutu,
|
"收徒": self. jx3cmd.shoutu,
|
||||||
|
"维护": self. jx3cmd.weihu,
|
||||||
|
"新闻": self. jx3cmd.xinwen,
|
||||||
|
"招募": self. jx3cmd.tuanduizhaomu,
|
||||||
|
"团长": self. jx3cmd.tuanzhang,
|
||||||
|
"团牌": self. jx3cmd.tuanpai,
|
||||||
|
"答案之书": self. jx3cmd.daanzhishu,
|
||||||
|
"舔狗语录": self. jx3cmd.tiangou,
|
||||||
|
"疯狂星期四": self. jx3cmd.fkxq4,
|
||||||
|
"彩虹屁": self. jx3cmd.caihongpi,
|
||||||
|
"毒鸡汤": self. jx3cmd.dujitang,
|
||||||
|
"朋友圈": self. jx3cmd.pengyouquan,
|
||||||
|
"喝什么": self. jx3cmd.heshengme,
|
||||||
|
"吃什么": self. jx3cmd.chishengme,
|
||||||
|
"骚话": self. jx3cmd.shaohua,
|
||||||
|
"渣男语录": self. jx3cmd.zhananyulu,
|
||||||
|
"科举": self. jx3cmd.keju,
|
||||||
|
"区服": self. jx3cmd.zhuangtai,
|
||||||
|
"开服": self. jx3cmd.kaifu,
|
||||||
|
"技改": self. jx3cmd.jigai,
|
||||||
|
"解密": self. jx3cmd.jiemi,
|
||||||
|
"资历": self. jx3cmd.zili,
|
||||||
|
"宏": self. jx3cmd.hong,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"八卦": self. jx3cmd.bagua,
|
"818": self. jx3cmd.bagua,
|
||||||
"交易行": self. jx3cmd.jiaoyihang,
|
"交易行": self. jx3cmd.jiaoyihang,
|
||||||
"贴吧物价": self. jx3cmd.tiebawujia,
|
"贴吧物价": self. jx3cmd.tiebawujia,
|
||||||
"掉落": self. jx3cmd.diaoluo,
|
"掉落": self. jx3cmd.diaoluo,
|
||||||
|
|
||||||
"开服推送": self. jx3cmd.kaifhujiank,
|
"开服推送": self. jx3cmd.kaifhujiank,
|
||||||
"新闻推送": self. jx3cmd.xinwenzhixun,
|
"新闻推送": self. jx3cmd.xinwenzhixun,
|
||||||
"刷马推送": self. jx3cmd.shuamamsg,
|
"刷马推送": self. jx3cmd.shuamamsg,
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
name: astrbot_plugin_jx3
|
name: astrbot_plugin_jx3
|
||||||
display_name: 剑网三游戏数据查询工具
|
display_name: 剑网三游戏数据查询工具
|
||||||
desc: 通过接口调用剑网三API接口获取游戏数据,处理发送。
|
desc: 通过接口调用剑网三API接口获取游戏数据,处理发送。
|
||||||
version: v2.8
|
version: v3.0
|
||||||
author: 飞翔大野猪
|
author: 飞翔大野猪
|
||||||
repo: https://github.com/qsc20001102/astrbot_plugin_jx3
|
repo: https://github.com/qsc20001102/astrbot_plugin_jx3
|
||||||
astrbot_version: ">=4.11.0"
|
astrbot_version: ">=4.11.0"
|
||||||
|
|||||||
@@ -117,10 +117,10 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
{% for item in items %}
|
{% for item in items %}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="item-col">{{ item.item_name }}</td>
|
<td class="item-col">{{ item.itemName }}</td>
|
||||||
<td class="server-col">{{ item.server }}</td>
|
<td class="server-col">{{ item.server }}</td>
|
||||||
<td class="map-col">{{ item.map_name }}</td>
|
<td class="map-col">{{ item.mapName }}</td>
|
||||||
<td class="role-col">{{ item.role_name }}</td>
|
<td class="role-col">{{ item.roleName }}</td>
|
||||||
<td class="time-col">{{ item.time }}</td>
|
<td class="time-col">{{ item.time }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
+614
-1260
File diff suppressed because it is too large
Load Diff
@@ -81,11 +81,11 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
{% for m in list %}
|
{% for m in list %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ m.activity }}</td>
|
<td>{{ m.activityName }}</td>
|
||||||
<td>{{ m.leader }}</td>
|
<td>{{ m.roleName }}</td>
|
||||||
<td>{{ m.createTime }}</td>
|
<td>{{ m.createTime }}</td>
|
||||||
<td>{{ m.number }}</td>
|
<td>{{ m.maxMemberCount }}</td>
|
||||||
<td>{{ m.content }}</td>
|
<td>{{ m.commentText }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
Reference in New Issue
Block a user