koishi-plugin-bns-rate 1.2.1 → 1.2.2
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 +19 -9
- package/index.js +28 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,19 +16,28 @@
|
|
|
16
16
|
|
|
17
17
|
官方 QQ 机器人的**群聊 / 私聊**下,命令回复会变成 Markdown 卡片,形如:
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
````
|
|
20
20
|
# 神石比例实时播报
|
|
21
21
|
|
|
22
22
|

|
|
23
23
|
|
|
24
|
-
大家关注的 DD373 最低神石比例前5条来啦!当前时段(2026/9/10
|
|
24
|
+
大家关注的 DD373 最低神石比例前5条来啦!当前时段(2026/9/10 11:03)最优价格如下:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
1元 = 151.51 神石 | 1神石 = 0.0066元
|
|
28
|
+
1元 = 149.54 神石 | 1神石 = 0.0067元
|
|
29
|
+
1元 = 149.40 神石 | 1神石 = 0.0067元
|
|
30
|
+
```
|
|
25
31
|
|
|
26
|
-
1元 = <font color="#E60012">151.51</font>神石 | 1神石 = <font color="#00A650">0.0066</font>元
|
|
27
|
-
...
|
|
28
|
-
***
|
|
29
32
|
如需查看完整详情或进行交易,请点击下方按钮直接跳转至 DD373 官网。
|
|
30
33
|
[ 点此直达DD373网站 ]
|
|
31
|
-
|
|
34
|
+
````
|
|
35
|
+
|
|
36
|
+
报价列表默认用**代码块**包起来,在客户端渲染成**灰色框**(`ratesBox: code`)。代码块是等宽字体,插件会用空格把两列**对齐**(数字位数不同也对齐)。
|
|
37
|
+
|
|
38
|
+
> ⚠️ 手机端(安卓 / iOS)**不渲染 HTML 标签**:`<font color="#E60012">` 会**原样显示成一串字符**。因此默认的 `code` 模式**不输出任何颜色标签**;只有把 `ratesBox` 改成 `quote` / `none` 时才会输出颜色(桌面端有颜色,手机端会露出标签,自行取舍)。
|
|
39
|
+
|
|
40
|
+
若手机上把 ` ``` ` 显示成了原文(不支持代码块),把 `ratesBox` 改成 `quote`,即可换成引用样式的外框。
|
|
32
41
|
|
|
33
42
|
其它平台(OneBot / Telegram 等)、QQ 频道(`qqguild`)、以及卡片发送失败时,都会**自动回退为纯文本**,不会发不出消息。
|
|
34
43
|
|
|
@@ -71,14 +80,15 @@
|
|
|
71
80
|
| `button` | `true` | 是否显示底部跳转按钮 |
|
|
72
81
|
| `buttonText` | `点此直达DD373网站` | 按钮文字 |
|
|
73
82
|
| `buttonUrl` | `https://www.dd373.com/s-d5gqt8.html` | 按钮跳转链接 |
|
|
74
|
-
| `
|
|
75
|
-
| `
|
|
83
|
+
| `ratesBox` | `code` | 报价列表外框:`code` 代码块(灰色框、等宽、两列对齐、**无颜色**)/`quote` 引用(灰底+左侧竖条,桌面端可上色)/`none` 不加框 |
|
|
84
|
+
| `colorForward` | `#E60012` | 「1元=xx神石」数字颜色,留空不染色。**仅在 `ratesBox != code` 时生效** |
|
|
85
|
+
| `colorReverse` | `#00A650` | 「1神石=xx元」数字颜色,留空不染色。同上 |
|
|
76
86
|
| `decimalsForward` | `2` | 「1元=xx神石」保留小数位(**截断**,不四舍五入),`0` = 原始值 |
|
|
77
87
|
| `decimalsReverse` | `4` | 「1神石=xx元」保留小数位(截断),`0` = 原始值 |
|
|
78
88
|
|
|
79
89
|
## ⚠️ 注意事项
|
|
80
90
|
|
|
81
|
-
1.
|
|
91
|
+
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>` 这样的字符)。所以默认 `ratesBox: code` 完全不输出颜色标签,用**代码块灰框 + 等宽对齐**来排版;想要桌面端红绿数字就把 `ratesBox` 改成 `quote` 或 `none`,代价是手机端会露出标签。
|
|
82
92
|
2. **横幅图片必须是公网直链**,QQ 会下载并转存该资源。请勿使用官方的 `server-temp`(首次访问后即删除文件,群里多人同时查看会出现白图)。
|
|
83
93
|
3. 群聊/单聊自定义 Markdown 自 2026/04/23 起已开放给所有机器人,**无需申请 Markdown 模板**;QQ 频道(`qqguild`)场景仍需内邀开通,本插件在频道下自动回退纯文本。
|
|
84
94
|
4. 命令回复属被动消息,不占用主动消息配额。
|
package/index.js
CHANGED
|
@@ -68,10 +68,13 @@ const Config = Schema.object({
|
|
|
68
68
|
|
|
69
69
|
colorForward: Schema.string()
|
|
70
70
|
.default('#E60012')
|
|
71
|
-
.description('「1元=xx神石」数字的颜色,如 #E60012(红)。留空 = 不染色。⚠️
|
|
71
|
+
.description('「1元=xx神石」数字的颜色,如 #E60012(红)。留空 = 不染色。⚠️ ① 颜色只在桌面端 QQ 渲染;② 安卓/iOS 会把 <font> 标签当纯文本显示出来,所以仅在 ratesBox != code 时才有意义;③ 代码块内不支持颜色'),
|
|
72
72
|
colorReverse: Schema.string()
|
|
73
73
|
.default('#00A650')
|
|
74
74
|
.description('「1神石=xx元」数字的颜色,如 #00A650(绿)。留空 = 不染色'),
|
|
75
|
+
ratesBox: Schema.union(['code', 'quote', 'none'])
|
|
76
|
+
.default('code')
|
|
77
|
+
.description('📦 报价列表的外框样式:code = 代码块(灰色框,等宽字体,行列对齐,不支持颜色);quote = 引用(灰底 + 左侧竖条,桌面端可显示颜色);none = 不加框。</br>若手机上把 ``` 显示成了原文,改成 quote 即可'),
|
|
75
78
|
decimalsForward: Schema.number()
|
|
76
79
|
.default(2)
|
|
77
80
|
.min(0)
|
|
@@ -191,15 +194,30 @@ function buildCardMarkdown(rates, timestamp, config) {
|
|
|
191
194
|
}).trim()
|
|
192
195
|
if (intro) lines.push('', intro)
|
|
193
196
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
197
|
+
// 报价列表
|
|
198
|
+
const box = String(config.ratesBox || 'code')
|
|
199
|
+
const rows = rates.map(r => ({
|
|
200
|
+
fwd: truncate(r.forward, config.decimalsForward),
|
|
201
|
+
rev: truncate(r.reverse, config.decimalsReverse),
|
|
202
|
+
}))
|
|
203
|
+
|
|
204
|
+
if (box === 'code') {
|
|
205
|
+
// 代码块 = 灰色框(等宽字体,正好可以用空格把两列对齐)
|
|
206
|
+
// ⚠️ 代码块内部不支持颜色,塞 <font> 标签只会被原样显示,所以这里不加颜色
|
|
207
|
+
const wf = Math.max(...rows.map(r => r.fwd.length))
|
|
208
|
+
const wr = Math.max(...rows.map(r => r.rev.length))
|
|
209
|
+
const body = rows.map(r => `1元 = ${r.fwd.padEnd(wf)} 神石 | 1神石 = ${r.rev.padEnd(wr)}元`)
|
|
210
|
+
lines.push('', '```', ...body, '```')
|
|
211
|
+
} else {
|
|
212
|
+
const body = rows.map(r => (
|
|
213
|
+
`1元 = ${colorize(r.fwd, config.colorForward)}神石 | `
|
|
214
|
+
+ `1神石 = ${colorize(r.rev, config.colorReverse)}元`
|
|
215
|
+
))
|
|
216
|
+
lines.push('', ...(box === 'quote' ? body.map(l => '> ' + l) : body))
|
|
217
|
+
}
|
|
198
218
|
|
|
199
219
|
const footer = String(config.footer || '').trim()
|
|
200
|
-
if (config.button && footer)
|
|
201
|
-
lines.push('', '***', '', footer)
|
|
202
|
-
}
|
|
220
|
+
if (config.button && footer) lines.push('', footer)
|
|
203
221
|
|
|
204
222
|
return lines.join('\n')
|
|
205
223
|
}
|
|
@@ -228,12 +246,13 @@ function toPlainText(markdown, buttonUrl) {
|
|
|
228
246
|
.replace(/!\[[^\]]*\]\([^)]*\)/g, '') // 去掉图片(含横幅)
|
|
229
247
|
.replace(/<[^>]+>/g, '') // 去掉 <font color="..."> 等标签,保留其中文字
|
|
230
248
|
.replace(/^#{1,6}\s*/gm, '')
|
|
249
|
+
.replace(/^\s*```.*$/gm, '') // 去掉代码块围栏
|
|
231
250
|
.replace(/^\s*\*\*\*\s*$/gm, '') // 去掉水平分割线
|
|
232
251
|
.replace(/\*\*([^*]+)\*\*/g, '$1')
|
|
233
252
|
.replace(/\*([^*]+)\*/g, '$1')
|
|
234
253
|
.replace(/`([^`]+)`/g, '$1')
|
|
235
254
|
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1: $2')
|
|
236
|
-
.replace(
|
|
255
|
+
.replace(/^\s*>\s?/gm, '')
|
|
237
256
|
.replace(/[ \t]+\n/g, '\n')
|
|
238
257
|
.replace(/\n{3,}/g, '\n\n')
|
|
239
258
|
.trim()
|