fix: forward

This commit is contained in:
idranme 2024-10-26 00:14:27 +08:00
parent 78f04f0ba2
commit 9be43de04b
No known key found for this signature in database
GPG Key ID: D0F3677546E6ECD5
3 changed files with 34 additions and 26 deletions

View File

@ -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) {

View File

@ -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 }
}
}

View File

@ -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()