diff --git a/src/core/helper/adaptDecoder.ts b/src/core/helper/adaptDecoder.ts index 8b9eda02..f3910363 100644 --- a/src/core/helper/adaptDecoder.ts +++ b/src/core/helper/adaptDecoder.ts @@ -1,36 +1,36 @@ // TODO: further refactor in NapCat.Packet v2 import { NapProtoMsg, ProtoField, ScalarType } from "@napneko/nap-proto-core"; -export const LikeDetail = { +const LikeDetail = { txt: ProtoField(1, ScalarType.STRING), uin: ProtoField(3, ScalarType.INT64), nickname: ProtoField(5, ScalarType.STRING) }; -export const LikeMsg = { +const LikeMsg = { times: ProtoField(1, ScalarType.INT32), time: ProtoField(2, ScalarType.INT32), detail: ProtoField(3, () => LikeDetail) }; -export const ProfileLikeSubTip = { +const ProfileLikeSubTip = { msg: ProtoField(14, () => LikeMsg) }; -export const ProfileLikeTip = { +const ProfileLikeTip = { msgType: ProtoField(1, ScalarType.INT32), subType: ProtoField(2, ScalarType.INT32), content: ProtoField(203, () => ProfileLikeSubTip) }; -export const SysMessageHeader = { +const SysMessageHeader = { PeerNumber: ProtoField(1, ScalarType.UINT32), PeerString: ProtoField(2, ScalarType.STRING), Uin: ProtoField(5, ScalarType.UINT32), Uid: ProtoField(6, ScalarType.STRING, true) }; -export const SysMessageMsgSpec = { +const SysMessageMsgSpec = { msgType: ProtoField(1, ScalarType.UINT32), subType: ProtoField(2, ScalarType.UINT32), subSubType: ProtoField(3, ScalarType.UINT32), @@ -40,11 +40,11 @@ export const SysMessageMsgSpec = { other: ProtoField(13, ScalarType.UINT32) }; -export const SysMessageBodyWrapper = { +const SysMessageBodyWrapper = { wrappedBody: ProtoField(2, ScalarType.BYTES) }; -export const SysMessage = { +const SysMessage = { header: ProtoField(1, () => SysMessageHeader, false, true), msgSpec: ProtoField(2, () => SysMessageMsgSpec, false, true), bodyWrapper: ProtoField(3, () => SysMessageBodyWrapper) diff --git a/src/core/helper/adaptSysMessageDecoder.ts b/src/core/helper/adaptSysMessageDecoder.ts new file mode 100644 index 00000000..6bd9122a --- /dev/null +++ b/src/core/helper/adaptSysMessageDecoder.ts @@ -0,0 +1,49 @@ +// TODO: further refactor in NapCat.Packet v2 +import { NapProtoMsg, ProtoField, ScalarType } from "@napneko/nap-proto-core"; + +const BodyInner = { + msgType: ProtoField(1, ScalarType.UINT32, true), + subType: ProtoField(2, ScalarType.UINT32, true) +}; + +const NoifyData = { + skip: ProtoField(1, ScalarType.BYTES, true), + innerData: ProtoField(2, ScalarType.BYTES, true) +}; + +const MsgHead = { + bodyInner: ProtoField(2, () => BodyInner, true), + noifyData: ProtoField(3, () => NoifyData, true) +}; + +const Message = { + msgHead: ProtoField(1, () => MsgHead) +}; + +const SubDetail = { + msgSeq: ProtoField(1, ScalarType.UINT32), + msgTime: ProtoField(2, ScalarType.UINT32), + senderUid: ProtoField(6, ScalarType.STRING) +}; + +const RecallDetails = { + operatorUid: ProtoField(1, ScalarType.STRING), + subDetail: ProtoField(3, () => SubDetail) +}; + +const RecallGroup = { + type: ProtoField(1, ScalarType.INT32), + peerUid: ProtoField(4, ScalarType.UINT32), + recallDetails: ProtoField(11, () => RecallDetails), + grayTipsSeq: ProtoField(37, ScalarType.UINT32) +}; + +export function decodeMessage(buffer: Uint8Array) { + const msg = new NapProtoMsg(Message); + return msg.decode(buffer); +} + +export function decodeRecallGroup(buffer: Uint8Array){ + const msg = new NapProtoMsg(RecallGroup); + return msg.decode(buffer); +} diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 495619f6..6b8986cc 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -46,7 +46,7 @@ import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecal import { LRUCache } from '@/common/lru-cache'; import { NodeIKernelRecentContactListener } from '@/core/listeners/NodeIKernelRecentContactListener'; import { Native } from '@/native'; -//import { decodeMessage, decodeRecallGroup } from '@/core/packet/proto/old/Message'; +import { decodeMessage, decodeRecallGroup } from "@/core/helper/adaptSysMessageDecoder"; import { BotOfflineEvent } from './event/notice/BotOfflineEvent'; //OneBot实现类 @@ -83,25 +83,24 @@ export class NapCatOneBot11Adapter { async registerNative(core: NapCatCore, context: InstanceContext) { try { this.nativeCore = new Native(context.pathWrapper.binaryPath); - // if (!this.nativeCore.inited) throw new Error('Native Not Init'); + if (!this.nativeCore.inited) throw new Error('Native Not Init'); this.nativeCore.registerRecallCallback(async (hex: string) => { try { - // TODO: refactor! - // const data = decodeMessage(Buffer.from(hex, 'hex')); - // //data.MsgHead.BodyInner.MsgType SubType - // const bodyInner = data.msgHead?.bodyInner; - // //context.logger.log("[appNative] Parse MsgType:" + bodyInner.msgType + " / SubType:" + bodyInner.subType); - // if (bodyInner && bodyInner.msgType == 732 && bodyInner.subType == 17) { - // const RecallData = Buffer.from(data.msgHead.noifyData.innerData); - // //跳过 4字节 群号 + 不知道的1字节 +2字节 长度 - // const uid = RecallData.readUint32BE(); - // const buffer = Buffer.from(RecallData.toString('hex').slice(14), 'hex'); - // const seq: number = decodeRecallGroup(buffer).recallDetails.subDetail.msgSeq; - // const peer: Peer = { chatType: ChatType.KCHATTYPEGROUP, peerUid: uid.toString() }; - // context.logger.log("[Native] 群消息撤回 Peer: " + uid.toString() + " / MsgSeq:" + seq); - // const msgs = await core.apis.MsgApi.queryMsgsWithFilterExWithSeq(peer, seq.toString()); - // this.recallMsgCache.put(msgs.msgList[0].msgId, msgs.msgList[0]); - // } + const data = decodeMessage(Buffer.from(hex, 'hex')); + //data.MsgHead.BodyInner.MsgType SubType + const bodyInner = data.msgHead?.bodyInner; + //context.logger.log("[appNative] Parse MsgType:" + bodyInner.msgType + " / SubType:" + bodyInner.subType); + if (bodyInner && bodyInner.msgType == 732 && bodyInner.subType == 17 && data?.msgHead?.noifyData?.innerData) { + const RecallData = Buffer.from(data?.msgHead?.noifyData?.innerData); + //跳过 4字节 群号 + 不知道的1字节 +2字节 长度 + const uid = RecallData.readUint32BE(); + const buffer = Buffer.from(RecallData.toString('hex').slice(14), 'hex'); + const seq: number = decodeRecallGroup(buffer).recallDetails.subDetail.msgSeq; + const peer: Peer = { chatType: ChatType.KCHATTYPEGROUP, peerUid: uid.toString() }; + context.logger.log("[Native] 群消息撤回 Peer: " + uid.toString() + " / MsgSeq:" + seq); + const msgs = await core.apis.MsgApi.queryMsgsWithFilterExWithSeq(peer, seq.toString()); + this.recallMsgCache.put(msgs.msgList[0].msgId, msgs.msgList[0]); + } } catch (error: any) { context.logger.logWarn("[Native] Error:", (error as Error).message, ' HEX:', hex); }