diff --git a/src/ntqqapi/api/msg.ts b/src/ntqqapi/api/msg.ts index 57f22d5..fa04a68 100644 --- a/src/ntqqapi/api/msg.ts +++ b/src/ntqqapi/api/msg.ts @@ -153,7 +153,17 @@ export class NTQQMsgApi extends Service { afterFirstCmd: false, cmdCB: payload => { for (const msgRecord of payload.msgList) { - if (msgRecord.peerUid === destPeer.peerUid && msgRecord.senderUid === selfUid) { + if ( + msgRecord.msgType === 11 && + msgRecord.subMsgType === 7 && + msgRecord.peerUid === destPeer.peerUid && + msgRecord.senderUid === selfUid + ) { + const element = msgRecord.elements[0] + const data = JSON.parse(element.arkElement!.bytesData) + if (data.app !== 'com.tencent.multimsg' || !data.meta.detail.resid) { + continue + } return true } } @@ -161,20 +171,12 @@ export class NTQQMsgApi extends Service { } } ) - for (const msg of data.msgList) { - const arkElement = msg.elements.find(ele => ele.arkElement) - if (!arkElement) { - continue + return data.msgList.find(msgRecord => { + const { arkElement } = msgRecord.elements[0] + if (arkElement?.bytesData.includes('com.tencent.multimsg')) { + return true } - const forwardData = JSON.parse(arkElement.arkElement!.bytesData) - if (forwardData.app !== 'com.tencent.multimsg') { - continue - } - if (msg.peerUid === destPeer.peerUid && msg.senderUid === selfUid) { - return msg - } - } - throw new Error('转发消息超时') + })! } async getSingleMsg(peer: Peer, msgSeq: string) { diff --git a/src/onebot11/action/go-cqhttp/SendForwardMsg.ts b/src/onebot11/action/go-cqhttp/SendForwardMsg.ts index 818ba42..d6a1fa7 100644 --- a/src/onebot11/action/go-cqhttp/SendForwardMsg.ts +++ b/src/onebot11/action/go-cqhttp/SendForwardMsg.ts @@ -19,7 +19,7 @@ interface Payload { interface Response { message_id: number - forward_id?: string + forward_id: string } export class SendForwardMsg extends BaseAction<Payload, Response> { @@ -60,14 +60,11 @@ export class SendForwardMsg extends BaseAction<Payload, Response> { } } - let msg: RawMessage if (fake && this.ctx.app.native.activated) { - msg = await this.handleFakeForwardNode(peer, nodes) + return await this.handleFakeForwardNode(peer, nodes) } else { - msg = await this.handleForwardNode(peer, nodes) + return await this.handleForwardNode(peer, nodes) } - const msgShortId = this.ctx.store.createMsgShortId({ chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId) - return { message_id: msgShortId } } private parseNodeContent(nodes: OB11MessageNode[]) { @@ -82,7 +79,7 @@ export class SendForwardMsg extends BaseAction<Payload, Response> { }) } - private async handleFakeForwardNode(peer: Peer, nodes: OB11MessageNode[]) { + private async handleFakeForwardNode(peer: Peer, nodes: OB11MessageNode[]): Promise<Response> { const encoder = new MessageEncoder(this.ctx, peer) const raw = await encoder.generate(nodes) const transmit = Msg.PbMultiMsgTransmit.encode({ pbItemList: raw.multiMsgItems }).finish() @@ -122,7 +119,11 @@ export class SendForwardMsg extends BaseAction<Payload, Response> { }) } }], 1800) - return msg! + const msgShortId = this.ctx.store.createMsgShortId({ + chatType: msg!.chatType, + peerUid: msg!.peerUid + }, msg!.msgId) + return { message_id: msgShortId, forward_id: resid } } catch (e) { this.ctx.logger.error('合并转发失败', e) throw new Error(`发送伪造合并转发消息失败 (res_id: ${resid} `) @@ -153,7 +154,7 @@ export class SendForwardMsg extends BaseAction<Payload, Response> { } // 返回一个合并转发的消息id - private async handleForwardNode(destPeer: Peer, messageNodes: OB11MessageNode[]) { + private async handleForwardNode(destPeer: Peer, messageNodes: OB11MessageNode[]): Promise<Response> { const selfPeer = { chatType: ChatType.C2C, peerUid: selfInfo.uid, @@ -245,8 +246,13 @@ export class SendForwardMsg extends BaseAction<Payload, Response> { if (retMsgIds.length === 0) { throw Error('转发消息失败,节点为空') } - const returnMsg = await this.ctx.ntMsgApi.multiForwardMsg(srcPeer!, destPeer, retMsgIds) - return returnMsg + const msg = await this.ctx.ntMsgApi.multiForwardMsg(srcPeer!, destPeer, retMsgIds) + const resid = JSON.parse(msg.elements[0].arkElement!.bytesData).meta.detail.resid + const msgShortId = this.ctx.store.createMsgShortId({ + chatType: msg.chatType, + peerUid: msg.peerUid + }, msg.msgId) + return { message_id: msgShortId, forward_id: resid } } } diff --git a/src/onebot11/helper/createMultiMessage.ts b/src/onebot11/helper/createMultiMessage.ts index a12cfaf..9c3a044 100644 --- a/src/onebot11/helper/createMultiMessage.ts +++ b/src/onebot11/helper/createMultiMessage.ts @@ -174,7 +174,7 @@ export class MessageEncoder { const { type, data } = segment if (type === OB11MessageDataType.Node) { await this.render(data.content as OB11MessageData[]) - const id = data.id ?? data.user_id + const id = data.uin ?? data.user_id this.uin = id ? +id : undefined this.name = data.name ?? data.nickname await this.flush()