@aalis/plugin-maimai 0.1.0

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 ADDED
@@ -0,0 +1,21 @@
1
+ # @aalis/plugin-maimai
2
+
3
+ 运行时插件
4
+
5
+ ## 角色
6
+
7
+ 运行时插件
8
+
9
+ ## 安装
10
+
11
+ ```bash
12
+ pnpm add @aalis/plugin-maimai
13
+ ```
14
+
15
+ ## 使用
16
+
17
+ 参考 [docs/architecture.md](../../docs/architecture.md) 与 [docs/guide/third-party-plugin.md](../../docs/guide/third-party-plugin.md)。
18
+
19
+ ## 许可
20
+
21
+ 见仓库根目录 LICENSE。
@@ -0,0 +1,17 @@
1
+ import type { ConfigSchema, Context } from '@aalis/core';
2
+ import '@aalis/plugin-tools-api';
3
+ export declare const name = "@aalis/plugin-maimai";
4
+ export declare const displayName = "\u821E\u840C DX \u67E5\u5206";
5
+ export declare const subsystem = "skills";
6
+ export declare const description = "\u57FA\u4E8E maimai.lxns.net \u5F00\u53D1\u8005 API \u7684\u821E\u840C DX \u67E5\u5206\u63D2\u4EF6\uFF0C\u63D0\u4F9B\u6307\u4EE4\u4E0E Agent \u5DE5\u5177\u53CC\u5165\u53E3";
7
+ export declare const inject: {};
8
+ export declare const configSchema: ConfigSchema;
9
+ export declare const defaultConfig: {
10
+ developerToken: string;
11
+ baseUrl: string;
12
+ enableTools: boolean;
13
+ enableCommands: boolean;
14
+ defaultBindOnPrivateChat: boolean;
15
+ };
16
+ export declare function apply(ctx: Context, rawConfig: Record<string, unknown>): void;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAMzD,OAAO,yBAAyB,CAAC;AAIjC,eAAO,MAAM,IAAI,yBAAyB,CAAC;AAC3C,eAAO,MAAM,WAAW,iCAAa,CAAC;AACtC,eAAO,MAAM,SAAS,WAAW,CAAC;AAClC,eAAO,MAAM,WAAW,gLAA6D,CAAC;AACtF,eAAO,MAAM,MAAM,IAAK,CAAC;AAEzB,eAAO,MAAM,YAAY,EAAE,YAgC1B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;CAMzB,CAAC;AA0VF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA4N5E"}
package/dist/index.js ADDED
@@ -0,0 +1,612 @@
1
+ import { useCommandService } from '@aalis/plugin-commands-api';
2
+ import { useToolService } from '@aalis/plugin-tools-api';
3
+ import '@aalis/plugin-tools-api';
4
+ // ===== 插件元数据 =====
5
+ export const name = '@aalis/plugin-maimai';
6
+ export const displayName = '舞萌 DX 查分';
7
+ export const subsystem = 'skills';
8
+ export const description = '基于 maimai.lxns.net 开发者 API 的舞萌 DX 查分插件,提供指令与 Agent 工具双入口';
9
+ export const inject = {};
10
+ export const configSchema = {
11
+ developerToken: {
12
+ type: 'string',
13
+ label: '开发者 API Token',
14
+ default: '',
15
+ description: '在 https://maimai.lxns.net 申请的开发者 token,必须配置',
16
+ secret: true,
17
+ },
18
+ baseUrl: {
19
+ type: 'string',
20
+ label: 'API Base URL',
21
+ default: 'https://maimai.lxns.net',
22
+ description: '查分器域名,一般无需修改',
23
+ },
24
+ enableTools: {
25
+ type: 'boolean',
26
+ label: '注册 Agent 工具',
27
+ default: true,
28
+ description: '为 LLM Agent 注册结构化工具(推荐保持开启)',
29
+ },
30
+ enableCommands: {
31
+ type: 'boolean',
32
+ label: '注册斜杠指令',
33
+ default: true,
34
+ description: '为用户注册 /maimai 等斜杠指令',
35
+ },
36
+ defaultBindOnPrivateChat: {
37
+ type: 'boolean',
38
+ label: '私聊缺省绑定',
39
+ default: true,
40
+ description: '在 OneBot 私聊中,若调用者未绑定但其 QQ 已注册查分器账号,自动以其 QQ 查分',
41
+ },
42
+ };
43
+ export const defaultConfig = {
44
+ developerToken: '',
45
+ baseUrl: 'https://maimai.lxns.net',
46
+ enableTools: true,
47
+ enableCommands: true,
48
+ defaultBindOnPrivateChat: true,
49
+ };
50
+ const LEVEL_NAMES = ['BASIC', 'ADVANCED', 'EXPERT', 'MASTER', 'Re:MASTER'];
51
+ // ===== 持久化(QQ ↔ 好友码 绑定) =====
52
+ const BIND_NAMESPACE = 'maimai-binding';
53
+ function bindKey(platform, userId) {
54
+ if (!platform || !userId)
55
+ return null;
56
+ return `${platform}:${userId}`;
57
+ }
58
+ async function getBoundFriendCode(ctx, platform, userId) {
59
+ const key = bindKey(platform, userId);
60
+ if (!key)
61
+ return null;
62
+ const memory = ctx.getService('memory');
63
+ if (!memory?.getMetadata)
64
+ return null;
65
+ const data = await memory.getMetadata(BIND_NAMESPACE, key);
66
+ const code = data?.friend_code;
67
+ return typeof code === 'number' ? code : null;
68
+ }
69
+ async function setBoundFriendCode(ctx, platform, userId, friendCode) {
70
+ const key = bindKey(platform, userId);
71
+ if (!key)
72
+ return false;
73
+ const memory = ctx.getService('memory');
74
+ if (!memory?.saveMetadata)
75
+ return false;
76
+ await memory.saveMetadata(BIND_NAMESPACE, key, { friend_code: friendCode, updated_at: Date.now() });
77
+ return true;
78
+ }
79
+ async function clearBoundFriendCode(ctx, platform, userId) {
80
+ const key = bindKey(platform, userId);
81
+ if (!key)
82
+ return false;
83
+ const memory = ctx.getService('memory');
84
+ if (!memory?.deleteMetadata)
85
+ return false;
86
+ await memory.deleteMetadata(BIND_NAMESPACE, key);
87
+ return true;
88
+ }
89
+ // ===== HTTP 客户端 =====
90
+ class MaimaiClient {
91
+ cfg;
92
+ logger;
93
+ constructor(cfg, logger) {
94
+ this.cfg = cfg;
95
+ this.logger = logger;
96
+ }
97
+ async request(path, params) {
98
+ if (!this.cfg.developerToken) {
99
+ throw new Error('未配置 developerToken,请在 aalis.config.yaml 中填入 maimai.lxns.net 申请的开发者 token');
100
+ }
101
+ const url = new URL(path, this.cfg.baseUrl);
102
+ if (params) {
103
+ for (const [k, v] of Object.entries(params)) {
104
+ if (v !== undefined && v !== null && v !== '')
105
+ url.searchParams.set(k, String(v));
106
+ }
107
+ }
108
+ const headers = {
109
+ Authorization: this.cfg.developerToken,
110
+ Accept: 'application/json',
111
+ };
112
+ this.logger.debug?.(`[maimai] GET ${url.toString()}`);
113
+ const resp = await fetch(url.toString(), { method: 'GET', headers });
114
+ const text = await resp.text();
115
+ let body;
116
+ try {
117
+ body = JSON.parse(text);
118
+ }
119
+ catch {
120
+ /* 非 JSON */
121
+ }
122
+ if (!resp.ok || (body && body.success === false)) {
123
+ const msg = body?.message || `HTTP ${resp.status}`;
124
+ throw new Error(`maimai API 调用失败: ${msg}`);
125
+ }
126
+ if (body && 'data' in body)
127
+ return body.data;
128
+ return text;
129
+ }
130
+ getPlayer(friendCode) {
131
+ return this.request(`/api/v0/maimai/player/${friendCode}`);
132
+ }
133
+ getPlayerByQQ(qq) {
134
+ return this.request(`/api/v0/maimai/player/qq/${qq}`);
135
+ }
136
+ getBests(friendCode) {
137
+ return this.request(`/api/v0/maimai/player/${friendCode}/bests`);
138
+ }
139
+ getApBests(friendCode) {
140
+ return this.request(`/api/v0/maimai/player/${friendCode}/bests/ap`);
141
+ }
142
+ getRecents(friendCode) {
143
+ return this.request(`/api/v0/maimai/player/${friendCode}/recents`);
144
+ }
145
+ getSongList() {
146
+ return this.request(`/api/v0/maimai/song/list`, { notes: false });
147
+ }
148
+ getAliasList() {
149
+ return this.request(`/api/v0/maimai/alias/list`);
150
+ }
151
+ }
152
+ /**
153
+ * 根据用户输入和上下文解析要查的目标。
154
+ * 优先级:
155
+ * 1. 显式 friend_code 参数
156
+ * 2. 显式 qq 参数
157
+ * 3. 当前用户已绑定的 friend_code
158
+ * 4. (仅 OneBot 私聊 + 配置允许)以触发者 QQ 查询(可能无对应账号,但让 API 自行判断)
159
+ */
160
+ async function resolveTarget(ctx, cfg, callCtx, args) {
161
+ const fc = parseIntStrict(args.friend_code);
162
+ if (fc)
163
+ return { friend_code: fc, source: 'arg-friend' };
164
+ const qq = parseIntStrict(args.qq);
165
+ if (qq)
166
+ return { qq, source: 'arg-qq' };
167
+ const bound = await getBoundFriendCode(ctx, callCtx.platform, callCtx.userId);
168
+ if (bound)
169
+ return { friend_code: bound, source: 'bound' };
170
+ // OneBot 私聊场景下尝试用调用者 QQ 查
171
+ if (cfg.defaultBindOnPrivateChat &&
172
+ callCtx.platform === 'onebot' &&
173
+ callCtx.userId &&
174
+ callCtx.sessionId.includes(':private:')) {
175
+ const userQq = parseIntStrict(callCtx.userId);
176
+ if (userQq)
177
+ return {
178
+ qq: userQq,
179
+ source: 'private-self',
180
+ hint: '使用你的 QQ 号查询查分器(如失败请先 /maimai bind <好友码>)',
181
+ };
182
+ }
183
+ return {
184
+ source: 'none',
185
+ hint: '未找到查询目标。请提供 friend_code/qq 参数,或先用 /maimai bind <好友码> 绑定自己。',
186
+ };
187
+ }
188
+ function parseIntStrict(v) {
189
+ if (typeof v === 'number' && Number.isFinite(v) && v > 0)
190
+ return Math.floor(v);
191
+ if (typeof v === 'string') {
192
+ const s = v.trim();
193
+ if (/^\d+$/.test(s))
194
+ return parseInt(s, 10);
195
+ }
196
+ return undefined;
197
+ }
198
+ async function fetchPlayer(client, target) {
199
+ if (target.friend_code)
200
+ return client.getPlayer(target.friend_code);
201
+ if (target.qq)
202
+ return client.getPlayerByQQ(target.qq);
203
+ throw new Error('解析目标失败');
204
+ }
205
+ // ===== 输出格式化 =====
206
+ function formatPlayer(p) {
207
+ const lines = [`👤 ${p.name} (DX Rating: ${p.rating})`, `🆔 好友码: ${p.friend_code}`];
208
+ if (p.trophy?.name)
209
+ lines.push(`🏆 称号: ${p.trophy.name}${p.trophy.color ? ` [${p.trophy.color}]` : ''}`);
210
+ if (typeof p.star === 'number')
211
+ lines.push(`⭐ 搭档觉醒: ${p.star}`);
212
+ if (p.upload_time)
213
+ lines.push(`🕒 同步时间: ${p.upload_time}`);
214
+ return lines.join('\n');
215
+ }
216
+ function formatScoreLine(s, idx) {
217
+ const lvIdx = LEVEL_NAMES[s.level_index] ?? `LV${s.level_index}`;
218
+ const ach = (s.achievements ?? 0).toFixed(4);
219
+ const rate = (s.rate ?? '').toUpperCase();
220
+ const fc = s.fc ? ` [${s.fc.toUpperCase()}]` : '';
221
+ const fs = s.fs ? ` [${s.fs.toUpperCase()}]` : '';
222
+ const dxr = typeof s.dx_rating === 'number' ? ` ↑${Math.floor(s.dx_rating)}` : '';
223
+ return `${String(idx).padStart(2, ' ')}. ${s.song_name ?? `#${s.id}`} [${lvIdx} ${s.level ?? ''} ${s.type}] ${ach}% ${rate}${fc}${fs}${dxr}`;
224
+ }
225
+ function formatBests(b, opts = {}) {
226
+ const topN = opts.topN ?? 50;
227
+ const total = b.standard_total + b.dx_total;
228
+ const lines = [];
229
+ lines.push(`📊 B50 总分: ${total} (B35 旧版 ${b.standard_total} + B15 现版 ${b.dx_total})`);
230
+ lines.push('');
231
+ lines.push('— 旧版 B35 —');
232
+ b.standard.slice(0, topN).forEach((s, i) => {
233
+ lines.push(formatScoreLine(s, i + 1));
234
+ });
235
+ lines.push('');
236
+ lines.push('— 现版 B15 —');
237
+ b.dx.slice(0, topN).forEach((s, i) => {
238
+ lines.push(formatScoreLine(s, i + 1));
239
+ });
240
+ return lines.join('\n');
241
+ }
242
+ function formatRecents(scores, limit) {
243
+ if (scores.length === 0)
244
+ return '(无最近游玩记录)';
245
+ const sorted = [...scores].sort((a, b) => (b.play_time ?? '').localeCompare(a.play_time ?? '')).slice(0, limit);
246
+ const lines = [`🕘 最近 ${sorted.length} 条游玩记录:`];
247
+ sorted.forEach((s, i) => {
248
+ lines.push(formatScoreLine(s, i + 1) + (s.play_time ? ` @${s.play_time}` : ''));
249
+ });
250
+ return lines.join('\n');
251
+ }
252
+ const SONG_TTL_MS = 60 * 60 * 1000; // 1 小时
253
+ async function loadSongIndex(client, cache) {
254
+ if (cache.ref && Date.now() - cache.ref.lastFetch < SONG_TTL_MS)
255
+ return cache.ref;
256
+ const [{ songs }, { aliases }] = await Promise.all([
257
+ client.getSongList(),
258
+ client.getAliasList().catch(() => ({ aliases: [] })),
259
+ ]);
260
+ const aliasMap = new Map();
261
+ for (const a of aliases)
262
+ aliasMap.set(a.song_id, a.aliases);
263
+ const idx = { songs, aliases: aliasMap, lastFetch: Date.now() };
264
+ cache.ref = idx;
265
+ return idx;
266
+ }
267
+ function searchSongs(idx, keyword, limit) {
268
+ const kw = keyword.trim().toLowerCase();
269
+ if (!kw)
270
+ return [];
271
+ const out = [];
272
+ for (const song of idx.songs) {
273
+ const aliases = idx.aliases.get(song.id) ?? [];
274
+ const hay = [String(song.id), song.title, song.artist, ...aliases].join(' ').toLowerCase();
275
+ if (hay.includes(kw))
276
+ out.push(song);
277
+ if (out.length >= limit)
278
+ break;
279
+ }
280
+ return out;
281
+ }
282
+ function formatSongMatch(song, idx) {
283
+ const aliases = idx.aliases.get(song.id) ?? [];
284
+ const lines = [
285
+ `#${song.id} 《${song.title}》 by ${song.artist}`,
286
+ ` 分类: ${song.genre} | BPM: ${song.bpm} | 版本: ${song.version}`,
287
+ ];
288
+ if (aliases.length)
289
+ lines.push(` 别名: ${aliases.slice(0, 6).join(' / ')}${aliases.length > 6 ? ` ...(+${aliases.length - 6})` : ''}`);
290
+ return lines.join('\n');
291
+ }
292
+ // ===== 插件入口 =====
293
+ export function apply(ctx, rawConfig) {
294
+ const tools = useToolService(ctx);
295
+ const cmds = useCommandService(ctx);
296
+ const cfg = {
297
+ developerToken: String(rawConfig.developerToken ?? ''),
298
+ baseUrl: String(rawConfig.baseUrl ?? 'https://maimai.lxns.net'),
299
+ enableTools: rawConfig.enableTools !== false,
300
+ enableCommands: rawConfig.enableCommands !== false,
301
+ defaultBindOnPrivateChat: rawConfig.defaultBindOnPrivateChat !== false,
302
+ };
303
+ if (!cfg.developerToken) {
304
+ ctx.logger.warn('[maimai] 未配置 developerToken,插件不会注册任何工具/指令');
305
+ return;
306
+ }
307
+ const client = new MaimaiClient(cfg, {
308
+ warn: m => ctx.logger.warn(m),
309
+ error: m => ctx.logger.error(m),
310
+ debug: m => ctx.logger.debug?.(m),
311
+ });
312
+ const songCache = { ref: null };
313
+ // ===== Agent 工具(结构化参数) =====
314
+ if (cfg.enableTools) {
315
+ tools.registerGroup({
316
+ name: 'maimai',
317
+ label: '舞萌 DX 查分',
318
+ description: '查询舞萌 DX 玩家信息、Best 50、最近成绩、曲库等',
319
+ });
320
+ // 玩家信息
321
+ tools.register({
322
+ groups: ['maimai'],
323
+ definition: {
324
+ type: 'function',
325
+ function: {
326
+ name: 'maimai_get_player_info',
327
+ description: '查询舞萌 DX 玩家基本信息(昵称、DX Rating、好友码、称号等)。可指定 friend_code 或 qq;都不传时使用调用者已绑定的好友码。',
328
+ parameters: {
329
+ type: 'object',
330
+ properties: {
331
+ friend_code: { type: 'string', description: '可选:玩家好友码(数字字符串)' },
332
+ qq: { type: 'string', description: '可选:玩家在查分器绑定的 QQ 号' },
333
+ },
334
+ required: [],
335
+ },
336
+ },
337
+ },
338
+ handler: async (args, callCtx) => handleGetPlayer(ctx, cfg, client, args, callCtx),
339
+ });
340
+ // B50
341
+ tools.register({
342
+ groups: ['maimai'],
343
+ definition: {
344
+ type: 'function',
345
+ function: {
346
+ name: 'maimai_get_b50',
347
+ description: '查询舞萌 DX 玩家的 Best 50(B35 旧版 + B15 现版)。可指定 friend_code 或 qq;都不传时使用调用者已绑定的好友码。',
348
+ parameters: {
349
+ type: 'object',
350
+ properties: {
351
+ friend_code: { type: 'string', description: '可选:玩家好友码' },
352
+ qq: { type: 'string', description: '可选:玩家 QQ 号' },
353
+ ap_only: { type: 'boolean', description: '可选:只返回 All Perfect 50(AP B50),默认 false' },
354
+ top_n: { type: 'number', description: '可选:每个分组最多返回多少条,默认 50(即全部)' },
355
+ },
356
+ required: [],
357
+ },
358
+ },
359
+ },
360
+ handler: async (args, callCtx) => handleGetBests(ctx, cfg, client, args, callCtx),
361
+ });
362
+ // Recent
363
+ tools.register({
364
+ groups: ['maimai'],
365
+ definition: {
366
+ type: 'function',
367
+ function: {
368
+ name: 'maimai_get_recents',
369
+ description: '查询舞萌 DX 玩家最近的游玩记录(按游玩时间降序)。可指定 friend_code 或 qq;都不传时使用调用者已绑定的好友码。',
370
+ parameters: {
371
+ type: 'object',
372
+ properties: {
373
+ friend_code: { type: 'string', description: '可选:玩家好友码' },
374
+ qq: { type: 'string', description: '可选:玩家 QQ 号' },
375
+ limit: { type: 'number', description: '返回条数,默认 10,最大 50' },
376
+ },
377
+ required: [],
378
+ },
379
+ },
380
+ },
381
+ handler: async (args, callCtx) => handleGetRecents(ctx, cfg, client, args, callCtx),
382
+ });
383
+ // 搜索曲目
384
+ tools.register({
385
+ groups: ['maimai'],
386
+ definition: {
387
+ type: 'function',
388
+ function: {
389
+ name: 'maimai_search_song',
390
+ description: '在舞萌 DX 曲库中按曲名/艺术家/别名/曲目 ID 搜索曲目,返回匹配项的基本信息(曲目 ID、艺术家、版本、别名等)。',
391
+ parameters: {
392
+ type: 'object',
393
+ properties: {
394
+ keyword: { type: 'string', description: '搜索关键词(中英日文均可,会匹配标题、艺术家与别名)' },
395
+ limit: { type: 'number', description: '最多返回多少条,默认 5,最大 20' },
396
+ },
397
+ required: ['keyword'],
398
+ },
399
+ },
400
+ },
401
+ handler: async (args) => handleSearchSong(client, songCache, args),
402
+ });
403
+ // 绑定好友码
404
+ tools.register({
405
+ groups: ['maimai'],
406
+ definition: {
407
+ type: 'function',
408
+ function: {
409
+ name: 'maimai_bind_user',
410
+ description: '将调用者(按 platform:userId 区分)绑定到一个查分器好友码。绑定后查询相关工具可省略参数。',
411
+ parameters: {
412
+ type: 'object',
413
+ properties: {
414
+ friend_code: { type: 'string', description: '要绑定的好友码(数字)' },
415
+ },
416
+ required: ['friend_code'],
417
+ },
418
+ },
419
+ },
420
+ handler: async (args, callCtx) => handleBind(ctx, args, callCtx),
421
+ });
422
+ tools.register({
423
+ groups: ['maimai'],
424
+ definition: {
425
+ type: 'function',
426
+ function: {
427
+ name: 'maimai_unbind_user',
428
+ description: '解绑当前调用者的舞萌 DX 好友码。',
429
+ parameters: { type: 'object', properties: {}, required: [] },
430
+ },
431
+ },
432
+ handler: async (_args, callCtx) => {
433
+ const ok = await clearBoundFriendCode(ctx, callCtx.platform, callCtx.userId);
434
+ return ok ? '已解绑你的舞萌 DX 好友码' : '解绑失败:记忆服务不可用或未绑定';
435
+ },
436
+ });
437
+ ctx.logger.info('[maimai] Agent 工具已注册');
438
+ }
439
+ // ===== 用户指令(同样的功能,文本入口) =====
440
+ //
441
+ // 设计:Agent 端走结构化原生工具;用户端走指令。两者共用 handle* 函数。
442
+ if (cfg.enableCommands) {
443
+ const callCtxOf = (argv) => ({
444
+ sessionId: argv.session.sessionId,
445
+ userId: argv.session.userId,
446
+ platform: argv.session.platform,
447
+ });
448
+ cmds.command('maimai', '舞萌 DX 查分。子指令:info/b50/recent/song/bind/unbind').action(async () => formatHelp());
449
+ cmds
450
+ .command('maimai.info [tail:text]', '查询玩家基本信息:/maimai info [friend_code|qq:<qq>]')
451
+ .action(async (argv, tail) => {
452
+ const args = parseSubArgs(tail ?? '');
453
+ return handleGetPlayer(ctx, cfg, client, args, callCtxOf(argv));
454
+ });
455
+ cmds
456
+ .command('maimai.b50 [tail:text]', '查询 Best 50:/maimai b50 [friend_code|qq:<qq>] [--ap]')
457
+ .option('ap', '--ap', { description: '仅查询 AP 成绩' })
458
+ .action(async (argv, tail) => {
459
+ const args = parseSubArgs(tail ?? '');
460
+ if (argv.options.ap === true)
461
+ args.ap_only = true;
462
+ return handleGetBests(ctx, cfg, client, args, callCtxOf(argv));
463
+ });
464
+ cmds
465
+ .command('maimai.recent [tail:text]', '最近游玩:/maimai recent [friend_code|qq:<qq>] [N]')
466
+ .action(async (argv, tail) => {
467
+ const tokens = (tail ?? '').split(/\s+/).filter(Boolean);
468
+ const args = parseSubArgs(tokens.join(' '));
469
+ const numArgs = tokens.filter(a => /^\d+$/.test(a));
470
+ if (numArgs.length >= 2)
471
+ args.limit = parseInt(numArgs[1], 10);
472
+ return handleGetRecents(ctx, cfg, client, args, callCtxOf(argv));
473
+ });
474
+ cmds.command('maimai.song <keyword:text>', '搜索曲目:/maimai song <关键词>').action(async (_argv, keyword) => {
475
+ const kw = (keyword ?? '').trim();
476
+ if (!kw)
477
+ return '用法: /maimai song <关键词>';
478
+ return handleSearchSong(client, songCache, { keyword: kw, limit: 5 });
479
+ });
480
+ cmds
481
+ .command('maimai.bind <code:string>', '绑定自己的好友码:/maimai bind <friend_code>')
482
+ .action(async (argv, code) => {
483
+ const fc = parseIntStrict(code);
484
+ if (!fc)
485
+ return '用法: /maimai bind <好友码>';
486
+ return handleBind(ctx, { friend_code: String(fc) }, callCtxOf(argv));
487
+ });
488
+ cmds.command('maimai.unbind', '解绑自己').action(async (argv) => {
489
+ const ok = await clearBoundFriendCode(ctx, argv.session.platform, argv.session.userId);
490
+ return ok ? '已解绑' : '解绑失败';
491
+ });
492
+ ctx.logger.info('[maimai] 斜杠指令已注册');
493
+ }
494
+ }
495
+ // ===== 处理函数(工具与指令共用) =====
496
+ async function handleGetPlayer(ctx, cfg, client, args, callCtx) {
497
+ const target = await resolveTarget(ctx, cfg, callCtx, args);
498
+ if (target.source === 'none')
499
+ return target.hint;
500
+ try {
501
+ const player = await fetchPlayer(client, target);
502
+ const head = target.hint ? `(${target.hint})\n` : '';
503
+ return head + formatPlayer(player);
504
+ }
505
+ catch (err) {
506
+ return `查询失败: ${err instanceof Error ? err.message : String(err)}`;
507
+ }
508
+ }
509
+ async function handleGetBests(ctx, cfg, client, args, callCtx) {
510
+ const target = await resolveTarget(ctx, cfg, callCtx, args);
511
+ if (target.source === 'none')
512
+ return target.hint;
513
+ // bests 接口仅支持 friend_code;若来源是 qq,先 lookup
514
+ let friendCode = target.friend_code;
515
+ try {
516
+ if (!friendCode && target.qq) {
517
+ const p = await client.getPlayerByQQ(target.qq);
518
+ friendCode = p.friend_code;
519
+ }
520
+ if (!friendCode)
521
+ return '无法解析好友码';
522
+ const apOnly = args.ap_only === true;
523
+ const topN = parseIntStrict(args.top_n) ?? 50;
524
+ const bests = apOnly ? await client.getApBests(friendCode) : await client.getBests(friendCode);
525
+ const head = target.hint ? `(${target.hint})\n` : '';
526
+ return head + (apOnly ? '【AP B50】\n' : '') + formatBests(bests, { topN });
527
+ }
528
+ catch (err) {
529
+ return `查询失败: ${err instanceof Error ? err.message : String(err)}`;
530
+ }
531
+ }
532
+ async function handleGetRecents(ctx, cfg, client, args, callCtx) {
533
+ const target = await resolveTarget(ctx, cfg, callCtx, args);
534
+ if (target.source === 'none')
535
+ return target.hint;
536
+ let friendCode = target.friend_code;
537
+ try {
538
+ if (!friendCode && target.qq) {
539
+ const p = await client.getPlayerByQQ(target.qq);
540
+ friendCode = p.friend_code;
541
+ }
542
+ if (!friendCode)
543
+ return '无法解析好友码';
544
+ const limit = Math.min(50, Math.max(1, parseIntStrict(args.limit) ?? 10));
545
+ const scores = await client.getRecents(friendCode);
546
+ return formatRecents(scores, limit);
547
+ }
548
+ catch (err) {
549
+ return `查询失败: ${err instanceof Error ? err.message : String(err)}`;
550
+ }
551
+ }
552
+ async function handleSearchSong(client, cache, args) {
553
+ const keyword = String(args.keyword ?? '').trim();
554
+ if (!keyword)
555
+ return '请提供搜索关键词';
556
+ const limit = Math.min(20, Math.max(1, parseIntStrict(args.limit) ?? 5));
557
+ try {
558
+ const idx = await loadSongIndex(client, cache);
559
+ const matches = searchSongs(idx, keyword, limit);
560
+ if (matches.length === 0)
561
+ return `未找到匹配「${keyword}」的曲目`;
562
+ const head = `🔍 共 ${matches.length} 条匹配 (关键词: ${keyword})`;
563
+ return [head, ...matches.map(m => formatSongMatch(m, idx))].join('\n\n');
564
+ }
565
+ catch (err) {
566
+ return `查询失败: ${err instanceof Error ? err.message : String(err)}`;
567
+ }
568
+ }
569
+ async function handleBind(ctx, args, callCtx) {
570
+ const fc = parseIntStrict(args.friend_code);
571
+ if (!fc)
572
+ return '请提供有效的好友码(数字)';
573
+ const ok = await setBoundFriendCode(ctx, callCtx.platform, callCtx.userId, fc);
574
+ if (!ok)
575
+ return '绑定失败:记忆服务未提供 saveMetadata,或未识别到 platform:userId';
576
+ return `已将 ${callCtx.platform}:${callCtx.userId} 绑定到好友码 ${fc}`;
577
+ }
578
+ // ===== 指令参数解析 =====
579
+ /**
580
+ * 解析子指令的常见参数:
581
+ * - 一个纯数字 → friend_code
582
+ * - qq:数字 → qq
583
+ */
584
+ function parseSubArgs(tail) {
585
+ const out = {};
586
+ for (const a of tail.split(/\s+/).filter(Boolean)) {
587
+ if (a.startsWith('--'))
588
+ continue;
589
+ if (/^qq:\d+$/i.test(a)) {
590
+ out.qq = a.slice(3);
591
+ }
592
+ else if (/^\d{3,}$/.test(a)) {
593
+ if (out.friend_code === undefined)
594
+ out.friend_code = a;
595
+ }
596
+ }
597
+ return out;
598
+ }
599
+ function formatHelp() {
600
+ return [
601
+ '舞萌 DX 查分指令:',
602
+ ' /maimai info [friend_code|qq:<qq>] - 查询玩家信息',
603
+ ' /maimai b50 [friend_code|qq:<qq>] [--ap] - 查询 Best 50',
604
+ ' /maimai recent [friend_code|qq:<qq>] [N] - 最近 N 条游玩',
605
+ ' /maimai song <关键词> - 搜索曲目(含别名)',
606
+ ' /maimai bind <friend_code> - 绑定自己的好友码',
607
+ ' /maimai unbind - 解绑',
608
+ '',
609
+ '提示:绑定后,info/b50/recent 可省略参数;OneBot 私聊默认尝试以你的 QQ 查询。',
610
+ ].join('\n');
611
+ }
612
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@aalis/plugin-maimai",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "keywords": [
6
+ "aalis-plugin"
7
+ ],
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "dependencies": {
14
+ "@aalis/plugin-commands-api": "^0.1.0",
15
+ "@aalis/plugin-tools-api": "^0.1.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^22.0.0",
19
+ "typescript": "^5.7.0",
20
+ "@aalis/core": "0.1.0",
21
+ "@aalis/plugin-memory-api": "0.1.0",
22
+ "@aalis/plugin-webui-api": "0.1.0"
23
+ },
24
+ "peerDependencies": {
25
+ "@aalis/core": "^0.1.0"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc",
29
+ "dev": "tsc --watch"
30
+ }
31
+ }