Skip to content

Commit 2404a05

Browse files
committed
feat: 使用嵌套合并转发处理多个搜索结果
1 parent 47384e7 commit 2404a05

File tree

3 files changed

+50
-15
lines changed

3 files changed

+50
-15
lines changed

apps/qqbot/src/adapter/BundledMessage.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export class BundledMessage extends BundledMessageBase<BotTypes> {
1818
return {
1919
message: this._nodes.map(node => node.compose()),
2020
source: this._title,
21-
news: this._description.split('\n').filter(it => it).map(line => ({ text: line })),
21+
news: this._description?.split('\n').filter(it => it).map(line => ({ text: line })),
2222
summary: this._summary,
2323
prompt: this._prompt
2424
};
@@ -30,15 +30,22 @@ export class BundledMessageNode extends BundledMessageNodeBase<BotTypes> {
3030
super(bot);
3131
}
3232

33+
public addBundledMessage(): BundledMessage {
34+
this._bundledMessage = new BundledMessage(this.bot);
35+
return this._bundledMessage as BundledMessage;
36+
}
37+
3338
public dispatch() {
3439
return Promise.resolve({} as any);
3540
}
3641

3742
public compose() {
38-
const content = [];
43+
let params = {
44+
content: []
45+
};
3946

4047
if (this._file) {
41-
content.push({
48+
params.content.push({
4249
type: 'image',
4350
data: {
4451
file: this._file,
@@ -48,20 +55,26 @@ export class BundledMessageNode extends BundledMessageNodeBase<BotTypes> {
4855
});
4956
}
5057
if (this._text) {
51-
content.push({
58+
params.content.push({
5259
type: 'text',
5360
data: {
5461
text: this._text
5562
}
5663
});
5764
}
65+
if (this._bundledMessage) {
66+
// @ts-ignore
67+
params = (this._bundledMessage as BundledMessage).compose();
68+
// @ts-ignore
69+
params.content = params.message;
70+
}
5871

5972
return {
6073
type: 'node',
6174
data: {
6275
nickname: 'AquaDX Bot',
6376
user_id: this.bot.selfId,
64-
content
77+
...params
6578
}
6679
};
6780
}

packages/botcore/src/modules/musicSearch.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import genSongInfoButtons from '../utils/genSongInfoButtons';
22
import { Song } from '@clansty/maibot-types/src';
33
import LyricsHelper from '../utils/LyricsHelper';
4-
import { BotTypes, MessageButtonSwitchInline, MessageButtonUrl, SendMessageAction } from '@clansty/maibot-firm';
4+
import { BotTypes, BundledMessageBase, MessageButtonSwitchInline, MessageButtonUrl, SendMessageAction } from '@clansty/maibot-firm';
55
import { BuilderEnv } from '../botBuilder';
66
import { MESSAGE_TEMPLATE } from '../MessageTemplate';
77

@@ -68,6 +68,17 @@ export default <T extends BotTypes>({ bot, env, getContext, musicToFile }: Build
6868
return true;
6969
});
7070

71+
const makeBundledMessageForSong = (bundle: BundledMessageBase<T>, song: Song) => {
72+
const msgTitle = song.display.substring(0, song.display.indexOf('\n'));
73+
const msgText = song.display.substring(song.display.indexOf('\n') + 1).trim();
74+
bundle.addNode().addPhoto(song.coverUrl);
75+
bundle.setTitle(msgTitle).setPrompt(msgTitle).setDescription(song.basicInfo.substring(song.basicInfo.indexOf('\n') + 1)).setSummary('点击查看歌曲和谱面详情');
76+
bundle.addNode().setText(msgText);
77+
for (const sheet of song.sheets) {
78+
bundle.addNode().setText(`${sheet.type === 'dx' ? 'DX ' : '标准'}谱面\n` + sheet.display.trim());
79+
}
80+
};
81+
7182
const sendSong = async (req: SendMessageAction<T>, song: Song) => {
7283
if (!song) return;
7384

@@ -85,14 +96,9 @@ export default <T extends BotTypes>({ bot, env, getContext, musicToFile }: Build
8596
content: msgText,
8697
image: song.coverUrl
8798
});
88-
bundle.addNode().addPhoto(song.coverUrl);
89-
}
90-
bundle.setTitle(msgTitle).setPrompt(msgTitle).setDescription(song.basicInfo.substring(song.basicInfo.indexOf('\n') + 1)).setSummary('点击查看歌曲和谱面详情');
91-
bundle.addNode().setText(msgText);
92-
for (const sheet of song.sheets) {
93-
bundle.addNode().setText(`${sheet.type === 'dx' ? 'DX ' : '标准'}谱面\n` + sheet.display.trim());
9499
}
95100

101+
makeBundledMessageForSong(bundle, song);
96102
const message = await req.setText(song.display).setButtons(buttons).dispatch();
97103
// 异步获取歌词,只在 undefined 的时候
98104
if (!lyrics && bot.isEditMessageSupported) {
@@ -130,10 +136,18 @@ export default <T extends BotTypes>({ bot, env, getContext, musicToFile }: Build
130136
return true;
131137
}
132138
if (results.length > 1) {
133-
await event.reply()
139+
const req = event.reply()
134140
.setText(`共找到 ${results.length} 个结果:\n\n` + results.map(song => (song.id ? song.id + '. ' : '') + song.title).join('\n'))
135-
.addButtons(new MessageButtonSwitchInline('选择结果', kw))
136-
.dispatch();
141+
.addButtons(new MessageButtonSwitchInline('选择结果', kw));
142+
143+
const bundle = req.addBundledMessage();
144+
bundle.setTitle(`共找到 ${results.length} 个结果`).setDescription(results.map(song => (song.id ? song.id + '. ' : '') + song.title).join('\n')).setSummary('点击展开').setPrompt(`歌曲搜索:${results.length} 个结果`);
145+
for (const result of results) {
146+
bundle.addNode().addPhoto(result.coverUrl);
147+
makeBundledMessageForSong(bundle.addNode().addBundledMessage(), result);
148+
}
149+
150+
await req.dispatch();
137151
return true;
138152
}
139153

packages/botfirm/src/BundledMessage.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,15 @@ export abstract class BundledMessageBase<T extends BotTypes> {
3333
export abstract class BundledMessageNodeBase<T extends BotTypes> extends BaseTextMessageAction<T> {
3434
protected _file: T['SendableFile'] = null;
3535
protected _fileType: 'audio' | 'document' | 'photo' = null;
36+
protected _bundledMessage: BundledMessageBase<T> = null;
3637

3738
public addPhoto(file: T['SendableFile']) {
3839
this._fileType = 'photo';
3940
this._file = file;
4041
return this;
4142
}
43+
44+
public abstract addBundledMessage(): BundledMessageBase<T>;
4245
}
4346

4447
export class DummyBundledMessage<T extends BotTypes> extends BundledMessageBase<T> {
@@ -59,4 +62,9 @@ export class DummyBundledMessageNode<T extends BotTypes> extends BundledMessageN
5962
public dispatch() {
6063
return Promise.resolve({} as any);
6164
}
65+
66+
public addBundledMessage() {
67+
this._bundledMessage = new DummyBundledMessage(this.bot);
68+
return this._bundledMessage;
69+
}
6270
}

0 commit comments

Comments
 (0)