mioku-plugin-meme 3.0.2 → 3.0.3
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/configs/base.ts +1 -1
- package/index.ts +14 -14
- package/package.json +1 -1
- package/shared.ts +26 -11
package/configs/base.ts
CHANGED
package/index.ts
CHANGED
|
@@ -78,8 +78,8 @@ const memePlugin = definePlugin({
|
|
|
78
78
|
);
|
|
79
79
|
}
|
|
80
80
|
const rawText = ctx.text(event)?.trim() ?? "";
|
|
81
|
-
const
|
|
82
|
-
if (!
|
|
81
|
+
const hasPrefix = baseConfig.trigger.prefixes.some((p: string) => rawText.startsWith(p));
|
|
82
|
+
if (!hasPrefix) {
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
85
|
const chatRuntime = aiService?.getChatRuntime();
|
|
@@ -146,35 +146,35 @@ const memePlugin = definePlugin({
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
ctx.command({
|
|
149
|
-
name: "
|
|
149
|
+
name: "meme 菜单",
|
|
150
150
|
match: /^(?:(?:表情|meme)包?(?:菜单|展示|制作(?:列表)?)|meme\s+(?:菜单|列表|展示))$/i,
|
|
151
151
|
prefixes: baseConfig.trigger.prefixes,
|
|
152
152
|
description: "查看已同步的表情菜单",
|
|
153
|
-
usage: "
|
|
153
|
+
usage: ".meme 菜单",
|
|
154
154
|
handler: ({ event }) => runtime.sendMenu(ctx, event),
|
|
155
155
|
});
|
|
156
156
|
ctx.command({
|
|
157
|
-
name: "
|
|
157
|
+
name: "随机表情",
|
|
158
158
|
match: /^随机(?:表情|meme)(?:包)?$/i,
|
|
159
159
|
prefixes: baseConfig.trigger.prefixes,
|
|
160
160
|
description: "随机生成一个头像类表情",
|
|
161
|
-
usage: "
|
|
161
|
+
usage: ".随机表情",
|
|
162
162
|
handler: ({ event }) => runtime.sendRandom(ctx, event),
|
|
163
163
|
});
|
|
164
164
|
ctx.command({
|
|
165
|
-
name: "
|
|
165
|
+
name: "meme 帮助",
|
|
166
166
|
match: /^(?:(?:头像|文字)?(?:表情|meme)包?(?:制作(?:菜单|教程)?|帮助|说明|指令|使用说明)|(?:头像|文字)(?:表情|meme)包?|meme\s+帮助)$/i,
|
|
167
167
|
prefixes: baseConfig.trigger.prefixes,
|
|
168
168
|
description: "查看表情制作教程与参数说明",
|
|
169
|
-
usage: "
|
|
169
|
+
usage: ".meme 帮助",
|
|
170
170
|
handler: ({ event }) => runtime.sendHelp(ctx, event),
|
|
171
171
|
});
|
|
172
172
|
ctx.command({
|
|
173
|
-
name: "
|
|
173
|
+
name: "meme 搜索",
|
|
174
174
|
match: /^(?:表情|meme)包?(?:搜索|检索)\s*(.*)$/i,
|
|
175
175
|
prefixes: baseConfig.trigger.prefixes,
|
|
176
176
|
description: "搜索相关表情关键词",
|
|
177
|
-
usage: "
|
|
177
|
+
usage: ".meme 搜索 摸",
|
|
178
178
|
handler: async ({ event, match }) => {
|
|
179
179
|
const query = String(match?.[1] ?? "").trim();
|
|
180
180
|
if (!query) {
|
|
@@ -189,11 +189,11 @@ const memePlugin = definePlugin({
|
|
|
189
189
|
},
|
|
190
190
|
});
|
|
191
191
|
ctx.command({
|
|
192
|
-
name: "
|
|
192
|
+
name: "meme 详情",
|
|
193
193
|
match: /^meme包?\s+详情\s+(.+)$/i,
|
|
194
194
|
prefixes: baseConfig.trigger.prefixes,
|
|
195
195
|
description: "查看表情参数和预览",
|
|
196
|
-
usage: "
|
|
196
|
+
usage: ".meme 详情 摸头",
|
|
197
197
|
handler: async ({ event, match }) => {
|
|
198
198
|
const keyword = String(match?.[1] ?? "").trim();
|
|
199
199
|
if (!runtime.getDetail(keyword)) {
|
|
@@ -208,12 +208,12 @@ const memePlugin = definePlugin({
|
|
|
208
208
|
},
|
|
209
209
|
});
|
|
210
210
|
ctx.command({
|
|
211
|
-
name: "
|
|
211
|
+
name: "meme 更新",
|
|
212
212
|
match: /^(?:(?:表情|meme)包?更新|meme\s+更新)$/i,
|
|
213
213
|
prefixes: baseConfig.trigger.prefixes,
|
|
214
214
|
permission: baseConfig.permissions.ownerOnlyUpdate ? "master" : "member",
|
|
215
215
|
description: "刷新远端表情缓存",
|
|
216
|
-
usage: "
|
|
216
|
+
usage: ".meme 更新",
|
|
217
217
|
handler: async ({ event }) => {
|
|
218
218
|
await replyWithParts({
|
|
219
219
|
ctx,
|
package/package.json
CHANGED
package/shared.ts
CHANGED
|
@@ -74,8 +74,15 @@ function getSenderName(event: any): string {
|
|
|
74
74
|
);
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
/** qlogo 头像服务只认数字 QQ 号,openid 平台直接跳过 */
|
|
78
|
+
function getAvatarUrl(
|
|
79
|
+
userId: string | number | undefined,
|
|
80
|
+
adapter?: string,
|
|
81
|
+
): string {
|
|
82
|
+
const id = String(userId ?? "").trim();
|
|
83
|
+
if (!id || !/^\d+$/.test(id)) return "";
|
|
84
|
+
if (adapter && adapter !== "onebotv11" && adapter !== "icqq") return "";
|
|
85
|
+
return `https://q1.qlogo.cn/g?b=qq&s=640&nk=${id}`;
|
|
79
86
|
}
|
|
80
87
|
|
|
81
88
|
function extractTextAndArgs(input: string): { text: string; args: string } {
|
|
@@ -906,11 +913,11 @@ export class MemePluginRuntime {
|
|
|
906
913
|
): Promise<string[]> {
|
|
907
914
|
const sourceType = source?.type || "auto";
|
|
908
915
|
if (sourceType === "user_avatar") {
|
|
909
|
-
const qq =
|
|
910
|
-
if (!
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
916
|
+
const qq = String(source?.qq ?? "").trim();
|
|
917
|
+
if (!qq) return [];
|
|
918
|
+
return [getAvatarUrl(qq, event?.bot?.adapter)]
|
|
919
|
+
.filter(Boolean)
|
|
920
|
+
.slice(0, params.max_images || 1);
|
|
914
921
|
}
|
|
915
922
|
|
|
916
923
|
if (sourceType === "message_image") {
|
|
@@ -942,15 +949,20 @@ export class MemePluginRuntime {
|
|
|
942
949
|
|
|
943
950
|
const atUserIds = getAtUserIds(event?.message || []);
|
|
944
951
|
if (urls.length < (params.min_images || 0) && atUserIds.length > 0) {
|
|
945
|
-
urls.push(
|
|
952
|
+
urls.push(
|
|
953
|
+
...atUserIds
|
|
954
|
+
.map((userId) => getAvatarUrl(userId, event?.bot?.adapter))
|
|
955
|
+
.filter(Boolean),
|
|
956
|
+
);
|
|
946
957
|
}
|
|
947
958
|
|
|
948
959
|
if (
|
|
949
960
|
urls.length === 0 &&
|
|
950
961
|
this.baseConfig.behavior.useSenderAvatarFallback &&
|
|
951
|
-
event?.user_id
|
|
962
|
+
String(event?.user_id ?? "").trim()
|
|
952
963
|
) {
|
|
953
|
-
|
|
964
|
+
const selfAvatar = getAvatarUrl(event.user_id, event?.bot?.adapter);
|
|
965
|
+
if (selfAvatar) urls.push(selfAvatar);
|
|
954
966
|
}
|
|
955
967
|
|
|
956
968
|
return uniqueStrings(urls).slice(0, maxImages);
|
|
@@ -1008,7 +1020,10 @@ export class MemePluginRuntime {
|
|
|
1008
1020
|
const infos = await Promise.all(
|
|
1009
1021
|
atUserIds.map(async (userId) => {
|
|
1010
1022
|
try {
|
|
1011
|
-
const member = await bot.getMemberInfo(
|
|
1023
|
+
const member = await bot.getMemberInfo(
|
|
1024
|
+
String(event.group_id ?? ""),
|
|
1025
|
+
String(userId),
|
|
1026
|
+
);
|
|
1012
1027
|
return {
|
|
1013
1028
|
name: member?.card || member?.nickname || String(userId),
|
|
1014
1029
|
gender: String(member?.sex || "unknown"),
|