mirror of
https://github.com/LLOneBot/LLOneBot.git
synced 2024-11-22 01:56:33 +00:00
fix: forward
This commit is contained in:
parent
78f04f0ba2
commit
9be43de04b
@ -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) {
|
||||
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user