Add quick_reply support to message parsing

Introduces the quick_reply boolean option to message history schema and message parsing logic. Updates relevant functions to handle quick_reply, allowing for conditional behavior during message reply and segment parsing.
This commit is contained in:
手瓜一十雪 2025-09-02 22:33:05 +08:00
parent 4d200de6b7
commit 06e7c3363a
3 changed files with 22 additions and 14 deletions

View File

@ -16,7 +16,8 @@ const SchemaData = Type.Object({
count: Type.Number({ default: 20 }), count: Type.Number({ default: 20 }),
reverseOrder: Type.Boolean({ default: false }), reverseOrder: Type.Boolean({ default: false }),
disable_get_url: Type.Boolean({ default: false }), disable_get_url: Type.Boolean({ default: false }),
parse_mult_msg: Type.Boolean({ default: true }) parse_mult_msg: Type.Boolean({ default: true }),
quick_reply: Type.Boolean({ default: false }),
}); });

View File

@ -17,6 +17,7 @@ const SchemaData = Type.Object({
reverseOrder: Type.Boolean({ default: false }), reverseOrder: Type.Boolean({ default: false }),
disable_get_url: Type.Boolean({ default: false }), disable_get_url: Type.Boolean({ default: false }),
parse_mult_msg: Type.Boolean({ default: true }), parse_mult_msg: Type.Boolean({ default: true }),
quick_reply: Type.Boolean({ default: false }),
}); });
@ -41,7 +42,7 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction<Payload, Re
})); }));
//烘焙消息 //烘焙消息
const ob11MsgList = (await Promise.all( const ob11MsgList = (await Promise.all(
msgList.map(msg => this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat, payload.parse_mult_msg, payload.disable_get_url))) msgList.map(msg => this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat, payload.parse_mult_msg, payload.disable_get_url, payload.quick_reply)))
).filter(msg => msg !== undefined); ).filter(msg => msg !== undefined);
return { 'messages': ob11MsgList }; return { 'messages': ob11MsgList };
} }

View File

