From d5eaeb429a55fa406fd7175aaf5e16245e8a7b9f Mon Sep 17 00:00:00 2001 From: "Wesley F. Young" Date: Sun, 11 Aug 2024 18:33:23 +0800 Subject: [PATCH] feat: initGroupListener --- .../event/notice/OB11GroupAdminNoticeEvent.ts | 8 +- src/onebot/event/request/OB11GroupRequest.ts | 4 +- src/onebot/main.ts | 139 +++++++++++++++++- 3 files changed, 145 insertions(+), 6 deletions(-) diff --git a/src/onebot/event/notice/OB11GroupAdminNoticeEvent.ts b/src/onebot/event/notice/OB11GroupAdminNoticeEvent.ts index 5d0ba149..31a05bad 100644 --- a/src/onebot/event/notice/OB11GroupAdminNoticeEvent.ts +++ b/src/onebot/event/notice/OB11GroupAdminNoticeEvent.ts @@ -1,6 +1,12 @@ import { OB11GroupNoticeEvent } from './OB11GroupNoticeEvent'; +import { NapCatCore } from '@/core'; export class OB11GroupAdminNoticeEvent extends OB11GroupNoticeEvent { notice_type = 'group_admin'; - sub_type: 'set' | 'unset' = 'set'; // "set" | "unset" + sub_type: 'set' | 'unset'; // "set" | "unset" + + constructor(core: NapCatCore, group_id: number, user_id: number, sub_type: 'set' | 'unset') { + super(core, group_id, user_id); + this.sub_type = sub_type; + } } diff --git a/src/onebot/event/request/OB11GroupRequest.ts b/src/onebot/event/request/OB11GroupRequest.ts index 14cd84e9..d5ee9465 100644 --- a/src/onebot/event/request/OB11GroupRequest.ts +++ b/src/onebot/event/request/OB11GroupRequest.ts @@ -9,10 +9,12 @@ export class OB11GroupRequestEvent extends OB11GroupNoticeEvent { user_id: number; comment: string; flag: string; + sub_type: string; - constructor(core: NapCatCore, groupId: number, userId: number, comment: string, flag: string) { + constructor(core: NapCatCore, groupId: number, userId: number, sub_type: string, comment: string, flag: string) { super(core, groupId, userId); this.user_id = userId; + this.sub_type = sub_type; this.comment = comment; this.flag = flag; } diff --git a/src/onebot/main.ts b/src/onebot/main.ts index cecfe765..997d4a64 100644 --- a/src/onebot/main.ts +++ b/src/onebot/main.ts @@ -1,4 +1,13 @@ -import { BuddyListener, BuddyReqType, ChatType, InstanceContext, MsgListener, NapCatCore, RawMessage } from '@/core'; +import { + BuddyListener, + BuddyReqType, + ChatType, + GroupListener, GroupNotifyTypes, + InstanceContext, + MsgListener, + NapCatCore, + RawMessage, +} from '@/core'; import { OB11Config } from './helper/config'; import { NapCatPathWrapper } from '@/common/framework/napcat'; import { OneBotApiContextType } from '@/onebot/types'; @@ -15,6 +24,9 @@ import { WebUiDataRuntime } from '@/webui/src/helper/Data'; import { OB11FriendRecallNoticeEvent } from '@/onebot/event/notice/OB11FriendRecallNoticeEvent'; import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecallNoticeEvent'; 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'; //OneBot实现类 export class NapCatOneBot11Adapter { @@ -90,12 +102,13 @@ export class NapCatOneBot11Adapter { this.initMsgListener(); this.initBuddyListener(); + this.initGroupListener(); // 未对shell版本兼容 // Mlikiowa V2.0.0 Refactor Todo - WebUiDataRuntime.setQQLoginUin(selfInfo.uin.toString()); - WebUiDataRuntime.setQQLoginStatus(true); - WebUiDataRuntime.setOB11ConfigCall(async (ob11: OB11Config) => { + await WebUiDataRuntime.setQQLoginUin(selfInfo.uin.toString()); + await WebUiDataRuntime.setQQLoginStatus(true); + await WebUiDataRuntime.setOB11ConfigCall(async (ob11: OB11Config) => { this.config.save(ob11); }); InitWebUi(this.context.logger, this.context.pathWrapper).then().catch(this.context.logger.logError); @@ -186,6 +199,124 @@ export class NapCatOneBot11Adapter { ); } + private initGroupListener() { + const groupListener = new GroupListener(); + + groupListener.onGroupNotifiesUpdated = async (_, notifies) => { + //console.log('ob11 onGroupNotifiesUpdated', notifies[0]); + if (![ + GroupNotifyTypes.ADMIN_SET, + GroupNotifyTypes.ADMIN_UNSET, + GroupNotifyTypes.ADMIN_UNSET_OTHER + ].includes(notifies[0]?.type)) { + for (const notify of notifies) { + notify.time = Date.now(); + const notifyTime = parseInt(notify.seq) / 1000 / 1000; + // log(`群通知时间${notifyTime}`, `启动时间${this.bootTime}`); + if (notifyTime < this.bootTime) { + continue; + } + + const flag = notify.group.groupCode + '|' + notify.seq + '|' + notify.type; + this.context.logger.logDebug('收到群通知', notify); + + // let member2: GroupMember; + // if (notify.user2.uid) { + // member2 = await getGroupMember(notify.group.groupCode, null, notify.user2.uid); + // } + + if ([ + GroupNotifyTypes.ADMIN_SET, + GroupNotifyTypes.ADMIN_UNSET, + GroupNotifyTypes.ADMIN_UNSET_OTHER + ].includes(notify.type)) { + const member1 = await this.core.ApiContext.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('变动管理员获取成功'); + // member1.role = notify.type == GroupNotifyTypes.ADMIN_SET ? GroupMemberRole.admin : GroupMemberRole.normal; + + const groupAdminNoticeEvent = new OB11GroupAdminNoticeEvent( + this.core, + parseInt(notify.group.groupCode), + parseInt(member1.uin), + [GroupNotifyTypes.ADMIN_UNSET, GroupNotifyTypes.ADMIN_UNSET_OTHER].includes(notify.type) ? 'unset' : 'set' + ); + this.networkManager.emitEvent(groupAdminNoticeEvent); + } else { + this.context.logger.logDebug('获取群通知的成员信息失败', notify, this.core.ApiContext.GroupApi.getGroup(notify.group.groupCode)); + } + } else if (notify.type == GroupNotifyTypes.MEMBER_EXIT || notify.type == GroupNotifyTypes.KICK_MEMBER) { + this.context.logger.logDebug('有成员退出通知', notify); + try { + const member1Uin = (await this.core.ApiContext.UserApi.getUinByUidV2(notify.user1.uid))!; + let operatorId = member1Uin; + let subType: GroupDecreaseSubType = 'leave'; + if (notify.user2.uid) { + // 是被踢的 + const member2Uin = await this.core.ApiContext.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: any) { + this.context.logger.logError('获取群通知的成员信息失败', notify, e.stack.toString()); + } + // notify.status == 1 表示未处理 2表示处理完成 + } else if ([ + GroupNotifyTypes.JOIN_REQUEST + ].includes(notify.type) && notify.status == 1) { + this.context.logger.logDebug('有加群请求'); + try { + let requestUin = (await this.core.ApiContext.UserApi.getUinByUidV2(notify.user1.uid))!; + if (isNaN(parseInt(requestUin))) { + requestUin = (await this.core.ApiContext.UserApi.getUserDetailInfo(notify.user1.uid)).uin; + } + const groupRequestEvent = new OB11GroupRequestEvent( + this.core, + parseInt(notify.group.groupCode), + parseInt(requestUin), + 'add', + notify.postscript, + flag + ); + this.networkManager.emitEvent(groupRequestEvent); + } catch (e) { + this.context.logger.logError('获取加群人QQ号失败 Uid:', notify.user1.uid, e); + } + } else if (notify.type == GroupNotifyTypes.INVITE_ME) { + this.context.logger.logDebug(`收到邀请我加群通知:${notify}`); + const groupInviteEvent = new OB11GroupRequestEvent( + this.core, + parseInt(notify.group.groupCode), + parseInt(notify.user1.uid), + 'invite', + notify.postscript, + flag + ); + this.networkManager.emitEvent(groupInviteEvent); + } + } + } + }; + + this.context.session.getGroupService().addKernelGroupListener( + new this.context.wrapper.NodeIGroupListener(proxiedListenerOf(groupListener, this.context.logger)), + ); + } + private async emitMsg(message: RawMessage) { const { debug, reportSelfMessage } = this.config; this.context.logger.logDebug('收到新消息', message);