koishi-plugin-bns-rate 1.2.3 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -11
- package/index.js +17 -25
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -38,16 +38,16 @@
|
|
|
38
38
|
|
|
39
39
|
### 报价区排版可选四种(`ratesBox`)
|
|
40
40
|
|
|
41
|
-
| 值 | 效果 | QQ 官方文档支持 |
|
|
42
|
-
| --- | --- | --- |
|
|
43
|
-
| **`code`(默认)** | 代码块 → 均匀灰底圆角框、等宽字体、两列对齐 | ❌ 不在[支持清单](https://bot.qq.com/wiki/develop/api-v2/server-inter/message/type/markdown.html)(客户端能力,安卓新版本 / iOS 才有) |
|
|
44
|
-
| `quote` | 块引用 → 灰底 + 左侧竖条 | ✅ 明确支持 |
|
|
45
|
-
| `list` | 无序列表 → 无底色,缩进 + 圆点 | ✅ 明确支持 |
|
|
46
|
-
| `none` | 不包裹,纯文本行 | — |
|
|
41
|
+
| 值 | 效果 | QQ 官方文档支持 |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| **`code`(默认)** | 代码块 → 均匀灰底圆角框、等宽字体、两列对齐 | ❌ 不在[支持清单](https://bot.qq.com/wiki/develop/api-v2/server-inter/message/type/markdown.html)(客户端能力,安卓新版本 / iOS 才有) |
|
|
44
|
+
| `quote` | 块引用 → 灰底 + 左侧竖条 | ✅ 明确支持 |
|
|
45
|
+
| `list` | 无序列表 → 无底色,缩进 + 圆点 | ✅ 明确支持 |
|
|
46
|
+
| `none` | 不包裹,纯文本行 | — |
|
|
47
47
|
|
|
48
48
|
拿不准就在群里发 **`bnsrate.box`**:它会发一条含四种样式的对照卡片,挑一个填进设置页即可。若手机上 ` ``` ` 显示成了原文,说明该客户端不支持代码块,换成 `quote`。
|
|
49
49
|
|
|
50
|
-
> ⚠️
|
|
50
|
+
> ⚠️ **本插件不输出任何 HTML 标签**。手机端 QQ(安卓 / iOS)不渲染 HTML,`<font color="#E60012">151.51</font>` 会被**原样显示成一串乱码文字**(实测确认)。因此 1.2.5 起**移除了颜色功能**,报价一律按纯文本输出,四种排版在手机上都是干净的。
|
|
51
51
|
|
|
52
52
|
其它平台(OneBot / Telegram 等)、QQ 频道(`qqguild`)、以及卡片发送失败时,都会**自动回退为纯文本**,不会发不出消息。
|
|
53
53
|
|
|
@@ -90,15 +90,13 @@
|
|
|
90
90
|
| `button` | `true` | 是否显示底部跳转按钮 |
|
|
91
91
|
| `buttonText` | `点此直达DD373网站` | 按钮文字 |
|
|
92
92
|
| `buttonUrl` | `https://www.dd373.com/s-d5gqt8.html` | 按钮跳转链接 |
|
|
93
|
-
| `ratesBox` | `code` | 报价区排版:`code`
|
|
94
|
-
| `colorForward` | `#E60012` | 「1元=xx神石」数字颜色,留空不染色。**仅 `ratesBox` 不是 `code` 时才生效** |
|
|
95
|
-
| `colorReverse` | `#00A650` | 「1神石=xx元」数字颜色,留空不染色。同上 |
|
|
93
|
+
| `ratesBox` | `code` | 报价区排版:`code` 代码块(灰框/等宽/对齐)/`quote` 块引用/`list` 列表/`none` 不包裹。发 `bnsrate.box` 可看四种对照 |
|
|
96
94
|
| `decimalsForward` | `2` | 「1元=xx神石」保留小数位(**截断**,不四舍五入),`0` = 原始值 |
|
|
97
95
|
| `decimalsReverse` | `4` | 「1神石=xx元」保留小数位(截断),`0` = 原始值 |
|
|
98
96
|
|
|
99
97
|
## ⚠️ 注意事项
|
|
100
98
|
|
|
101
|
-
1.
|
|
99
|
+
1. **不输出 HTML 标签,手机端才干净**。QQ 官方 Markdown 的[支持格式](https://bot.qq.com/wiki/develop/api-v2/server-inter/message/type/markdown.html)里没有字体颜色;颜色只能靠 HTML 标签实现,而**安卓 / iOS 会把这串标签当纯文本原样显示出来**(实测:手机上会看到 `<font color="#E60012">151.51</font>` 这样的乱码)。所以 1.2.5 起**颜色功能已彻底移除**,报价用"灰框 + 等宽对齐"(`code`)或引用 / 列表来排版。
|
|
102
100
|
2. **横幅图片必须是公网直链**,QQ 会下载并转存该资源。请勿使用官方的 `server-temp`(首次访问后即删除文件,群里多人同时查看会出现白图)。
|
|
103
101
|
3. 群聊/单聊自定义 Markdown 自 2026/04/23 起已开放给所有机器人,**无需申请 Markdown 模板**;QQ 频道(`qqguild`)场景仍需内邀开通,本插件在频道下自动回退纯文本。
|
|
104
102
|
4. 命令回复属被动消息,不占用主动消息配额。
|
package/index.js
CHANGED
|
@@ -28,7 +28,7 @@ const Config = Schema.object({
|
|
|
28
28
|
.description('💬 用 QQ官方 Markdown 卡片回复(仅官方QQ机器人「群/私聊」生效;频道机器人、OneBot 等其它平台自动回退纯文本,发送失败也会回退)'),
|
|
29
29
|
title: Schema.string()
|
|
30
30
|
.default('神石比例实时播报')
|
|
31
|
-
.description('卡片顶部标题(#
|
|
31
|
+
.description('卡片顶部标题(# 一级标题)。留空则不输出标题——若横幅图上已经有标题文字,把这里清空即可'),
|
|
32
32
|
|
|
33
33
|
bannerUrl: Schema.string()
|
|
34
34
|
.default('')
|
|
@@ -66,12 +66,6 @@ const Config = Schema.object({
|
|
|
66
66
|
.default(DEFAULT_BUTTON_URL)
|
|
67
67
|
.description('按钮跳转的链接'),
|
|
68
68
|
|
|
69
|
-
colorForward: Schema.string()
|
|
70
|
-
.default('#E60012')
|
|
71
|
-
.description('「1元=xx神石」数字颜色,如 #E60012,留空即不染色。⚠️ 仅当 ratesBox 不是 code 时才有意义;手机端不渲染颜色,会把这串标签当文字显示出来'),
|
|
72
|
-
colorReverse: Schema.string()
|
|
73
|
-
.default('#00A650')
|
|
74
|
-
.description('「1神石=xx元」数字颜色,如 #00A650,留空即不染色。同上'),
|
|
75
69
|
ratesBox: Schema.union(['code', 'quote', 'list', 'none'])
|
|
76
70
|
.default('code')
|
|
77
71
|
.description('📦 报价区排版:code = 代码块(灰色框、等宽、两列对齐,但不支持颜色,且代码块不在 QQ 官方支持清单里);quote = 块引用(官方支持,灰底+左侧竖条,桌面端有颜色);list = 无序列表(官方支持,无底色);none = 不包裹。</br>拿不准就在群里发 bnsrate.box 看对照图,挑一个填这里'),
|
|
@@ -140,11 +134,6 @@ function formatTime(timestamp, withSeconds) {
|
|
|
140
134
|
return withSeconds ? `${date} ${time}:${pad2(d.getUTCSeconds())}` : `${date} ${time}`
|
|
141
135
|
}
|
|
142
136
|
|
|
143
|
-
function colorize(text, color) {
|
|
144
|
-
const c = String(color || '').trim()
|
|
145
|
-
return c ? `<font color="${c}">${text}</font>` : String(text)
|
|
146
|
-
}
|
|
147
|
-
|
|
148
137
|
// 按位截断(不四舍五入),并补足小数位;decimals 为 0 时返回原始值
|
|
149
138
|
// 先定点到 d+2 位消除浮点误差(否则 0.0066 * 10000 会得到 65.9999 这种值)
|
|
150
139
|
function truncate(value, decimals) {
|
|
@@ -176,15 +165,20 @@ function formatText(rates, timestamp, opts = {}) {
|
|
|
176
165
|
}
|
|
177
166
|
|
|
178
167
|
// QQ官方 Markdown 卡片源码
|
|
168
|
+
// 按"块"拼装、块之间用空行分隔:任何一块留空/关闭就整块不输出,
|
|
169
|
+
// 这样不会出现空标题(`# `)、也不会在开头/结尾留下多余空行
|
|
179
170
|
function buildCardMarkdown(rates, timestamp, config) {
|
|
180
171
|
const time = formatTime(timestamp, false)
|
|
181
|
-
const
|
|
172
|
+
const blocks = []
|
|
173
|
+
|
|
174
|
+
const title = String(config.title || '').trim()
|
|
175
|
+
if (title) blocks.push(`# ${title}`)
|
|
182
176
|
|
|
183
177
|
const banner = String(config.bannerUrl || '').trim()
|
|
184
178
|
if (banner) {
|
|
185
179
|
const w = Math.max(0, Math.round(Number(config.bannerWidth) || 0))
|
|
186
180
|
const ht = Math.max(0, Math.round(Number(config.bannerHeight) || 0))
|
|
187
|
-
|
|
181
|
+
blocks.push(``)
|
|
188
182
|
}
|
|
189
183
|
|
|
190
184
|
const intro = fillTemplate(config.intro, {
|
|
@@ -192,21 +186,22 @@ function buildCardMarkdown(rates, timestamp, config) {
|
|
|
192
186
|
time,
|
|
193
187
|
date: time.split(' ')[0],
|
|
194
188
|
}).trim()
|
|
195
|
-
if (intro)
|
|
189
|
+
if (intro) blocks.push(intro)
|
|
196
190
|
|
|
197
|
-
|
|
191
|
+
blocks.push(buildRateBlock(rates, config).join('\n'))
|
|
198
192
|
|
|
199
193
|
const footer = String(config.footer || '').trim()
|
|
200
|
-
if (config.button && footer)
|
|
194
|
+
if (config.button && footer) blocks.push(footer)
|
|
201
195
|
|
|
202
|
-
return
|
|
196
|
+
return blocks.join('\n\n').trim()
|
|
203
197
|
}
|
|
204
198
|
|
|
205
199
|
// 报价区排版。box 省略时取 config.ratesBox
|
|
206
|
-
// code = 代码块(灰色框 / 等宽 /
|
|
207
|
-
// quote =
|
|
208
|
-
// list =
|
|
200
|
+
// code = 代码块(灰色框 / 等宽 / 两列对齐)
|
|
201
|
+
// quote = 块引用(灰底 + 左侧竖条)
|
|
202
|
+
// list = 无序列表(无底色,缩进 + 圆点)
|
|
209
203
|
// none = 不加任何包裹
|
|
204
|
+
// ⚠️ 一律不输出 <font> 等 HTML 标签:手机端 QQ 不渲染 HTML,会把这串标签当纯文本显示出来
|
|
210
205
|
function buildRateBlock(rates, config, box) {
|
|
211
206
|
const mode = box || String(config.ratesBox || 'code')
|
|
212
207
|
const rows = rates.map(r => ({
|
|
@@ -221,10 +216,7 @@ function buildRateBlock(rates, config, box) {
|
|
|
221
216
|
return ['```', ...body, '```']
|
|
222
217
|
}
|
|
223
218
|
|
|
224
|
-
const body = rows.map(r =>
|
|
225
|
-
`1元 = ${colorize(r.fwd, config.colorForward)}神石 | `
|
|
226
|
-
+ `1神石 = ${colorize(r.rev, config.colorReverse)}元`
|
|
227
|
-
))
|
|
219
|
+
const body = rows.map(r => `1元 = ${r.fwd}神石 | 1神石 = ${r.rev}元`)
|
|
228
220
|
if (mode === 'quote') return body.map(l => '> ' + l)
|
|
229
221
|
if (mode === 'list') return body.map(l => '- ' + l)
|
|
230
222
|
return body
|