diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 55c97403..5fe5c2ea 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -972,6 +972,7 @@ export class OneBotMsgApi { return { path, fileName: inputdata.name ?? fileName }; } + groupChangDecreseType2String(type: number): GroupDecreaseSubType { switch (type) { case 130: @@ -985,36 +986,49 @@ export class OneBotMsgApi { } } + async waitGroupNotify(groupUin: string, memberUid?: string, operatorUid?: string) { + let groupRole = this.core.apis.GroupApi.groupMemberCache.get(groupUin)?.get(this.core.selfInfo.uid.toString())?.role; + let isAdminOrOwner = groupRole === 3 || groupRole === 4; + + if (isAdminOrOwner && !operatorUid) { + let dataNotify: GroupNotify | undefined; + await this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onGroupNotifiesUpdated', + (doubt, notifies) => { + for (const notify of notifies) { + if (notify.group.groupCode === groupUin && notify.user1.uid === memberUid) { + dataNotify = notify; + return true; + } + } + return false; + }, 1, 1000).catch(undefined); + if (dataNotify) { + return !dataNotify.actionUser.uid ? dataNotify.user2.uid : dataNotify.actionUser.uid; + } + } + + return operatorUid; + } + async parseSysMessage(msg: number[]) { const SysMessage = new NapProtoMsg(PushMsgBody).decode(Uint8Array.from(msg)); - if (SysMessage.contentHead.type == 33 && SysMessage.body?.msgContent) { + if (SysMessage.contentHead.type == 85 && SysMessage.body?.msgContent) { + const groupChange = new NapProtoMsg(GroupChange).decode(SysMessage.body.msgContent); + return new OB11GroupIncreaseEvent( + this.core, + groupChange.groupUin, + +this.core.selfInfo.uin, + groupChange.memberUid ? +await this.core.apis.UserApi.getUinByUidV2(groupChange.memberUid) : 0, + 'approve' + ); + } else if (SysMessage.contentHead.type == 33 && SysMessage.body?.msgContent) { const groupChange = new NapProtoMsg(GroupChange).decode(SysMessage.body.msgContent); this.core.apis.GroupApi.refreshGroupMemberCache(groupChange.groupUin.toString()).then().catch(); - let operatorUid = groupChange.operatorInfo ? Buffer.from(groupChange.operatorInfo).toString() : ''; - - let groupRole = this.core.apis.GroupApi.groupMemberCache.get(groupChange.groupUin.toString())?.get(this.core.selfInfo.uid.toString())?.role; - let isAdminOrOwner = groupRole === 3 || groupRole === 4; - - console.log(Buffer.from(msg).toString('hex')); - - if (isAdminOrOwner && !operatorUid) { - let dataNotify: GroupNotify | undefined; - await this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onGroupNotifiesUpdated', - (doubt, notifies) => { - for (const notify of notifies) { - if (notify.group.groupCode === groupChange.groupUin.toString() && notify.user1.uid === groupChange.memberUid) { - dataNotify = notify; - return true; - } - } - return false; - }, 1, 1000).catch(undefined); - if (dataNotify) { - operatorUid = !!dataNotify.actionUser.uid ? dataNotify.actionUser.uid :dataNotify.user2.uid; - } - console.log(dataNotify); - } - + let operatorUid = await this.waitGroupNotify( + groupChange.groupUin.toString(), + groupChange.memberUid, + groupChange.operatorInfo ? Buffer.from(groupChange.operatorInfo).toString() : '' + ); return new OB11GroupIncreaseEvent( this.core, groupChange.groupUin, @@ -1022,34 +1036,17 @@ export class OneBotMsgApi { operatorUid ? +await this.core.apis.UserApi.getUinByUidV2(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); // 自身被踢出时operatorInfo会是一个protobuf 否则大多数情况为一个string - let operatorUid = groupChange.decreaseType === 3 && groupChange.operatorInfo ? - new NapProtoMsg(GroupChangeInfo).decode(groupChange.operatorInfo).operator?.operatorUid : - groupChange.operatorInfo?.toString(); - let groupRole = this.core.apis.GroupApi.groupMemberCache.get(groupChange.groupUin.toString())?.get(this.core.selfInfo.uid.toString())?.role; - let isAdminOrOwner = groupRole === 3 || groupRole === 4; - - console.log(Buffer.from(msg).toString('hex')); - if (isAdminOrOwner && !operatorUid) { - let dataNotify: GroupNotify | undefined; - await this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onGroupNotifiesUpdated', - (doubt, notifies) => { - for (const notify of notifies) { - if (notify.group.groupCode === groupChange.groupUin.toString() && notify.user1.uid === groupChange.memberUid) { - dataNotify = notify; - return true; - } - } - return false; - }, 1, 1000).catch(undefined); - console.log(dataNotify); - if (dataNotify) { - operatorUid = !!dataNotify.actionUser.uid ? dataNotify.actionUser.uid :dataNotify.user2.uid; - } - } - + let operatorUid = await this.waitGroupNotify( + groupChange.groupUin.toString(), + groupChange.memberUid, + groupChange.decreaseType === 3 && groupChange.operatorInfo ? + new NapProtoMsg(GroupChangeInfo).decode(groupChange.operatorInfo).operator?.operatorUid : + groupChange.operatorInfo?.toString() + ); if (groupChange.memberUid === this.core.selfInfo.uid) { setTimeout(() => { this.core.apis.GroupApi.groupMemberCache.delete(groupChange.groupUin.toString()); @@ -1149,8 +1146,7 @@ export class OneBotMsgApi { '', request_seq ); - } - else if (SysMessage.contentHead.type == 528 && SysMessage.contentHead.subType == 39 && SysMessage.body?.msgContent) { + } else if (SysMessage.contentHead.type == 528 && SysMessage.contentHead.subType == 39 && SysMessage.body?.msgContent) { return await this.obContext.apis.UserApi.parseLikeEvent(SysMessage.body?.msgContent); } }