From 5745f388a9f701f0b955bd1b31cc431c4b71a093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sun, 29 Sep 2024 12:19:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81=20?= =?UTF-8?q?#415?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot/action/go-cqhttp/GetForwardMsg.ts | 88 +++++++++++--------- 1 file changed, 49 insertions(+), 39 deletions(-) diff --git a/src/onebot/action/go-cqhttp/GetForwardMsg.ts b/src/onebot/action/go-cqhttp/GetForwardMsg.ts index f69c9af1..29e2dee3 100644 --- a/src/onebot/action/go-cqhttp/GetForwardMsg.ts +++ b/src/onebot/action/go-cqhttp/GetForwardMsg.ts @@ -1,9 +1,16 @@ import BaseAction from '../BaseAction'; -import { OB11ForwardMessage, OB11Message, OB11MessageData, OB11MessageDataType, OB11MessageNode } from '@/onebot'; +import { OB11ForwardMessage, OB11Message, OB11MessageData, OB11MessageDataType, OB11MessageForward, OB11MessageNode as OriginalOB11MessageNode } from '@/onebot'; import { ActionName } from '../types'; import { FromSchema, JSONSchema } from 'json-schema-to-ts'; import { MessageUnique } from '@/common/message-unique'; +type OB11MessageNode = OriginalOB11MessageNode & { + data: { + content?: Array; + message: Array; + }; +}; + const SchemaData = { type: 'object', properties: { @@ -17,59 +24,61 @@ type Payload = FromSchema; export class GoCQHTTPGetForwardMsgAction extends BaseAction { actionName = ActionName.GoCQHTTP_GetForwardMsg; payloadSchema = SchemaData; - async parseForward(msg: OB11Message[]) { - let retMsg: Array } - }> = []; - for (let message of msg) { - let templateNode: OB11MessageNode & { - data: { message: Array } - } = { - type: OB11MessageDataType.node, - data: { - user_id: 10001, - nickname: "QQ用户", - message: [], - content: [] - } - }; + private createTemplateNode(message: OB11Message): OB11MessageNode { + return { + type: OB11MessageDataType.node, + data: { + user_id: message.user_id, + nickname: message.sender.nickname, + message: [], + content: [] + } + }; + } - templateNode.data.nickname = message.sender.nickname; - templateNode.data.user_id = message.user_id; + async parseForward(messages: OB11Message[]): Promise { + const retMsg: OB11MessageNode[] = []; - for (let msgdata of message.message) { - if (typeof msgdata !== 'string' && msgdata.type === OB11MessageDataType.forward) { - templateNode.data.message.push(...(await this.parseForward(msgdata.data.content))); - } - if (typeof msgdata !== 'string') { - templateNode.data.message.push(msgdata); + for (const message of messages) { + const templateNode = this.createTemplateNode(message); + + for (const msgdata of message.message) { + if ((msgdata as OB11MessageData).type === OB11MessageDataType.forward) { + const newNode = this.createTemplateNode(message); + newNode.data.content = await this.parseForward((msgdata as OB11MessageForward).data.content); + templateNode.data.message.push(newNode); + } else { + templateNode.data.message.push(msgdata as OB11MessageData); } } retMsg.push(templateNode); } - return retMsg; + return retMsg; } + async _handle(payload: Payload): Promise { const msgId = payload.message_id || payload.id; if (!msgId) { - throw Error('message_id is required'); + throw new Error('message_id is required'); } + const rootMsgId = MessageUnique.getShortIdByMsgId(msgId); const rootMsg = MessageUnique.getMsgIdAndPeerByShortId(rootMsgId || parseInt(msgId)); if (!rootMsg) { - throw Error('msg not found'); + throw new Error('msg not found'); } + const data = await this.core.apis.MsgApi.getMultiMsg(rootMsg.Peer, rootMsg.MsgId, rootMsg.MsgId); if (!data || data.result !== 0) { - throw Error('找不到相关的聊天记录' + data?.errMsg); + throw new Error('找不到相关的聊天记录' + data?.errMsg); } + const msgList = data.msgList; const messages = (await Promise.all(msgList.map(async msg => { - const resMsg = await this.obContext.apis.MsgApi - .parseMessage(msg); - if (!resMsg) return; + const resMsg = await this.obContext.apis.MsgApi.parseMessage(msg); + if (!resMsg) return null; resMsg.message_id = MessageUnique.createUniqueMsgId({ guildId: '', chatType: msg.chatType, @@ -77,15 +86,16 @@ export class GoCQHTTPGetForwardMsgAction extends BaseAction { }, msg.msgId)!; return resMsg; }))).filter(msg => !!msg); - messages.map(msg => { - (msg).content = msg.message; - delete (msg).message; - }); - //遍历合并的所有消息 - if (this.obContext.configLoader.configData.messagePostFormat == 'array') { + + if (this.obContext.configLoader.configData.messagePostFormat === 'array') { return await this.parseForward(messages); } + messages.forEach(msg => { + (msg as OB11ForwardMessage).content = msg.message; + delete (msg as any).message; + }); + return { messages }; } -} +} \ No newline at end of file