This commit is contained in:
qsc
2026-09-05 22:41:53 +08:00
parent 21033c8184
commit a42d3146c5
20 changed files with 432 additions and 16 deletions
+12
View File
@@ -1,5 +1,17 @@
## 更新记录
### version: 3.4.52026-09-05):
新增 `跨服名剑 服务器 [模式]` 指令,接入 JX3API 跨服名剑榜;竞技模式支持 `0=2v2``1=3v3``2=5v5`,默认为 `1`。榜单按接口数组顺序生成排名,使用统一数据表格模板展示队伍名称、积分、胜场、败场和总场数,并同步更新功能帮助与 README。
新增 `武林争霸 服务器 [阵营]` 指令,接入 JX3API 武林争霸赛帮会榜;阵营支持 `1=浩气``2=恶人`,默认为 `1`。榜单按接口数组顺序生成排名,使用统一数据表格模板展示帮会、帮主、所属服务器、阵营、胜负场、积分和最后比赛时间。
新增 `捕快荣誉 服务器``江湖浪客 服务器` 指令,分别接入 JX3API `/rank/constable``/rank/outlaw`。两个榜单复用同一数据处理流程和统一表格模板,按接口数组顺序生成排名,展示角色、帮会、门派、阵营和抓捕数;江湖浪客榜额外展示敌对数。
新增 `决斗挑战 服务器 [模式]` 指令,接入 JX3API `/rank/wanted`;模式支持 `1=公开``2=私密`,默认为 `1`。榜单按接口数组顺序生成排名,展示被悬赏角色、门派、赏金、剩余时间和发起人,并将 `timeOut` 结束时间戳转换为动态剩余时长。
统一图片列表中的阵营列:浩气盟、恶人谷和中立改为显示 `templates/img` 内对应图标,不再显示阵营文本;空值或未识别阵营使用“未知”图标兜底。
### version: 3.4.42026-09-05):
烟花查询在角色名称后新增可选的“条数”参数,默认展示前 50 条,支持指定正整数条数;沿用已绑定会话省略服务器的用法,并同步更新功能帮助和 README。上游接口未提供条数参数,查询结果在本地截取后生成图片。
+6 -1
View File
@@ -166,6 +166,11 @@ JX3API Token 可从 [JX3API](https://www.jx3api.com/) 获取。推栏 Ticket 通
| `战绩 服务器 角色 [模式]` | 角色名剑战绩,模式可选 `22``33``55`,默认 `33`;图片 | Token + Ticket |
| `名剑排行 [模式] [数量]` | 名剑大会排行,默认 `33`、50 条;图片 | Token + Ticket |
| `名剑统计 [模式]` | 名剑门派统计,模式默认 `33`;图片 | Token + Ticket |
| `跨服名剑 服务器 [模式]` | 跨服名剑队伍榜单,模式可选 `0`2v2)、`1`3v3)、`2`5v5),默认 `1`;图片 | TokenLV.2 |
| `武林争霸 服务器 [阵营]` | 武林争霸赛帮会榜,阵营可选 `1`(浩气)、`2`(恶人),默认 `1`;图片 | TokenLV.2 |
| `捕快荣誉 服务器` | 捕快荣誉榜,展示角色、帮会、门派、阵营和抓捕数;图片 | Token(LV.2 |
| `江湖浪客 服务器` | 江湖浪客榜,展示角色、帮会、门派、阵营、抓捕数和敌对数;图片 | Token(LV.2 |
| `决斗挑战 服务器 [模式]` | 决斗挑战悬赏榜,模式可选 `1`(公开)、`2`(私密),默认 `1`;图片 | TokenLV.2 |
| `帮会排行 服务器` | 回复序号选择神兵宝甲或爱心帮会榜单,最多保留前 50 条;图片 | Token |
| `阵营排行 服务器` | 回复序号选择赛季、上周或本周阵营榜单,最多保留前 50 条;图片 | Token |
| `其他排行 服务器` | 回复序号选择名士、老江湖、名师等其他榜单,最多保留前 50 条;图片 | Token |
@@ -522,7 +527,7 @@ git diff --check
## 当前版本状态
以下内容是对 v3.4.4 当前源码的静态核对结果,部署和二次开发前应注意:
以下内容是对 v3.4.5 当前源码的静态核对结果,部署和二次开发前应注意:
1. 查询图片使用浅色高对比主题和放大的内容区域;渲染清晰度、JPEG/PNG 格式及 JPEG 质量由 `image_render_quality` 配置组控制,提高清晰度或使用 PNG 会增加图片体积与渲染耗时。
2. `帮会排行``阵营排行``其他排行` 使用固定的“数字序号 → 榜单名称”首轮菜单,次轮查询统一截取接口返回的前 50 条;取得有效选择后会先停止超时计时器,避免渲染期间重复输出。
+1 -1
View File
@@ -53,7 +53,7 @@
"1.3",
"1.8"
],
"default": "1.3",
"default": "1.0",
"hint": "数值越高越清晰,同时图片更大、渲染耗时更多。"
},
"format": {
+156
View File
@@ -560,6 +560,162 @@ class JX3APIService:
template="mingjiantongji.html"
)
async def kuafumingjian(self, server: str, mode: int = 1) -> Dict[str, Any]:
"""跨服名剑榜。"""
mode_names = {0: "2v2", 1: "3v3", 2: "5v5"}
async def processor(data: Any, return_data: Dict[str, Any]) -> None:
items = data.get("data") or []
if not isinstance(items, list):
items = []
return_data["data"] = {
"items": [item for item in items if isinstance(item, dict)],
"name": data.get("name") or "跨服名剑榜",
"server": data.get("server") or server or "全区",
"mode_name": mode_names[mode],
"update_time": format_time(data.get("time")),
}
return await self._request_api(
path="/rank/arena",
params={"server": server, "mode": mode, "token": self.token},
processor=processor,
template="kuafumingjian.html",
)
async def wulinzhengba(self, server: str, camp: int = 1) -> Dict[str, Any]:
"""武林争霸赛帮会榜。"""
camp_names = {1: "浩气盟", 2: "恶人谷"}
def format_match_time(value: Any) -> str:
try:
total_seconds = int(value)
except (TypeError, ValueError):
return ""
if total_seconds < 0:
return ""
hours, remainder = divmod(total_seconds, 3600)
minutes, seconds = divmod(remainder, 60)
if hours:
return f"{hours}{minutes:02d}{seconds:02d}"
return f"{minutes}{seconds:02d}"
async def processor(data: Any, return_data: Dict[str, Any]) -> None:
items = data.get("data") or []
if not isinstance(items, list):
items = []
rank_items = []
for item in items:
if not isinstance(item, dict):
continue
rank_item = item.copy()
rank_item["lastMatchTimeText"] = format_match_time(
item.get("lastMatchTime")
)
rank_items.append(rank_item)
return_data["data"] = {
"items": rank_items,
"name": data.get("name") or "武林争霸赛",
"server": data.get("server") or server or "全区",
"camp_name": camp_names[camp],
"update_time": format_time(data.get("time")),
}
return await self._request_api(
path="/rank/championship",
params={"server": server, "camp": camp, "token": self.token},
processor=processor,
template="wulinzhengba.html",
)
async def _bounty_rank(self,server: str,path: str,fallback_name: str,show_hostile_count: bool,) -> Dict[str, Any]:
"""处理捕快荣誉和江湖浪客共用的榜单结构。"""
async def processor(data: Any, return_data: Dict[str, Any]) -> None:
items = data.get("data") or []
if not isinstance(items, list):
items = []
return_data["data"] = {
"items": [item for item in items if isinstance(item, dict)],
"name": data.get("name") or fallback_name,
"server": data.get("server") or server or "全区",
"show_hostile_count": show_hostile_count,
"update_time": format_time(data.get("time")),
}
return await self._request_api(
path=path,
params={"server": server, "token": self.token},
processor=processor,
template="bounty_rank.html",
)
async def bukairongyu(self, server: str) -> Dict[str, Any]:
"""捕快荣誉榜。"""
return await self._bounty_rank(
server=server,
path="/rank/constable",
fallback_name="捕快荣誉榜",
show_hostile_count=False,
)
async def jianghulangke(self, server: str) -> Dict[str, Any]:
"""江湖浪客榜。"""
return await self._bounty_rank(
server=server,
path="/rank/outlaw",
fallback_name="江湖浪客榜",
show_hostile_count=True,
)
async def juedoutiaozhan(self,server: str,mode: int = 1,) -> Dict[str, Any]:
"""决斗挑战榜。"""
mode_names = {1: "公开", 2: "私密"}
async def processor(data: Any, return_data: Dict[str, Any]) -> None:
items = data.get("data") or []
if not isinstance(items, list):
items = []
now_timestamp = int(datetime.now().timestamp())
rank_items = []
for item in items:
if not isinstance(item, dict):
continue
rank_item = item.copy()
try:
timeout = int(item.get("timeOut"))
except (TypeError, ValueError):
remaining_time = ""
else:
remaining_time = (
format_remaining(timeout)
if timeout > now_timestamp
else "已结束"
)
rank_item["remainingTime"] = remaining_time
rank_items.append(rank_item)
return_data["data"] = {
"items": rank_items,
"name": data.get("name") or "决斗挑战榜",
"server": data.get("server") or server or "全区",
"mode_name": mode_names[mode],
"update_time": format_time(data.get("time")),
}
return await self._request_api(
path="/rank/wanted",
params={"server": server, "mode": mode, "token": self.token},
processor=processor,
template="juedoutiaozhan.html",
)
async def banghui_rank_menu(self) -> Dict[str, str]:
"""帮会排行榜选择内容。"""
+41
View File
@@ -349,6 +349,47 @@ class MessageBuilder:
""" 名剑统计 模式"""
return await self.T2I_image_msg(event, lambda: self.jx3api.mingjiantongji(mode))
async def kuafumingjian(self, event: AstrMessageEvent, server: str, mode: int = 1,):
"""跨服名剑 服务器 [模式]。"""
if mode not in {0, 1, 2}:
return event.plain_result("竞技模式仅支持 0=2v2、1=3v3、2=5v5")
return await self.T2I_image_msg(
event,
lambda: self.jx3api.kuafumingjian(server, mode),
)
async def wulinzhengba(self,event: AstrMessageEvent,server: str,camp: int = 1,):
"""武林争霸 服务器 [阵营]。"""
if camp not in {1, 2}:
return event.plain_result("阵营仅支持 1=浩气、2=恶人")
return await self.T2I_image_msg(
event,
lambda: self.jx3api.wulinzhengba(server, camp),
)
async def bukairongyu(self, event: AstrMessageEvent, server: str):
"""捕快荣誉 服务器。"""
return await self.T2I_image_msg(
event,
lambda: self.jx3api.bukairongyu(server),
)
async def jianghulangke(self, event: AstrMessageEvent, server: str):
"""江湖浪客 服务器。"""
return await self.T2I_image_msg(
event,
lambda: self.jx3api.jianghulangke(server),
)
async def juedoutiaozhan(self,event: AstrMessageEvent,server: str,mode: int = 1,):
"""决斗挑战 服务器 [模式]。"""
if mode not in {1, 2}:
return event.plain_result("模式仅支持 1=公开、2=私密")
return await self.T2I_image_msg(
event,
lambda: self.jx3api.juedoutiaozhan(server, mode),
)
async def banghuipaihang(self, event: AstrMessageEvent, server: str):
"""帮会排行 服务器。"""
return await self.handler_plain_image_msg(
+6 -1
View File
@@ -25,7 +25,7 @@ PLUGIN_NAME = "astrbot_plugin_jx3"
@register("astrbot_plugin_jx3",
"fxdyz",
"聚合剑网三游戏数据,提供查询、图片渲染、本地避雷和实时事件推送。",
"3.4.4",
"3.4.5",
"https://github.com/qsc20001102/astrbot_plugin_jx3"
)
class Jx3ApiPlugin(Star):
@@ -254,6 +254,11 @@ class Jx3ApiPlugin(Star):
"战绩": self. jx3cmd.zhanji,
"名剑排行": self. jx3cmd.mingjianpaihang,
"名剑统计": self. jx3cmd.mingjiantongji,
"跨服名剑": self.jx3cmd.kuafumingjian,
"武林争霸": self.jx3cmd.wulinzhengba,
"捕快荣誉": self.jx3cmd.bukairongyu,
"江湖浪客": self.jx3cmd.jianghulangke,
"决斗挑战": self.jx3cmd.juedoutiaozhan,
"帮会排行": self. jx3cmd.banghuipaihang,
"阵营排行": self. jx3cmd.zhenyingpaihang,
"其他排行": self. jx3cmd.qitapaihang,
+1 -1
View File
@@ -1,7 +1,7 @@
name: astrbot_plugin_jx3
display_name: 剑网三游戏数据查询工具
desc: 聚合剑网三游戏数据,提供查询、图片渲染、本地避雷和实时事件推送。
version: 3.4.4
version: 3.4.5
author: 飞翔大野猪
repo: https://github.com/qsc20001102/astrbot_plugin_jx3
astrbot_version: ">=4.24.1"
+46
View File
@@ -0,0 +1,46 @@
{# template-title: 悬赏排行榜 #}
{# template-components: data-table #}
<div class="container data-page">
<h1>{{ name }}</h1>
<div class="data-page__meta">{{ server }}{% if update_time %} · 更新时间:{{ update_time }}{% endif %}</div>
<table class="data-table">
<thead>
<tr>
<th>排名</th>
<th>名称</th>
<th>帮会</th>
<th>门派</th>
<th>阵营</th>
<th>抓捕数</th>
{% if show_hostile_count %}<th>敌对数</th>{% endif %}
</tr>
</thead>
<tbody>
{% for item in items %}
<tr>
<td class="data-cell--rank">{{ loop.index }}</td>
<td class="data-cell--name data-cell--nowrap">{{ item.name }}</td>
<td class="data-cell--wrap">{{ item.tongName }}</td>
<td>
<div class="icon-label">
{% if icons.sect.get(item.forceName) %}
<img class="icon-label__icon" src="{{ icons.sect[item.forceName] }}" alt="{{ item.forceName }}">
{% endif %}
<span>{{ item.forceName }}</span>
</div>
</td>
{% set camp_name = item.campName or '未知' %}
<td class="data-cell--camp data-cell--nowrap">
<img class="data-camp-icon" src="{{ icons.img.get(camp_name) or icons.img.get('未知') }}" alt="{{ camp_name }}" title="{{ camp_name }}">
</td>
<td class="data-cell--score">{{ item.score }}</td>
{% if show_hostile_count %}<td class="data-cell--nowrap data-cell--numeric">{{ item.customValue0 }}</td>{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
+8 -2
View File
@@ -33,11 +33,17 @@
<td>{{ m.refreshTime }}</td>
<td>{{ m.captureTime }}</td>
<td>{{ m.captureRoleName }}</td>
<td>{{ m.captureCampName }}</td>
{% set capture_camp_name = m.captureCampName or '未知' %}
<td class="data-cell--camp data-cell--nowrap">
<img class="data-camp-icon" src="{{ icons.img.get(capture_camp_name) or icons.img.get('未知') }}" alt="{{ capture_camp_name }}" title="{{ capture_camp_name }}">
</td>
<td>{{ m.auctionTime }}</td>
<td>{{ m.auctionAmount }}</td>
<td>{{ m.auctionRoleName }}</td>
<td>{{ m.auctionCampName }}</td>
{% set auction_camp_name = m.auctionCampName or '未知' %}
<td class="data-cell--camp data-cell--nowrap">
<img class="data-camp-icon" src="{{ icons.img.get(auction_camp_name) or icons.img.get('未知') }}" alt="{{ auction_camp_name }}" title="{{ auction_camp_name }}">
</td>
</tr>
{% endfor %}
</tbody>
+4 -1
View File
@@ -30,7 +30,10 @@
class="camp-haoqi"
{% endif %}
>
<td class="data-cell--camp data-cell--nowrap data-cell--strong">{{ item.camp_name }}</td>
{% set camp_name = item.camp_name or '未知' %}
<td class="data-cell--camp data-cell--nowrap">
<img class="data-camp-icon" src="{{ icons.img.get(camp_name) or icons.img.get('未知') }}" alt="{{ camp_name }}" title="{{ camp_name }}">
</td>
<td class="data-cell--camp data-cell--name data-cell--nowrap">{{ item.castle }}</td>
<td class="data-cell--nowrap data-cell--strong">{{ item.str_status }}</td>
<td class="data-cell--time">{{ item.start_time }}</td>
+7 -3
View File
@@ -4,7 +4,7 @@
<header class="top-info help-header">
<div>
<div class="top-name">剑网三综合查询插件</div>
<div class="top-summary">18 个功能分区 · 92 个触发指令</div>
<div class="top-summary">18 个功能分区 · 97 个触发指令</div>
</div>
<div class="help-rules">
<span>参数之间使用空格分隔</span>
@@ -30,17 +30,21 @@
</section>
<section class="command-section">
<header class="command-section__header"><span class="section-index">02</span><h2>名剑相关</h2><span class="section-count">3 个触发词</span></header>
<header class="command-section__header"><span class="section-index">02</span><h2>名剑相关</h2><span class="section-count">4 个触发词</span></header>
<div class="command-list">
<div class="command-row" data-description="模式可选22、33、55"><div class="feature-name">名剑战绩</div><div class="commands"><code class="command">战绩 服务器 角色 [模式]</code></div></div>
<div class="command-row"><div class="feature-name">名剑排行</div><div class="commands"><code class="command">名剑排行 [模式] [数量]</code></div></div>
<div class="command-row"><div class="feature-name">名剑统计</div><div class="commands"><code class="command">名剑统计 [模式]</code></div></div>
<div class="command-row" data-description="模式:0=2v2、1=3v3、2=5v5,默认 1"><div class="feature-name">跨服名剑</div><div class="commands"><code class="command">跨服名剑 服务器 [模式]</code></div></div>
</div>
</section>
<section class="command-section">
<header class="command-section__header"><span class="section-index">03</span><h2>排行榜单</h2><span class="section-count">4 个触发词</span></header>
<header class="command-section__header"><span class="section-index">03</span><h2>排行榜单</h2><span class="section-count">8 个触发词</span></header>
<div class="command-list">
<div class="command-row" data-description="阵营:1=浩气、2=恶人,默认 1"><div class="feature-name">武林争霸</div><div class="commands"><code class="command">武林争霸 服务器 [阵营]</code></div></div>
<div class="command-row"><div class="feature-name">悬赏排行</div><div class="commands"><code class="command">捕快荣誉 服务器</code><code class="command">江湖浪客 服务器</code></div></div>
<div class="command-row" data-description="模式:1=公开、2=私密,默认 1"><div class="feature-name">决斗挑战</div><div class="commands"><code class="command">决斗挑战 服务器 [模式]</code></div></div>
<div class="command-row"><div class="feature-name">分类排行</div><div class="commands"><code class="command">帮会排行 服务器</code><code class="command">阵营排行 服务器</code><code class="command">其他排行 服务器</code></div></div>
<div class="command-row"><div class="feature-name">试炼排行</div><div class="commands"><code class="command">试炼排行 服务器 心法</code></div></div>
</div>
+41
View File
@@ -0,0 +1,41 @@
{# template-title: 决斗挑战榜 #}
{# template-components: data-table #}
<div class="container data-page">
<h1>{{ name }}</h1>
<div class="data-page__meta">{{ server }} · {{ mode_name }}{% if update_time %} · 更新时间:{{ update_time }}{% endif %}</div>
<table class="data-table">
<thead>
<tr>
<th>排名</th>
<th>被悬赏</th>
<th>门派</th>
<th>赏金</th>
<th>剩余时间</th>
<th>发起人</th>
</tr>
</thead>
<tbody>
{% for item in items %}
<tr>
<td class="data-cell--rank">{{ loop.index }}</td>
<td class="data-cell--name data-cell--nowrap">{{ item.name }}</td>
<td>
<div class="icon-label">
{% if icons.sect.get(item.forceName) %}
<img class="icon-label__icon" src="{{ icons.sect[item.forceName] }}" alt="{{ item.forceName }}">
{% endif %}
<span>{{ item.forceName }}</span>
</div>
</td>
<td class="data-cell--score">{{ item.money }}</td>
<td class="data-cell--time">{{ item.remainingTime }}</td>
<td class="data-cell--name data-cell--wrap">{{ item.payerName }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
+34
View File
@@ -0,0 +1,34 @@
{# template-title: 跨服名剑榜 #}
{# template-components: data-table #}
<div class="container data-page">
<h1>{{ name }}</h1>
<div class="data-page__meta">{{ server }} · {{ mode_name }}{% if update_time %} · 更新时间:{{ update_time }}{% endif %}</div>
<table class="data-table">
<thead>
<tr>
<th>排名</th>
<th>队伍名称</th>
<th>积分</th>
<th>胜场</th>
<th>败场</th>
<th>总场数</th>
</tr>
</thead>
<tbody>
{% for item in items %}
<tr>
<td class="data-cell--rank">{{ loop.index }}</td>
<td class="data-cell--name data-cell--wrap">{{ item.corpsName }}</td>
<td class="data-cell--score">{{ item.corpsLevel }}</td>
<td class="data-cell--nowrap data-cell--numeric">{{ item.seasonWinCount }}</td>
<td class="data-cell--nowrap data-cell--numeric">{{ item.seasonLoseCount }}</td>
<td class="data-cell--nowrap data-cell--numeric">{{ item.seasonTotalCount }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
+4 -1
View File
@@ -33,7 +33,10 @@
</td>
<td class="data-cell--name data-cell--nowrap">{{ item.name }}</td>
<td class="data-cell--nowrap">{{ item.level }}</td>
<td class="data-cell--nowrap">{{ item.campName }}</td>
{% set camp_name = item.campName or '未知' %}
<td class="data-cell--camp data-cell--nowrap">
<img class="data-camp-icon" src="{{ icons.img.get(camp_name) or icons.img.get('未知') }}" alt="{{ camp_name }}" title="{{ camp_name }}">
</td>
<td class="data-cell--wrap">{{ item.tongName }}</td>
<td class="data-cell--score">{{ item.totalScore }}</td>
</tr>
+4 -1
View File
@@ -38,7 +38,10 @@
<td class="data-cell--nowrap">{{ item.roleLevel }}</td>
<td class="data-cell--nowrap">{{ item.bodyName }}</td>
<td>{{ item.tongName }}</td>
<td class="data-cell--nowrap">{{ item.campName }}</td>
{% set camp_name = item.campName or '未知' %}
<td class="data-cell--camp data-cell--nowrap">
<img class="data-camp-icon" src="{{ icons.img.get(camp_name) or icons.img.get('未知') }}" alt="{{ camp_name }}" title="{{ camp_name }}">
</td>
<td class="data-cell--copy">{{ item.comment }}</td>
</tr>
{% endfor %}
+43
View File
@@ -0,0 +1,43 @@
{# template-title: 武林争霸赛 #}
{# template-components: data-table #}
<div class="container data-page">
<h1>{{ name }}</h1>
<div class="data-page__meta">{{ server }} · {{ camp_name }}{% if update_time %} · 更新时间:{{ update_time }}{% endif %}</div>
<table class="data-table">
<thead>
<tr>
<th>排名</th>
<th>帮会名称</th>
<th>帮主</th>
<th>所属服务器</th>
<th>阵营</th>
<th>胜场</th>
<th>败场</th>
<th>积分</th>
<th>最后比赛时间</th>
</tr>
</thead>
<tbody>
{% for item in items %}
<tr>
<td class="data-cell--rank">{{ loop.index }}</td>
<td class="data-cell--name data-cell--wrap">{{ item.tongName }}</td>
<td class="data-cell--name data-cell--wrap">{{ item.masterName }}</td>
<td class="data-cell--nowrap">{{ item.serverName }}</td>
{% set camp_name = item.campName or '未知' %}
<td class="data-cell--camp data-cell--nowrap">
<img class="data-camp-icon" src="{{ icons.img.get(camp_name) or icons.img.get('未知') }}" alt="{{ camp_name }}" title="{{ camp_name }}">
</td>
<td class="data-cell--nowrap data-cell--numeric">{{ item.winCount }}</td>
<td class="data-cell--nowrap data-cell--numeric">{{ item.loseCount }}</td>
<td class="data-cell--score">{{ item.totalScore }}</td>
<td class="data-cell--time">{{ item.lastMatchTimeText }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
+4 -1
View File
@@ -29,7 +29,10 @@
<td>{{ m.server }}</td>
<td>{{ m.itemName }}</td>
<td>{{ m.roleName }}</td>
<td>{{ m.campName }}</td>
{% set camp_name = m.campName or '未知' %}
<td class="data-cell--camp data-cell--nowrap">
<img class="data-camp-icon" src="{{ icons.img.get(camp_name) or icons.img.get('未知') }}" alt="{{ camp_name }}" title="{{ camp_name }}">
</td>
<td>{{ m.itemAmount }}</td>
<td>{{ m.time }}</td>
</tr>
+6 -3
View File
@@ -20,13 +20,16 @@
<tbody>
{% for item in items %}
<tr
{% if item.camp_name == '恶人谷' %}
{% if item.campName == '恶人谷' %}
class="camp-eren"
{% elif item.camp_name == '浩气盟' %}
{% elif item.campName == '浩气盟' %}
class="camp-haoqi"
{% endif %}
>
<td class="data-cell--camp data-cell--nowrap data-cell--strong">{{ item.campName }}</td>
{% set camp_name = item.campName or '未知' %}
<td class="data-cell--camp data-cell--nowrap">
<img class="data-camp-icon" src="{{ icons.img.get(camp_name) or icons.img.get('未知') }}" alt="{{ camp_name }}" title="{{ camp_name }}">
</td>
<td class="data-cell--nowrap data-cell--strong">{{ item.fenxianName }}</td>
<td class="data-cell--nowrap data-cell--strong">{{ item.friendName }}</td>
<td class="data-cell--name data-cell--copy">{{ item.roleName }}</td>
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

+8
View File
@@ -353,6 +353,14 @@
background: var(--jx3-surface-muted);
}
.jx3-template .data-camp-icon {
display: block;
width: 46px;
height: 40px;
margin: 0 auto;
object-fit: contain;
}
.jx3-template .data-table tr.camp-haoqi {
color: var(--jx3-blue);
}