koishi-plugin-ll-brick 1.0.3 → 1.0.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/lib/index.js +66 -11
- package/package.json +1 -1
- package/readme.md +14 -3
package/lib/index.js
CHANGED
|
@@ -52,14 +52,54 @@ exports.Config = koishi_1.Schema.intersect([
|
|
|
52
52
|
])
|
|
53
53
|
]);
|
|
54
54
|
exports.inject = ["database"];
|
|
55
|
-
//
|
|
56
|
-
//
|
|
55
|
+
// QQ 官方机器人的 @ 只有在 markdown 消息里才会渲染,纯文本消息不识别任何 at 标签。
|
|
56
|
+
// 因此 QQ 平台的回复直接走开放平台 internal API 发 markdown(图片嵌入 markdown),
|
|
57
|
+
// 与欢迎插件同一方案;其他平台沿用原 h.at 文本消息。
|
|
58
|
+
const BRICK_IMG = 'https://img3.tofaka.com/autoupload/ontjZmlK09ZHnuFOv9znC7KXl_QqVl-bpSwqP4fJO68/20260624/lOIl/240X240/images.jpg';
|
|
59
|
+
const FIRE_IMG = 'https://img3.tofaka.com/autoupload/ontjZmlK09ZHnuFOv9znC7KXl_QqVl-bpSwqP4fJO68/20260624/xsnm/447X447/images_%282%29.jpg';
|
|
57
60
|
function atUser(session, userId) {
|
|
58
61
|
if (session?.platform === 'qq') {
|
|
59
|
-
return
|
|
62
|
+
return `<qqbot-at-user id="${userId}" />`;
|
|
60
63
|
}
|
|
61
64
|
return koishi_1.h.at(userId).toString();
|
|
62
65
|
}
|
|
66
|
+
function stripMarkdown(md) {
|
|
67
|
+
return md
|
|
68
|
+
.replace(/<qqbot-at-user[^>]*\/>/g, '')
|
|
69
|
+
.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, '[$1]($2)')
|
|
70
|
+
.replace(/^#{1,6}\s*/gm, '')
|
|
71
|
+
.replace(/\*\*([^*]+)\*\*/g, '$1')
|
|
72
|
+
.replace(/\*([^*]+)\*/g, '$1')
|
|
73
|
+
.replace(/`([^`]+)`/g, '$1')
|
|
74
|
+
.replace(/^>\s?/gm, '')
|
|
75
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
76
|
+
.trim();
|
|
77
|
+
}
|
|
78
|
+
async function sendQQMarkdown(session, imageUrl, text) {
|
|
79
|
+
const channelId = session.guildId;
|
|
80
|
+
const internal = session.bot?.internal;
|
|
81
|
+
if (!channelId || !internal || typeof internal.sendMessage !== 'function') {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
const md = imageUrl ? `\n\n${text}` : text;
|
|
85
|
+
const plain = stripMarkdown(md) || ' ';
|
|
86
|
+
try {
|
|
87
|
+
await internal.sendMessage(channelId, {
|
|
88
|
+
msg_type: 2,
|
|
89
|
+
msg_seq: 0,
|
|
90
|
+
content: plain,
|
|
91
|
+
markdown: { content: md },
|
|
92
|
+
});
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
try {
|
|
97
|
+
await internal.sendMessage(channelId, { msg_type: 0, content: plain });
|
|
98
|
+
}
|
|
99
|
+
catch (e2) { /* 忽略 */ }
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
63
103
|
async function apply(ctx, config) {
|
|
64
104
|
ctx.model.extend('brick', {
|
|
65
105
|
id: 'unsigned',
|
|
@@ -96,7 +136,7 @@ async function apply(ctx, config) {
|
|
|
96
136
|
return `已经在烧砖了`;
|
|
97
137
|
}
|
|
98
138
|
users[user].burning = true;
|
|
99
|
-
await session.send(`${koishi_1.h.image('https://img3.tofaka.com/autoupload/ontjZmlK09ZHnuFOv9znC7KXl_QqVl-bpSwqP4fJO68/20260624/xsnm/447X447/images_%282%29.jpg
|
|
139
|
+
await session.send(`${koishi_1.h.image('https://img3.tofaka.com/autoupload/ontjZmlK09ZHnuFOv9znC7KXl_QqVl-bpSwqP4fJO68/20260624/xsnm/447X447/images_%282%29.jpg')}现在开始烧砖啦,群友每发送${config.cost}条消息就烧好一块砖`);
|
|
100
140
|
let messageCount = 0;
|
|
101
141
|
const dispose = ctx.guild(session.guildId).middleware(async (session_in, next) => {
|
|
102
142
|
if (![session.selfId, session.userId].includes(session_in.userId)) {
|
|
@@ -109,7 +149,13 @@ async function apply(ctx, config) {
|
|
|
109
149
|
brick: koishi_1.$.add(row.brick, 1),
|
|
110
150
|
}], ["userId", "guildId"]);
|
|
111
151
|
users[user].burning = false;
|
|
112
|
-
|
|
152
|
+
const fireDone = `${atUser(session, session.userId)} 砖已经烧好啦`;
|
|
153
|
+
if (session.platform === 'qq') {
|
|
154
|
+
await sendQQMarkdown(session, FIRE_IMG, fireDone);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
await session.send(`${koishi_1.h.image(FIRE_IMG)}${fireDone}`);
|
|
158
|
+
}
|
|
113
159
|
}
|
|
114
160
|
}
|
|
115
161
|
return next();
|
|
@@ -153,20 +199,29 @@ async function apply(ctx, config) {
|
|
|
153
199
|
const probability = config.specialUser[targetUserId] !== undefined
|
|
154
200
|
? config.specialUser[targetUserId] / 100
|
|
155
201
|
: config.reverse / 100;
|
|
156
|
-
const brickImg = koishi_1.h.image('https://img3.tofaka.com/autoupload/ontjZmlK09ZHnuFOv9znC7KXl_QqVl-bpSwqP4fJO68/20260624/lOIl/240X240/images.jpg
|
|
202
|
+
const brickImg = koishi_1.h.image('https://img3.tofaka.com/autoupload/ontjZmlK09ZHnuFOv9znC7KXl_QqVl-bpSwqP4fJO68/20260624/lOIl/240X240/images.jpg');
|
|
203
|
+
const isQQ = session.platform === 'qq';
|
|
157
204
|
if (koishi_1.Random.bool(probability)) {
|
|
158
205
|
const muteErr = await tryMute(session.userId);
|
|
159
|
-
let msg = `${
|
|
206
|
+
let msg = `${atUser(session, targetUserId)} 夺过你的砖头,把你拍晕了 ${muteTime} 秒`;
|
|
160
207
|
if (muteErr)
|
|
161
208
|
msg += '\n因为我不是群管理员,所以并没什么卵用';
|
|
162
|
-
|
|
209
|
+
if (isQQ) {
|
|
210
|
+
await sendQQMarkdown(session, BRICK_IMG, msg);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
return `${brickImg}${msg}`;
|
|
163
214
|
}
|
|
164
215
|
else {
|
|
165
216
|
const muteErr = await tryMute(targetUserId);
|
|
166
|
-
let msg = `${
|
|
217
|
+
let msg = `${atUser(session, targetUserId)} 你被 ${atUser(session, session.userId)} 拍晕了 ${muteTime} 秒`;
|
|
167
218
|
if (muteErr)
|
|
168
219
|
msg += '\n因为我不是群管理员,所以并没什么卵用';
|
|
169
|
-
|
|
220
|
+
if (isQQ) {
|
|
221
|
+
await sendQQMarkdown(session, BRICK_IMG, msg);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
return `${brickImg}${msg}`;
|
|
170
225
|
}
|
|
171
226
|
async function tryMute(slapedUserId) {
|
|
172
227
|
users[`${session.guildId}:${slapedUserId}`].muted = true;
|
|
@@ -223,7 +278,7 @@ async function apply(ctx, config) {
|
|
|
223
278
|
const date = new Date();
|
|
224
279
|
const today = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
|
|
225
280
|
let brick = koishi_1.Random.int(config.minGain, config.maxGain + 1);
|
|
226
|
-
const signImg = koishi_1.h.image('https://img3.tofaka.com/autoupload/ontjZmlK09ZHnuFOv9znC7KXl_QqVl-bpSwqP4fJO68/20260624/yNf2/447X447/images_%281%29.jpg
|
|
281
|
+
const signImg = koishi_1.h.image('https://img3.tofaka.com/autoupload/ontjZmlK09ZHnuFOv9znC7KXl_QqVl-bpSwqP4fJO68/20260624/yNf2/447X447/images_%281%29.jpg');
|
|
227
282
|
const userData = await ctx.database.get('brick', {
|
|
228
283
|
userId: session.userId,
|
|
229
284
|
guildId: session.guildId,
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -13,8 +13,19 @@
|
|
|
13
13
|
- `砖头 查看` — 查看自己的砖头数量
|
|
14
14
|
- `砖头 签到`(可选开启)— 每日签到获取随机砖头
|
|
15
15
|
|
|
16
|
+
## v1.0.5 修复
|
|
17
|
+
|
|
18
|
+
- 修复 **手机端 QQ 不显示图片**(电脑端正常)的问题:
|
|
19
|
+
- 根因:三张图片地址带 `/webp` 后缀,返回 `image/webp`,手机端 QQ 不渲染 webp(烧砖那张的 webp 地址甚至直接 404)
|
|
20
|
+
- 修复:全部改用无后缀的 jpg 地址(已验证返回 `image/jpeg`)
|
|
21
|
+
|
|
22
|
+
## v1.0.4 修复
|
|
23
|
+
|
|
24
|
+
- 彻底修复 **QQ 官方机器人** 上回复消息中 @(艾特)不生效的问题:
|
|
25
|
+
- 根因:QQ 官方机器人的 @ 标签(`<qqbot-at-user>`)**只在 markdown 消息里渲染**,纯文本消息会原样显示成文字(之前的 1.0.3 只改了标签格式,没改消息类型,所以还是不行)
|
|
26
|
+
- 现在:QQ 平台的回复改为**直接走开放平台 API 发送 markdown 消息**(与 `koishi-plugin-ll-group-welcome` 欢迎插件同一方案),图片嵌入 markdown,`<qqbot-at-user>` 标签正常渲染为 @ 提及
|
|
27
|
+
- 其他平台行为不变
|
|
28
|
+
|
|
16
29
|
## v1.0.3 修复
|
|
17
30
|
|
|
18
|
-
-
|
|
19
|
-
- 原实现通过 koishi 的 `at` 元素发送,适配器会序列化成已弃用的 `<@openid>` 协议
|
|
20
|
-
- 现在 QQ 平台改用官方新格式 `<qqbot-at-user id="openid" />`,其他平台行为不变
|
|
31
|
+
- 尝试修复 QQ 官方机器人 @ 不生效(改标签格式,未改消息类型,实际无效,已被 1.0.4 取代)
|