diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 31efa701..51868c65 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -260,29 +260,6 @@ export class NTQQGroupApi { return notifies; } - // async getGroupMemberV2(GroupCode: string, uid: string, forced = false) { - // const Listener = this.core.eventWrapper.registerListen( - // 'NodeIKernelGroupListener/onMemberInfoChange', - // (params, _, members) => params === GroupCode && members.size > 0, - // 1, - // forced ? 5000 : 250, - // ); - // const retData = await ( - // this.core.eventWrapper - // .createEventFunction('NodeIKernelGroupService/getMemberInfo') - // )!(GroupCode, [uid], forced); - // if (retData.result !== 0) { - // throw new Error(`${retData.errMsg}`); - // } - // const result = await Listener as unknown; - // let member: GroupMember | undefined; - // if (Array.isArray(result) && result?.[2] instanceof Map) { - // const members = result[2] as Map; - // member = members.get(uid); - // } - // return member; - // } - async searchGroup(groupCode: string) { const [, ret] = await this.core.eventWrapper.callNormalEventV2( 'NodeIKernelSearchService/searchGroup', @@ -323,89 +300,6 @@ export class NTQQGroupApi { return undefined; } - // async tryGetGroupMembersV2(groupQQ: string, modeListener = false, num = 30, timeout = 100): Promise<{ - // infos: Map; - // finish: boolean; - // hasNext: boolean | undefined; - // }> { - // const sceneId = this.context.session.getGroupService().createMemberListScene(groupQQ, 'groupMemberList_MainWindow_1'); - // const once = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onMemberListChange', (params) => params.sceneId === sceneId, 0, timeout) - // .catch(() => { }); - // const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num); - // if (result.errCode !== 0) { - // throw new Error('获取群成员列表出错,' + result.errMsg); - // } - // let resMode2; - // if (modeListener) { - // const ret = (await once)?.[0]; - // if (ret) { - // resMode2 = ret; - // } - // } - // this.context.session.getGroupService().destroyMemberListScene(sceneId); - // return { - // infos: new Map([...(resMode2?.infos ?? []), ...result.result.infos]), - // finish: result.result.finish, - // hasNext: resMode2?.hasNext, - // }; - // } - - // async GetGroupMembersV3(groupQQ: string, num = 3000, timeout = 2500): Promise<{ - // infos: Map; - // finish: boolean; - // hasNext: boolean | undefined; - // listenerMode: boolean; - // }> { - // const sceneId = this.context.session.getGroupService().createMemberListScene(groupQQ, 'groupMemberList_MainWindow_1'); - // const once = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onMemberListChange', (params) => params.sceneId === sceneId, 0, timeout) - // .catch(() => { }); - // const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num); - // if (result.errCode !== 0) { - // throw new Error('获取群成员列表出错,' + result.errMsg); - // } - // let resMode2; - // if (result.result.finish && result.result.infos.size === 0) { - // const ret = (await once)?.[0]; - // if (ret) { - // resMode2 = ret; - // } - // } - // this.context.session.getGroupService().destroyMemberListScene(sceneId); - // return { - // infos: new Map([...(resMode2?.infos ?? []), ...result.result.infos]), - // finish: result.result.finish, - // hasNext: resMode2?.hasNext, - // listenerMode: resMode2?.hasNext !== undefined - // }; - // } - - // async getGroupMembersV2(groupQQ: string, num = 3000, no_cache: boolean = false): Promise> { - // if (no_cache) { - // return (await this.getGroupMemberAll(groupQQ, true)).result.infos; - // } - // let res = await this.GetGroupMembersV3(groupQQ, num); - // let ret = res.infos; - // if (res.infos.size === 0 && !res.listenerMode) { - // res = await this.GetGroupMembersV3(groupQQ, num); - // ret = res.infos; - // } - // if (res.infos.size === 0) { - // ret = (await this.getGroupMemberAll(groupQQ)).result.infos; - // } - // return ret; - // } - - // async getGroupMembers(groupQQ: string, num = 3000): Promise> { - // const groupService = this.context.session.getGroupService(); - // const sceneId = groupService.createMemberListScene(groupQQ, 'groupMemberList_MainWindow'); - // const result = await groupService.getNextMemberList(sceneId, undefined, num); - // if (result.errCode !== 0) { - // throw new Error('获取群成员列表出错,' + result.errMsg); - // } - // this.context.logger.logDebug(`获取群(${groupQQ})成员列表结果:`, `members: ${result.result.infos.size}`); - // return result.result.infos; - // } - async getGroupFileCount(group_ids: Array) { return this.context.session.getRichMediaService().batchGetGroupFileCount(group_ids); } diff --git a/src/core/packet/transformer/proto/message/groupAdmin.ts b/src/core/packet/transformer/proto/message/groupAdmin.ts new file mode 100644 index 00000000..0aa130b9 --- /dev/null +++ b/src/core/packet/transformer/proto/message/groupAdmin.ts @@ -0,0 +1,18 @@ +import { ProtoField, ScalarType } from "@napneko/nap-proto-core"; + +export const GroupAdminExtra = { + adminUid: ProtoField(1, ScalarType.STRING), + isPromote: ProtoField(2, ScalarType.BOOL), +} + +export const GroupAdminBody = { + extraDisable: ProtoField(1, () => GroupAdminExtra), + extraEnable: ProtoField(2, () => GroupAdminExtra), +} + +export const GroupAdmin = { + groupUin: ProtoField(1, ScalarType.UINT32), + flag: ProtoField(2, ScalarType.UINT32), + isPromote: ProtoField(3, ScalarType.BOOL), + body: ProtoField(4, () => GroupAdminBody), +} \ No newline at end of file diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 1ff5ae8d..c9ddd427 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -32,6 +32,8 @@ 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'; +import { GroupAdmin } from '@/core/packet/transformer/proto/message/groupAdmin'; +import { OB11GroupAdminNoticeEvent } from '../event/notice/OB11GroupAdminNoticeEvent'; type RawToOb11Converters = { [Key in keyof MessageElement as Key extends `${string}Element` ? Key : never]: ( @@ -965,8 +967,8 @@ export class OneBotMsgApi { } async parseSysMessage(msg: number[]) { - // Todo Refactor const SysMessage = new NapProtoMsg(PushMsgBody).decode(Uint8Array.from(msg)); + console.log(Buffer.from(msg).toString('hex')); if (SysMessage.contentHead.type == 33 && SysMessage.body?.msgContent) { const groupChange = new NapProtoMsg(GroupChange).decode(SysMessage.body.msgContent); await this.core.apis.GroupApi.refreshGroupMemberCache(groupChange.groupUin.toString()); @@ -987,6 +989,22 @@ export class OneBotMsgApi { groupChange.operatorUid ? +await this.core.apis.UserApi.getUinByUidV2(groupChange.operatorUid) : 0, this.groupChangDecreseType2String(groupChange.decreaseType), ); + } else if (SysMessage.contentHead.type == 44 && SysMessage.body?.msgContent) { + const groupAmin = new NapProtoMsg(GroupAdmin).decode(SysMessage.body.msgContent); + await this.core.apis.GroupApi.refreshGroupMemberCache(groupAmin.groupUin.toString()); + let enabled = false; + let uid = groupAmin.body.extraEnable.adminUid; + if (groupAmin.body.extraEnable != null) { + enabled = true; + } else if (groupAmin.body.extraDisable != null) { + enabled = false; + } + return new OB11GroupAdminNoticeEvent( + this.core, + groupAmin.groupUin, + +await this.core.apis.UserApi.getUinByUidV2(uid), + enabled ? 'set' : 'unset' + ); } else if (SysMessage.contentHead.type == 528 && SysMessage.contentHead.subType == 39 && SysMessage.body?.msgContent) { return await this.obContext.apis.UserApi.parseLikeEvent(SysMessage.body?.msgContent); } diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 1eed43da..010c4177 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -1,8 +1,6 @@ import { BuddyReqType, ChatType, - DataSource, - NTGroupMemberRole, GroupNotifyMsgStatus, GroupNotifyMsgType, InstanceContext, @@ -41,8 +39,6 @@ import { OB11InputStatusEvent } from '@/onebot/event/notice/OB11InputStatusEvent 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 { OB11GroupRequestEvent } from '@/onebot/event/request/OB11GroupRequest'; import { OB11FriendRecallNoticeEvent } from '@/onebot/event/notice/OB11FriendRecallNoticeEvent'; import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecallNoticeEvent'; @@ -373,47 +369,7 @@ export class NapCatOneBot11Adapter { const flag = notify.group.groupCode + '|' + notify.seq + '|' + notify.type; this.context.logger.logDebug('收到群通知', notify); - if ( - [ - GroupNotifyMsgType.SET_ADMIN, - GroupNotifyMsgType.CANCEL_ADMIN_NOTIFY_CANCELED, - GroupNotifyMsgType.CANCEL_ADMIN_NOTIFY_ADMIN, - ].includes(notify.type) - ) { - const member1 = await this.core.apis.GroupApi.getGroupMember( - notify.group.groupCode, - notify.user1.uid - ); - this.context.logger.logDebug('有管理员变动通知'); - // refreshGroupMembers(notify.group.groupCode).then(); - this.context.logger.logDebug('开始获取变动的管理员'); - if (member1) { - this.context.logger.logDebug('变动管理员获取成功'); - const groupAdminNoticeEvent = new OB11GroupAdminNoticeEvent( - this.core, - parseInt(notify.group.groupCode), - parseInt(member1.uin), - [ - GroupNotifyMsgType.CANCEL_ADMIN_NOTIFY_CANCELED, - GroupNotifyMsgType.CANCEL_ADMIN_NOTIFY_ADMIN, - ].includes(notify.type) - ? 'unset' - : 'set' - ); - this.networkManager - .emitEvent(groupAdminNoticeEvent) - .catch((e) => - this.context.logger.logError('处理群管理员变动失败', e) - ); - } else { - this.context.logger.logDebug( - '获取群通知的成员信息失败', - notify, - this.core.apis.GroupApi.getGroup(notify.group.groupCode) - ); - } - } else if ( [GroupNotifyMsgType.REQUEST_JOIN_NEED_ADMINI_STRATOR_PASS].includes(notify.type) && notify.status == GroupNotifyMsgStatus.KUNHANDLE ) { @@ -483,33 +439,6 @@ export class NapCatOneBot11Adapter { } } }; - - groupListener.onMemberInfoChange = async (groupCode, dataSource, members) => { - //this.context.logger.logDebug('收到群成员信息变动通知', groupCode, changeType); - if (dataSource === DataSource.LOCAL) { - const existMembers = this.core.apis.GroupApi.groupMemberCache.get(groupCode); - if (!existMembers) return; - members.forEach((member) => { - const existMember = existMembers.get(member.uid); - if (!existMember?.isChangeRole) return; - this.context.logger.logDebug('变动管理员获取成功'); - const groupAdminNoticeEvent = new OB11GroupAdminNoticeEvent( - this.core, - parseInt(groupCode), - parseInt(member.uin), - member.role === NTGroupMemberRole.KADMIN ? 'set' : 'unset' - ); - this.networkManager - .emitEvent(groupAdminNoticeEvent) - .catch((e) => - this.context.logger.logError('处理群管理员变动失败', e) - ); - existMember.isChangeRole = false; - this.context.logger.logDebug('群管理员变动处理完毕'); - }); - } - }; - this.context.session .getGroupService() .addKernelGroupListener(proxiedListenerOf(groupListener, this.context.logger));