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 CHANGED
@@ -7,7 +7,7 @@ export const MEME_BASE_CONFIG: MemeBaseConfig = {
7
7
  },
8
8
  trigger: {
9
9
  requirePrefix: true,
10
- prefixes: ["/", "#"],
10
+ prefixes: [".", "/", "#"],
11
11
  directKeywordNeedPrefix: false,
12
12
  },
13
13
  behavior: {
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 hasSlashPrefix = baseConfig.trigger.prefixes.some((p: string) => rawText.startsWith(p));
82
- if (!hasSlashPrefix) {
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: "/meme 菜单",
149
+ name: "meme 菜单",
150
150
  match: /^(?:(?:表情|meme)包?(?:菜单|展示|制作(?:列表)?)|meme\s+(?:菜单|列表|展示))$/i,
151
151
  prefixes: baseConfig.trigger.prefixes,
152
152
  description: "查看已同步的表情菜单",
153
- usage: "/meme 菜单",
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: "/meme 帮助",
165
+ name: "meme 帮助",
166
166
  match: /^(?:(?:头像|文字)?(?:表情|meme)包?(?:制作(?:菜单|教程)?|帮助|说明|指令|使用说明)|(?:头像|文字)(?:表情|meme)包?|meme\s+帮助)$/i,
167
167
  prefixes: baseConfig.trigger.prefixes,
168
168
  description: "查看表情制作教程与参数说明",
169
- usage: "/meme 帮助",
169
+ usage: ".meme 帮助",
170
170
  handler: ({ event }) => runtime.sendHelp(ctx, event),
171
171
  });
172
172
  ctx.command({
173
- name: "/meme 搜索",
173
+ name: "meme 搜索",
174
174
  match: /^(?:表情|meme)包?(?:搜索|检索)\s*(.*)$/i,
175
175
  prefixes: baseConfig.trigger.prefixes,
176
176
  description: "搜索相关表情关键词",
177
- usage: "/meme 搜索 摸",
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: "/meme 详情",
192
+ name: "meme 详情",
193
193
  match: /^meme包?\s+详情\s+(.+)$/i,
194
194
  prefixes: baseConfig.trigger.prefixes,
195
195
  description: "查看表情参数和预览",
196
- usage: "/meme 详情 摸头",
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: "/meme 更新",
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: "/meme 更新",
216
+ usage: ".meme 更新",
217
217
  handler: async ({ event }) => {
218
218
  await replyWithParts({
219
219
  ctx,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mioku-plugin-meme",
3
- "version": "3.0.2",
3
+ "version": "3.0.3",
4
4
  "description": "基于 meme-generator API 的表情包制作插件",
5
5
  "main": "index.ts",
6
6
  "type": "module",
package/shared.ts CHANGED
@@ -74,8 +74,15 @@ function getSenderName(event: any): string {
74
74
  );
75
75
  }
76
76
 
77
- function getAvatarUrl(userId: number | string | undefined): string {
78
- return `https://q1.qlogo.cn/g?b=qq&s=640&nk=${userId || 0}`;
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 = Number(source?.qq);
910
- if (!Number.isFinite(qq) || qq <= 0) {
911
- return [];
912
- }
913
- return [getAvatarUrl(qq)].slice(0, params.max_images || 1);
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(...atUserIds.map((userId) => getAvatarUrl(userId)));
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 != null
962
+ String(event?.user_id ?? "").trim()
952
963
  ) {
953
- urls.push(getAvatarUrl(event.user_id));
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(event.group_id, userId);
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"),