11
This commit is contained in:
+53
-4
@@ -701,9 +701,6 @@ class JX3Service:
|
||||
data["showAvatar"] = ""
|
||||
logger.info("名片获取失败")
|
||||
|
||||
# 3. 处理返回数据 (直接提取图片 URL)
|
||||
|
||||
|
||||
# 4. 加载模板
|
||||
try:
|
||||
return_data["temp"] = load_template("zhanji.html")
|
||||
@@ -712,8 +709,60 @@ class JX3Service:
|
||||
return_data["msg"] = "系统错误:模板文件不存在"
|
||||
return return_data
|
||||
|
||||
|
||||
return_data["data"] = data
|
||||
return_data["code"] = 200
|
||||
|
||||
return return_data
|
||||
|
||||
|
||||
async def juesheqiyu(self, name: str, server: str) -> Dict[str, Any]:
|
||||
"""团队招募"""
|
||||
return_data = self._init_return_data()
|
||||
|
||||
# 获取配置中的 Token
|
||||
token = self._config.get("jx3api_token", "")
|
||||
if token == "":
|
||||
return_data["msg"] = "系统未配置API访问Token"
|
||||
return return_data
|
||||
|
||||
# 1. 构造请求参数
|
||||
params = {"server": server, "name": name, "token": token}
|
||||
|
||||
# 2. 调用基础请求
|
||||
data: Optional[Dict[str, Any]] = await self._base_request(
|
||||
"jx3_qiyu", "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"] = "处理返回数据失败"
|
||||
|
||||
# 4. 加载模板
|
||||
try:
|
||||
return_data["temp"] = 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
|
||||
|
||||
@@ -228,5 +228,15 @@
|
||||
"ticket": "a7fd656a52d747d7830cfa6d686e6030:qsc20001102:kingsoft::sVpKi7nFKzFlbTwtBMTg2w==",
|
||||
"token":""
|
||||
}
|
||||
},
|
||||
"jx3_qiyu":{
|
||||
"url":"https://www.jx3api.com/data/luck/adventure",
|
||||
"method":"GET",
|
||||
"description":"此接口用于查询指定角色的奇遇触发记录,包括奇遇事件、状态及触发时间。注意,数据可能存在遗漏",
|
||||
"params":{
|
||||
"server": "梦江南",
|
||||
"name": "飞翔大野猪",
|
||||
"token":""
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -212,7 +212,7 @@ class Jx3ApiPlugin(Star):
|
||||
|
||||
|
||||
@jx3.command("区服奇遇")
|
||||
async def jx3_qiyu(self, event: AstrMessageEvent,adventureName: str = "阴阳两界", server: str = None):
|
||||
async def jx3_qufuqiyu(self, event: AstrMessageEvent,adventureName: str = "阴阳两界", server: str = None):
|
||||
"""剑三 区服奇遇 奇遇名称 服务器"""
|
||||
try:
|
||||
data= await self.jx3fun.qiyu(adventureName,await self.serverdefault(server))
|
||||
@@ -388,6 +388,23 @@ class Jx3ApiPlugin(Star):
|
||||
yield event.plain_result("猪脑过载,请稍后再试")
|
||||
|
||||
|
||||
@jx3.command("奇遇")
|
||||
async def jx3_qiyu(self, event: AstrMessageEvent,name: str = "飞翔大野猪", server: str = None):
|
||||
"""剑三 奇遇 角色名称 服务器"""
|
||||
try:
|
||||
data= await self.jx3fun.juesheqiyu(name,await self.serverdefault(server))
|
||||
logger.info(f"数据打印: {data}")
|
||||
if data["code"] == 200:
|
||||
url = await self.html_render(data["temp"], data["data"], options={})
|
||||
yield event.image_result(url)
|
||||
else:
|
||||
yield event.plain_result(data["msg"])
|
||||
return
|
||||
except Exception as e:
|
||||
logger.error(f"功能函数执行错误: {e}")
|
||||
yield event.plain_result("猪脑过载,请稍后再试")
|
||||
|
||||
|
||||
async def terminate(self):
|
||||
"""可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。"""
|
||||
# 关闭数据库连接
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>角色奇遇一览</title>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 24px;
|
||||
background: #f5f7fb;
|
||||
color: #2c2c33;
|
||||
font-family: "Microsoft YaHei", Arial, sans-serif;
|
||||
}
|
||||
|
||||
.section {
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
font-size: 36px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 16px;
|
||||
border-left: 4px solid #4f7cff;
|
||||
padding-left: 10px;
|
||||
color: #1f2a44;
|
||||
}
|
||||
|
||||
.card-container {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.card {
|
||||
background: #ffffff;
|
||||
border-radius: 8px;
|
||||
padding: 16px 12px;
|
||||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.08);
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
min-height: 90px;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 8px 18px rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
.event {
|
||||
font-size: 28px;
|
||||
font-weight: 600;
|
||||
margin-bottom: 6px;
|
||||
color: #2b3a67;
|
||||
}
|
||||
|
||||
.time {
|
||||
font-size: 22px;
|
||||
color: #7a7f99;
|
||||
}
|
||||
|
||||
.empty {
|
||||
color: #999;
|
||||
font-size: 14px;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
@media (max-width: 1000px) {
|
||||
.card-container {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.card-container {
|
||||
grid-template-columns: repeat(1, 1fr);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- 普通奇遇 -->
|
||||
<div class="section">
|
||||
<div class="section-title">
|
||||
普通奇遇({{ ptqy|length if ptqy else 0 }})
|
||||
</div>
|
||||
{% if ptqy %}
|
||||
<div class="card-container">
|
||||
{% for item in ptqy %}
|
||||
<div class="card">
|
||||
<div class="event">{{ item.event }}</div>
|
||||
<div class="time">{{ item.time }}</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty">暂无普通奇遇</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- 绝世奇遇 -->
|
||||
<div class="section">
|
||||
<div class="section-title">
|
||||
绝世奇遇({{ jsqy|length if jsqy else 0 }})
|
||||
</div>
|
||||
{% if jsqy %}
|
||||
<div class="card-container">
|
||||
{% for item in jsqy %}
|
||||
<div class="card">
|
||||
<div class="event">{{ item.event }}</div>
|
||||
<div class="time">{{ item.time }}</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty">暂无绝世奇遇</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- 宠物奇遇 -->
|
||||
<div class="section">
|
||||
<div class="section-title">
|
||||
宠物奇遇({{ cwqy|length if cwqy else 0 }})
|
||||
</div>
|
||||
{% if cwqy %}
|
||||
<div class="card-container">
|
||||
{% for item in cwqy %}
|
||||
<div class="card">
|
||||
<div class="event">{{ item.event }}</div>
|
||||
<div class="time">{{ item.time }}</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty">暂无宠物奇遇</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
+116
-220
@@ -1,249 +1,145 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>剑网三 3v3 战绩面板</title>
|
||||
<meta charset="UTF-8">
|
||||
<title>角色奇遇一览</title>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 24px;
|
||||
background: #f5f7fb;
|
||||
color: #2c2c33;
|
||||
font-family: "Microsoft YaHei", Arial, sans-serif;
|
||||
}
|
||||
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 20px;
|
||||
background: #f2f3f7;
|
||||
color: #2b2b2b;
|
||||
font-family: "Microsoft YaHei", Arial, sans-serif;
|
||||
}
|
||||
.section {
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.panel {
|
||||
width: 1100px;
|
||||
margin: auto;
|
||||
background: #ffffff;
|
||||
border-radius: 12px;
|
||||
padding: 22px;
|
||||
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
.section-title {
|
||||
font-size: 36px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 16px;
|
||||
border-left: 4px solid #4f7cff;
|
||||
padding-left: 10px;
|
||||
color: #1f2a44;
|
||||
}
|
||||
|
||||
/* ===== 头部 ===== */
|
||||
.header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
border-bottom: 1px solid #ddd;
|
||||
padding-bottom: 14px;
|
||||
}
|
||||
.card-container {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.role-name {
|
||||
font-size: 36px;
|
||||
font-weight: bold;
|
||||
color: #1f1f1f;
|
||||
}
|
||||
.card {
|
||||
background: #ffffff;
|
||||
border-radius: 8px;
|
||||
padding: 16px 12px;
|
||||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.08);
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||
|
||||
.sub-info {
|
||||
margin-top: 6px;
|
||||
font-size: 18px;
|
||||
color: #666;
|
||||
}
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
min-height: 90px;
|
||||
}
|
||||
|
||||
/* ===== 头像 + 核心数据 ===== */
|
||||
.stats-wrap {
|
||||
display: flex;
|
||||
gap: 24px;
|
||||
margin: 26px 0;
|
||||
align-items: stretch;
|
||||
}
|
||||
.card:hover {
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 8px 18px rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
/* 头像区域 */
|
||||
.avatar-box {
|
||||
width: 280px;
|
||||
height: 360px;
|
||||
background: #e9ebf1;
|
||||
border-radius: 16px;
|
||||
overflow: hidden;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.event {
|
||||
font-size: 28px;
|
||||
font-weight: 600;
|
||||
margin-bottom: 6px;
|
||||
color: #2b3a67;
|
||||
}
|
||||
|
||||
.avatar-box img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
}
|
||||
/* 右侧数据 */
|
||||
.stats {
|
||||
flex: 1;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
grid-template-rows: repeat(2, 1fr);
|
||||
gap: 14px;
|
||||
}
|
||||
.time {
|
||||
font-size: 22px;
|
||||
color: #7a7f99;
|
||||
}
|
||||
|
||||
/* 单个数据块 */
|
||||
.stat-box {
|
||||
background: #f5f6fa;
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
.empty {
|
||||
color: #999;
|
||||
font-size: 14px;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
.stat-title {
|
||||
font-size: 26px;
|
||||
color: #777;
|
||||
}
|
||||
@media (max-width: 1000px) {
|
||||
.card-container {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
}
|
||||
|
||||
.stat-value {
|
||||
font-size: 36px;
|
||||
margin-top: 8px;
|
||||
font-weight: bold;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.winrate {
|
||||
color: #2fbf71;
|
||||
}
|
||||
|
||||
.mmr {
|
||||
color: #f5a623;
|
||||
}
|
||||
|
||||
/* ===== 表格 ===== */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-top: 20px;
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
thead {
|
||||
background: #f0f1f5;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
th {
|
||||
color: #666;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
tbody tr:nth-child(even) {
|
||||
background: #fafbfe;
|
||||
}
|
||||
|
||||
tbody tr:nth-child(odd) {
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.win {
|
||||
color: #2fbf71;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.lose {
|
||||
color: #e65050;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.mmr-up {
|
||||
color: #2fbf71;
|
||||
}
|
||||
|
||||
.mmr-down {
|
||||
color: #e65050;
|
||||
}
|
||||
|
||||
.mvp {
|
||||
color: #f5a623;
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
@media (max-width: 600px) {
|
||||
.card-container {
|
||||
grid-template-columns: repeat(1, 1fr);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="panel">
|
||||
|
||||
<!-- 角色信息 -->
|
||||
<div class="header">
|
||||
<div>
|
||||
<div class="role-name">{{ roleName }}</div>
|
||||
<div class="sub-info">
|
||||
{{ serverName }} | {{ forceName }} | {{ campName }} | {{ tongName }}
|
||||
<!-- 普通奇遇 -->
|
||||
<div class="section">
|
||||
<div class="section-title">
|
||||
普通奇遇({{ ptqy|length if ptqy else 0 }})
|
||||
</div>
|
||||
{% if ptqy %}
|
||||
<div class="card-container">
|
||||
{% for item in ptqy %}
|
||||
<div class="card">
|
||||
<div class="event">{{ item.event }}</div>
|
||||
<div class="time">{{ item.time }}</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="sub-info">
|
||||
角色ID:{{ roleId }}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty">暂无普通奇遇</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- 头像 + 当前 3v3 表现 -->
|
||||
<div class="stats-wrap">
|
||||
|
||||
<!-- 左侧头像 -->
|
||||
<div class="avatar-box">
|
||||
<img src="{{ showAvatar }}" alt="avatar">
|
||||
<!-- 绝世奇遇 -->
|
||||
<div class="section">
|
||||
<div class="section-title">
|
||||
绝世奇遇({{ jsqy|length if jsqy else 0 }})
|
||||
</div>
|
||||
|
||||
<!-- 右侧数据 -->
|
||||
<div class="stats">
|
||||
<div class="stat-box">
|
||||
<div class="stat-title">名剑积分</div>
|
||||
<div class="stat-value mmr">{{ performance['3v3'].mmr }}</div>
|
||||
</div>
|
||||
|
||||
<div class="stat-box">
|
||||
<div class="stat-title">名剑段位</div>
|
||||
<div class="stat-value">{{ performance['3v3'].grade }}</div>
|
||||
</div>
|
||||
|
||||
<div class="stat-box">
|
||||
<div class="stat-title">胜率</div>
|
||||
<div class="stat-value winrate">{{ performance['3v3'].winRate }}%</div>
|
||||
</div>
|
||||
|
||||
<div class="stat-box">
|
||||
<div class="stat-title">总场数</div>
|
||||
<div class="stat-value">{{ performance['3v3'].totalCount }}</div>
|
||||
</div>
|
||||
|
||||
<div class="stat-box">
|
||||
<div class="stat-title">MVP次数</div>
|
||||
<div class="stat-value">{{ performance['3v3'].mvpCount }}</div>
|
||||
{% if jsqy %}
|
||||
<div class="card-container">
|
||||
{% for item in jsqy %}
|
||||
<div class="card">
|
||||
<div class="event">{{ item.event }}</div>
|
||||
<div class="time">{{ item.time }}</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% else %}
|
||||
<div class="empty">暂无绝世奇遇</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- 对战记录表 -->
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>对战时长</th>
|
||||
<th>心法</th>
|
||||
<th>胜负</th>
|
||||
<th>积分变化</th>
|
||||
<th>最终积分</th>
|
||||
<th>平均段位</th>
|
||||
<th>MVP</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!-- 宠物奇遇 -->
|
||||
<div class="section">
|
||||
<div class="section-title">
|
||||
宠物奇遇({{ cwqy|length if cwqy else 0 }})
|
||||
</div>
|
||||
{% if cwqy %}
|
||||
<div class="card-container">
|
||||
{% for item in cwqy %}
|
||||
<div class="card">
|
||||
<div class="event">{{ item.event }}</div>
|
||||
<div class="time">{{ item.time }}</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty">暂无宠物奇遇</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<tbody>
|
||||
{% for m in history %}
|
||||
<tr>
|
||||
<td>{{ m.endTime - m.startTime }}</td>
|
||||
<td>{{ m.kungfu }}</td>
|
||||
<td class="{{ 'win' if m.won else 'lose' }}">{{ '胜' if m.won else '负' }}</td>
|
||||
<td class="{{ 'mmr-up' if m.mmr > 0 else 'mmr-down' }}">
|
||||
{{ m.mmr }}
|
||||
</td>
|
||||
<td>{{ m.totalMmr }}</td>
|
||||
<td>{{ m.avgGrade }}</td>
|
||||
<td class="{{ 'mvp' if m.mvp else '' }}">
|
||||
{{ '是' if m.mvp else '-' }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user