@ -71,7 +71,8 @@ export type SendMessageContext = {
export type RecvMessageContext = { export type RecvMessageContext = {
parseMultMsg: boolean, parseMultMsg: boolean,
disableGetUrl: boolean disableGetUrl: boolean,
quick_reply: boolean
} }
function keyCanBeParsed(key: string, parser: RawToOb11Converters): key is keyof RawToOb11Converters { function keyCanBeParsed(key: string, parser: RawToOb11Converters): key is keyof RawToOb11Converters {
@ -256,7 +257,7 @@ export class OneBotMsgApi {
}; };
}, },
replyElement: async (element, msg) => { replyElement: async (element, msg, _, quick_reply) => {
const peer = { const peer = {
chatType: msg.chatType, chatType: msg.chatType,
peerUid: msg.peerUid, peerUid: msg.peerUid,
@ -293,7 +294,10 @@ export class OneBotMsgApi {
: replyMsgList.find(msg => msg.msgSeq === msgSeq); : replyMsgList.find(msg => msg.msgSeq === msgSeq);
if (replyMsg) return replyMsg; if (replyMsg) return replyMsg;
if (quick_reply) {
this.core.context.logger.logWarn(`快速回复跳过方法1查询序号: ${msgSeq}, 消息数: ${replyMsgList.length}`);
return undefined;
}
this.core.context.logger.logWarn(`方法1查询失败序号: ${msgSeq}, 消息数: ${replyMsgList.length}`); this.core.context.logger.logWarn(`方法1查询失败序号: ${msgSeq}, 消息数: ${replyMsgList.length}`);
} }
@ -953,18 +957,20 @@ export class OneBotMsgApi {
msg: RawMessage, msg: RawMessage,
messagePostFormat: string, messagePostFormat: string,
parseMultMsg: boolean = true, parseMultMsg: boolean = true,
disableGetUrl: boolean = false disableGetUrl: boolean = false,
quick_reply: boolean = false
) { ) {
if (messagePostFormat === 'string') { if (messagePostFormat === 'string') {
return (await this.parseMessageV2(msg, parseMultMsg, disableGetUrl))?.stringMsg; return (await this.parseMessageV2(msg, parseMultMsg, disableGetUrl, quick_reply))?.stringMsg;
} }
return (await this.parseMessageV2(msg, parseMultMsg, disableGetUrl))?.arrayMsg; return (await this.parseMessageV2(msg, parseMultMsg, disableGetUrl, quick_reply))?.arrayMsg;
} }
async parseMessageV2( async parseMessageV2(
msg: RawMessage, msg: RawMessage,
parseMultMsg: boolean = true, parseMultMsg: boolean = true,
disableGetUrl: boolean = false disableGetUrl: boolean = false,
quick_reply: boolean = false
) { ) {
if (msg.senderUin == '0' || msg.senderUin == '') return; if (msg.senderUin == '0' || msg.senderUin == '') return;
if (msg.peerUin == '0' || msg.peerUin == '') return; if (msg.peerUin == '0' || msg.peerUin == '') return;
@ -985,7 +991,7 @@ export class OneBotMsgApi {
return undefined; return undefined;
} }
const validSegments = await this.parseMessageSegments(msg, parseMultMsg, disableGetUrl); const validSegments = await this.parseMessageSegments(msg, parseMultMsg, disableGetUrl, quick_reply);
resMsg.message = validSegments; resMsg.message = validSegments;
resMsg.raw_message = validSegments.map(msg => encodeCQCode(msg)).join('').trim(); resMsg.raw_message = validSegments.map(msg => encodeCQCode(msg)).join('').trim();
@ -1056,7 +1062,7 @@ export class OneBotMsgApi {
} }
} }
private async parseMessageSegments(msg: RawMessage, parseMultMsg: boolean, disableGetUrl: boolean = false): Promise<OB11MessageData[]> { private async parseMessageSegments(msg: RawMessage, parseMultMsg: boolean, disableGetUrl: boolean = false, quick_reply: boolean = false): Promise<OB11MessageData[]> {
const msgSegments = await Promise.allSettled(msg.elements.map( const msgSegments = await Promise.allSettled(msg.elements.map(
async (element) => { async (element) => {
for (const key in element) { for (const key in element) {
@ -1071,7 +1077,7 @@ export class OneBotMsgApi {
element[key], element[key],
msg, msg,
element, element,
{ parseMultMsg, disableGetUrl } { parseMultMsg, disableGetUrl, quick_reply }
); );
if (key === 'faceElement' && !parsedElement) { if (key === 'faceElement' && !parsedElement) {
return null; return null;
@ -1225,12 +1231,12 @@ export class OneBotMsgApi {
let url = ''; let url = '';
if (mixElement?.picElement && rawMessage) { if (mixElement?.picElement && rawMessage) {
const tempData = const tempData =
await this.obContext.apis.MsgApi.rawToOb11Converters.picElement?.(mixElement?.picElement, rawMessage, mixElement, { parseMultMsg: false, disableGetUrl: false }) as OB11MessageImage | undefined; await this.obContext.apis.MsgApi.rawToOb11Converters.picElement?.(mixElement?.picElement, rawMessage, mixElement, { parseMultMsg: false, disableGetUrl: false, quick_reply: false }) as OB11MessageImage | undefined;
url = tempData?.data.url ?? ''; url = tempData?.data.url ?? '';
} }
if (mixElement?.videoElement && rawMessage) { if (mixElement?.videoElement && rawMessage) {
const tempData = const tempData =
await this.obContext.apis.MsgApi.rawToOb11Converters.videoElement?.(mixElement?.videoElement, rawMessage, mixElement, { parseMultMsg: false, disableGetUrl: false }) as OB11MessageVideo | undefined; await this.obContext.apis.MsgApi.rawToOb11Converters.videoElement?.(mixElement?.videoElement, rawMessage, mixElement, { parseMultMsg: false, disableGetUrl: false, quick_reply: false }) as OB11MessageVideo | undefined;
url = tempData?.data.url ?? ''; url = tempData?.data.url ?? '';
} }
return url !== '' ? url : await this.core.apis.FileApi.downloadMedia(msgId, peer.chatType, peer.peerUid, elementId, '', ''); return url !== '' ? url : await this.core.apis.FileApi.downloadMedia(msgId, peer.chatType, peer.peerUid, elementId, '', '');