From 64530471a0231576dd70e82332a95433364a2a3b 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: Tue, 26 Nov 2024 19:42:35 +0800 Subject: [PATCH] fix: GroupChange --- .../transformer/proto/message/message.ts | 10 ++ src/onebot/api/group.ts | 119 +++++++++--------- src/onebot/api/msg.ts | 38 ++++++ src/onebot/index.ts | 64 +++++----- 4 files changed, 140 insertions(+), 91 deletions(-) diff --git a/src/core/packet/transformer/proto/message/message.ts b/src/core/packet/transformer/proto/message/message.ts index c5916e86..1cb6ecfe 100644 --- a/src/core/packet/transformer/proto/message/message.ts +++ b/src/core/packet/transformer/proto/message/message.ts @@ -54,6 +54,16 @@ export const PushMsg = { generalFlag: ProtoField(9, ScalarType.INT32, true), }; +export const GroupChange = { + groupUin: ProtoField(1, ScalarType.UINT32), + flag: ProtoField(2, ScalarType.UINT32), + memberUid: ProtoField(3, ScalarType.STRING, true), + decreaseType: ProtoField(4, ScalarType.UINT32), + operatorUid: ProtoField(5, ScalarType.STRING, true), + increaseType: ProtoField(6, ScalarType.UINT32), + field7: ProtoField(7, ScalarType.BYTES, true), +} + export const PushMsgBody = { responseHead: ProtoField(1, () => ResponseHead), contentHead: ProtoField(2, () => ContentHead), diff --git a/src/onebot/api/group.ts b/src/onebot/api/group.ts index 5a189a78..faa8ee02 100644 --- a/src/onebot/api/group.ts +++ b/src/onebot/api/group.ts @@ -23,7 +23,6 @@ import { OB11GroupCardEvent } from '@/onebot/event/notice/OB11GroupCardEvent'; import { OB11GroupPokeEvent } from '@/onebot/event/notice/OB11PokeEvent'; import { OB11GroupEssenceEvent } from '@/onebot/event/notice/OB11GroupEssenceEvent'; import { OB11GroupTitleEvent } from '@/onebot/event/notice/OB11GroupTitleEvent'; -import { OB11EmitEventContent } from '../network'; import { OB11GroupUploadNoticeEvent } from '../event/notice/OB11GroupUploadNoticeEvent'; import { pathToFileURL } from 'node:url'; import { FileNapCatOneBotUUID } from '@/common/helper'; @@ -93,40 +92,40 @@ export class OneBotGroupApi { return undefined; } - async parseGroupMemberIncreaseEvent(GroupCode: string, grayTipElement: GrayTipElement) { - const groupElement = grayTipElement?.groupElement; - if (!groupElement) return undefined; - const member = await this.core.apis.UserApi.getUserDetailInfo(groupElement.memberUid); - const memberUin = member?.uin; - const adminMember = await this.core.apis.GroupApi.getGroupMember(GroupCode, groupElement.adminUid); - if (memberUin) { - const operatorUin = adminMember?.uin ?? memberUin; - return new OB11GroupIncreaseEvent( - this.core, - parseInt(GroupCode), - parseInt(memberUin), - parseInt(operatorUin), - ); - } else { - return undefined; - } - } + // async parseGroupMemberIncreaseEvent(GroupCode: string, grayTipElement: GrayTipElement) { + // const groupElement = grayTipElement?.groupElement; + // if (!groupElement) return undefined; + // const member = await this.core.apis.UserApi.getUserDetailInfo(groupElement.memberUid); + // const memberUin = member?.uin; + // const adminMember = await this.core.apis.GroupApi.getGroupMember(GroupCode, groupElement.adminUid); + // if (memberUin) { + // const operatorUin = adminMember?.uin ?? memberUin; + // return new OB11GroupIncreaseEvent( + // this.core, + // parseInt(GroupCode), + // parseInt(memberUin), + // parseInt(operatorUin), + // ); + // } else { + // return undefined; + // } + // } - async parseGroupKickEvent(GroupCode: string, grayTipElement: GrayTipElement) { - const groupElement = grayTipElement?.groupElement; - if (!groupElement) return undefined; - const adminUin = (await this.core.apis.GroupApi.getGroupMember(GroupCode, groupElement.adminUid))?.uin ?? (await this.core.apis.UserApi.getUidByUinV2(groupElement.adminUid)); - if (adminUin) { - return new OB11GroupDecreaseEvent( - this.core, - parseInt(GroupCode), - parseInt(this.core.selfInfo.uin), - parseInt(adminUin), - 'kick_me', - ); - } - return undefined; - } + // async parseGroupKickEvent(GroupCode: string, grayTipElement: GrayTipElement) { + // const groupElement = grayTipElement?.groupElement; + // if (!groupElement) return undefined; + // const adminUin = (await this.core.apis.GroupApi.getGroupMember(GroupCode, groupElement.adminUid))?.uin ?? (await this.core.apis.UserApi.getUidByUinV2(groupElement.adminUid)); + // if (adminUin) { + // return new OB11GroupDecreaseEvent( + // this.core, + // parseInt(GroupCode), + // parseInt(this.core.selfInfo.uin), + // parseInt(adminUin), + // 'kick_me', + // ); + // } + // return undefined; + // } async parseGroupEmojiLikeEventByGrayTip( groupCode: string, @@ -188,30 +187,30 @@ export class OneBotGroupApi { return undefined; } - async parseGroupElement(msg: RawMessage, groupElement: TipGroupElement, elementWrapper: GrayTipElement) { - if (groupElement.type == TipGroupElementType.KMEMBERADD) { - const MemberIncreaseEvent = await this.obContext.apis.GroupApi.parseGroupMemberIncreaseEvent(msg.peerUid, elementWrapper); - if (MemberIncreaseEvent) return MemberIncreaseEvent; - } else if (groupElement.type === TipGroupElementType.KSHUTUP) { - const BanEvent = await this.obContext.apis.GroupApi.parseGroupBanEvent(msg.peerUid, elementWrapper); - if (BanEvent) return BanEvent; - } else if (groupElement.type == TipGroupElementType.KQUITTE) { - this.core.apis.GroupApi.quitGroup(msg.peerUid).then(); - try { - const KickEvent = await this.obContext.apis.GroupApi.parseGroupKickEvent(msg.peerUid, elementWrapper); - if (KickEvent) return KickEvent; - } catch (e) { - return new OB11GroupDecreaseEvent( - this.core, - parseInt(msg.peerUid), - parseInt(this.core.selfInfo.uin), - 0, - 'leave', - ); - } - } - return undefined; - } + // async parseGroupElement(msg: RawMessage, groupElement: TipGroupElement, elementWrapper: GrayTipElement) { + // if (groupElement.type == TipGroupElementType.KMEMBERADD) { + // const MemberIncreaseEvent = await this.obContext.apis.GroupApi.parseGroupMemberIncreaseEvent(msg.peerUid, elementWrapper); + // if (MemberIncreaseEvent) return MemberIncreaseEvent; + // } else if (groupElement.type === TipGroupElementType.KSHUTUP) { + // const BanEvent = await this.obContext.apis.GroupApi.parseGroupBanEvent(msg.peerUid, elementWrapper); + // if (BanEvent) return BanEvent; + // } else if (groupElement.type == TipGroupElementType.KQUITTE) { + // this.core.apis.GroupApi.quitGroup(msg.peerUid).then(); + // try { + // const KickEvent = await this.obContext.apis.GroupApi.parseGroupKickEvent(msg.peerUid, elementWrapper); + // if (KickEvent) return KickEvent; + // } catch (e) { + // return new OB11GroupDecreaseEvent( + // this.core, + // parseInt(msg.peerUid), + // parseInt(this.core.selfInfo.uin), + // 0, + // 'leave', + // ); + // } + // } + // return undefined; + // } async parsePaiYiPai(msg: RawMessage, jsonStr: string) { const json = JSON.parse(jsonStr); @@ -298,8 +297,8 @@ export class OneBotGroupApi { async parseGrayTipElement(msg: RawMessage, grayTipElement: GrayTipElement) { if (grayTipElement.subElementType === NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_GROUP) { - // 解析群组事件 - return await this.parseGroupElement(msg, grayTipElement.groupElement, grayTipElement); + // 解析群组事件 由sysmsg解析 + // return await this.parseGroupElement(msg, grayTipElement.groupElement, grayTipElement); } else if (grayTipElement.subElementType === NTGrayTipElementSubTypeV2.GRAYTIP_ELEMENT_SUBTYPE_XMLMSG) { // 筛选出表情回应 事件 diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index c987d400..6c7f4963 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -32,6 +32,10 @@ import { OB11FriendAddNoticeEvent } from '@/onebot/event/notice/OB11FriendAddNot // import { decodeSysMessage } from '@/core/packet/proto/old/ProfileLike'; import { ForwardMsgBuilder } from "@/common/forward-msg-builder"; import { decodeSysMessage } from "@/core/helper/adaptDecoder"; +import { GroupChange, PushMsgBody } from "@/core/packet/transformer/proto"; +import { NapProtoMsg } from '@napneko/nap-proto-core'; +import { OB11GroupIncreaseEvent } from '../event/notice/OB11GroupIncreaseEvent'; +import { OB11GroupDecreaseEvent, GroupDecreaseSubType } from '../event/notice/OB11GroupDecreaseEvent'; type RawToOb11Converters = { [Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: ( @@ -953,6 +957,18 @@ export class OneBotMsgApi { return { path, fileName: inputdata.name ?? fileName }; } + groupChangDecreseType2String(type: number): GroupDecreaseSubType { + switch (type) { + case 130: + return 'kick'; + case 131: + return 'leave'; + case 3: + return 'kick_me'; + default: + return 'kick'; + } + } async parseSysMessage(msg: number[]) { const sysMsg = decodeSysMessage(Uint8Array.from(msg)); @@ -964,6 +980,28 @@ export class OneBotMsgApi { if (!sysMsg.bodyWrapper) return; return await this.obContext.apis.UserApi.parseLikeEvent(sysMsg.bodyWrapper.wrappedBody); } + let SysMessage = new NapProtoMsg(PushMsgBody).decode(Uint8Array.from(msg)); + if (SysMessage.contentHead.type == 33 && SysMessage.body?.msgContent) { + const groupChange = new NapProtoMsg(GroupChange).decode(SysMessage.body.msgContent); + console.log(JSON.stringify(groupChange)); + return new OB11GroupIncreaseEvent( + this.core, + groupChange.groupUin, + groupChange.memberUid ? +await this.core.apis.UserApi.getUinByUidV2(groupChange.memberUid) : 0, + groupChange.operatorUid ? +await this.core.apis.UserApi.getUinByUidV2(groupChange.operatorUid) : 0, + groupChange.decreaseType == 131 ? 'invite' : 'approve', + ); + } else if (SysMessage.contentHead.type == 34 && SysMessage.body?.msgContent) { + const groupChange = new NapProtoMsg(GroupChange).decode(SysMessage.body.msgContent); + // console.log(JSON.stringify(groupChange),JSON.stringify(SysMessage)); + return new OB11GroupDecreaseEvent( + this.core, + groupChange.groupUin, + +this.core.selfInfo.uin, + groupChange.operatorUid ? +await this.core.apis.UserApi.getUinByUidV2(groupChange.operatorUid) : 0, + this.groupChangDecreseType2String(groupChange.decreaseType), + ); + } /* if (msgType === 732 && subType === 16 && subSubType === 16) { const greyTip = GreyTipWrapper.fromBinary(Uint8Array.from(sysMsg.bodyWrapper!.wrappedBody.slice(7))); diff --git a/src/onebot/index.ts b/src/onebot/index.ts index a8858bc6..9e252d98 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -42,7 +42,7 @@ import { MessageUnique } from '@/common/message-unique'; import { proxiedListenerOf } from '@/common/proxy-handler'; import { OB11FriendRequestEvent } from '@/onebot/event/request/OB11FriendRequest'; import { OB11GroupAdminNoticeEvent } from '@/onebot/event/notice/OB11GroupAdminNoticeEvent'; -import { GroupDecreaseSubType, OB11GroupDecreaseEvent } from '@/onebot/event/notice/OB11GroupDecreaseEvent'; +// import { GroupDecreaseSubType, OB11GroupDecreaseEvent } from '@/onebot/event/notice/OB11GroupDecreaseEvent'; import { OB11GroupRequestEvent } from '@/onebot/event/request/OB11GroupRequest'; import { OB11FriendRecallNoticeEvent } from '@/onebot/event/notice/OB11FriendRecallNoticeEvent'; import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecallNoticeEvent'; @@ -406,36 +406,38 @@ export class NapCatOneBot11Adapter { this.core.apis.GroupApi.getGroup(notify.group.groupCode) ); } - } else if ( - notify.type == GroupNotifyMsgType.MEMBER_LEAVE_NOTIFY_ADMIN || - notify.type == GroupNotifyMsgType.KICK_MEMBER_NOTIFY_ADMIN - ) { - this.context.logger.logDebug('有成员退出通知', notify); - const member1Uin = await this.core.apis.UserApi.getUinByUidV2(notify.user1.uid); - let operatorId = member1Uin; - let subType: GroupDecreaseSubType = 'leave'; - if (notify.user2.uid) { - // 是被踢的 - const member2Uin = await this.core.apis.UserApi.getUinByUidV2(notify.user2.uid); - if (member2Uin) { - operatorId = member2Uin; - } - subType = 'kick'; - } - const groupDecreaseEvent = new OB11GroupDecreaseEvent( - this.core, - parseInt(notify.group.groupCode), - parseInt(member1Uin), - parseInt(operatorId), - subType - ); - this.networkManager - .emitEvent(groupDecreaseEvent) - .catch((e) => - this.context.logger.logError.bind(this.context.logger)('处理群成员退出失败', e) - ); - // notify.status == 1 表示未处理 2表示处理完成 - } else if ( + } else + // if ( + // notify.type == GroupNotifyMsgType.MEMBER_LEAVE_NOTIFY_ADMIN || + // notify.type == GroupNotifyMsgType.KICK_MEMBER_NOTIFY_ADMIN + // ) { + // this.context.logger.logDebug('有成员退出通知', notify); + // const member1Uin = await this.core.apis.UserApi.getUinByUidV2(notify.user1.uid); + // let operatorId = member1Uin; + // let subType: GroupDecreaseSubType = 'leave'; + // if (notify.user2.uid) { + // // 是被踢的 + // const member2Uin = await this.core.apis.UserApi.getUinByUidV2(notify.user2.uid); + // if (member2Uin) { + // operatorId = member2Uin; + // } + // subType = 'kick'; + // } + // const groupDecreaseEvent = new OB11GroupDecreaseEvent( + // this.core, + // parseInt(notify.group.groupCode), + // parseInt(member1Uin), + // parseInt(operatorId), + // subType + // ); + // this.networkManager + // .emitEvent(groupDecreaseEvent) + // .catch((e) => + // this.context.logger.logError.bind(this.context.logger)('处理群成员退出失败', e) + // ); + // // notify.status == 1 表示未处理 2表示处理完成 + // } else + if ( [GroupNotifyMsgType.REQUEST_JOIN_NEED_ADMINI_STRATOR_PASS].includes(notify.type) && notify.status == GroupNotifyMsgStatus.KUNHANDLE ) {