diff --git a/src/ntqqapi/services/NodeIKernelGroupService.ts b/src/ntqqapi/services/NodeIKernelGroupService.ts index a080670..801bd50 100644 --- a/src/ntqqapi/services/NodeIKernelGroupService.ts +++ b/src/ntqqapi/services/NodeIKernelGroupService.ts @@ -3,7 +3,7 @@ import { GroupExtParam, GroupMember, GroupMemberRole, - GroupNotifyTypes, + GroupNotifyType, GroupRequestOperateTypes, } from '@/ntqqapi/types' import { GeneralCallResult } from './common' @@ -181,7 +181,7 @@ export interface NodeIKernelGroupService { operateType: GroupRequestOperateTypes, // 2 拒绝 targetMsg: { seq: string, // 通知序列号 - type: GroupNotifyTypes, + type: GroupNotifyType, groupCode: string, postscript: string } diff --git a/src/ntqqapi/types/notify.ts b/src/ntqqapi/types/notify.ts index 926489b..3d8362f 100644 --- a/src/ntqqapi/types/notify.ts +++ b/src/ntqqapi/types/notify.ts @@ -1,13 +1,19 @@ -export enum GroupNotifyTypes { - INVITE_ME = 1, - INVITED_JOIN = 4, // 有人接受了邀请入群 - JOIN_REQUEST_BY_INVITED = 5, // 有人邀请了别人入群 - JOIN_REQUEST = 7, - ADMIN_SET = 8, - KICK_MEMBER = 9, - MEMBER_EXIT = 11, // 主动退出 - ADMIN_UNSET = 12, // 我被取消管理员 - ADMIN_UNSET_OTHER = 13, // 其他人取消管理员 +export enum GroupNotifyType { + INVITED_BY_MEMBER = 1, + REFUSE_INVITED, + REFUSED_BY_ADMINI_STRATOR, + AGREED_TOJOIN_DIRECT, // 有人接受了邀请入群 + INVITED_NEED_ADMINI_STRATOR_PASS, // 有人邀请了别人入群 + AGREED_TO_JOIN_BY_ADMINI_STRATOR, + REQUEST_JOIN_NEED_ADMINI_STRATOR_PASS, + SET_ADMIN, + KICK_MEMBER_NOTIFY_ADMIN, + KICK_MEMBER_NOTIFY_KICKED, + MEMBER_LEAVE_NOTIFY_ADMIN, // 主动退出 + CANCEL_ADMIN_NOTIFY_CANCELED, // 我被取消管理员 + CANCEL_ADMIN_NOTIFY_ADMIN, // 其他人取消管理员 + TRANSFER_GROUP_NOTIFY_OLDOWNER, + TRANSFER_GROUP_NOTIFY_ADMIN } export interface GroupNotifies { @@ -27,7 +33,7 @@ export enum GroupNotifyStatus { export interface GroupNotify { time: number // 自己添加的字段,时间戳,毫秒, 用于判断收到短时间内收到重复的notify seq: string // 唯一标识符,转成数字再除以1000应该就是时间戳? - type: GroupNotifyTypes + type: GroupNotifyType status: GroupNotifyStatus group: { groupCode: string; groupName: string } user1: { uid: string; nickName: string } // 被设置管理员的人 diff --git a/src/onebot11/adapter.ts b/src/onebot11/adapter.ts index 96b347f..5c9e6c1 100644 --- a/src/onebot11/adapter.ts +++ b/src/onebot11/adapter.ts @@ -2,13 +2,14 @@ import { Service, Context } from 'cordis' import { OB11Entities } from './entities' import { GroupNotify, - GroupNotifyTypes, + GroupNotifyType, RawMessage, BuddyReqType, Peer, FriendRequest, GroupMember, - GroupMemberRole + GroupMemberRole, + GroupNotifyStatus } from '../ntqqapi/types' import { OB11GroupRequestEvent } from './event/request/OB11GroupRequest' import { OB11FriendRequestEvent } from './event/request/OB11FriendRequest' @@ -108,15 +109,14 @@ class OneBot11Adapter extends Service { private async handleGroupNotify(notifies: GroupNotify[]) { for (const notify of notifies) { try { - notify.time = Date.now() const notifyTime = parseInt(notify.seq) / 1000 const flag = notify.group.groupCode + '|' + notify.seq + '|' + notify.type if (notifyTime < this.startTime) { continue } - if (notify.type == GroupNotifyTypes.MEMBER_EXIT || notify.type == GroupNotifyTypes.KICK_MEMBER) { + if ([GroupNotifyType.MEMBER_LEAVE_NOTIFY_ADMIN, GroupNotifyType.KICK_MEMBER_NOTIFY_ADMIN].includes(notify.type)) { this.ctx.logger.info('有成员退出通知', notify) - const member1Uin = (await this.ctx.ntUserApi.getUinByUid(notify.user1.uid))! + const member1Uin = await this.ctx.ntUserApi.getUinByUid(notify.user1.uid) let operatorId = member1Uin let subType: GroupDecreaseSubType = 'leave' if (notify.user2.uid) { @@ -135,57 +135,35 @@ class OneBot11Adapter extends Service { ) this.dispatch(groupDecreaseEvent) } - else if ([GroupNotifyTypes.JOIN_REQUEST, GroupNotifyTypes.JOIN_REQUEST_BY_INVITED].includes(notify.type)) { + else if ([GroupNotifyType.REQUEST_JOIN_NEED_ADMINI_STRATOR_PASS].includes(notify.type) && notify.status === GroupNotifyStatus.KUNHANDLE) { this.ctx.logger.info('有加群请求') - let requestQQ = '' - try { - // uid-->uin - requestQQ = (await this.ctx.ntUserApi.getUinByUid(notify.user1.uid)) - if (isNaN(parseInt(requestQQ))) { - requestQQ = (await this.ctx.ntUserApi.getUserDetailInfo(notify.user1.uid)).uin - } - } catch (e) { - this.ctx.logger.error('获取加群人QQ号失败 Uid:', notify.user1.uid, e) - } - let invitorId: string - if (notify.type == GroupNotifyTypes.JOIN_REQUEST_BY_INVITED) { - // groupRequestEvent.sub_type = 'invite' - try { - // uid-->uin - invitorId = (await this.ctx.ntUserApi.getUinByUid(notify.user2.uid)) - if (isNaN(parseInt(invitorId))) { - invitorId = (await this.ctx.ntUserApi.getUserDetailInfo(notify.user2.uid)).uin - } - } catch (e) { - invitorId = '' - this.ctx.logger.error('获取邀请人QQ号失败 Uid:', notify.user2.uid, e) - } + let requestUin = (await this.ctx.ntUserApi.getUinByUid(notify.user1.uid)) + if (isNaN(parseInt(requestUin))) { + requestUin = (await this.ctx.ntUserApi.getUserDetailInfo(notify.user1.uid)).uin } const groupRequestEvent = new OB11GroupRequestEvent( parseInt(notify.group.groupCode), - parseInt(requestQQ) || 0, + parseInt(requestUin) || 0, flag, notify.postscript, - invitorId! === undefined ? undefined : +invitorId, - 'add' ) this.dispatch(groupRequestEvent) } - else if (notify.type == GroupNotifyTypes.INVITE_ME) { + else if (notify.type === GroupNotifyType.INVITED_BY_MEMBER && notify.status === GroupNotifyStatus.KUNHANDLE) { this.ctx.logger.info('收到邀请我加群通知') - const userId = (await this.ctx.ntUserApi.getUinByUid(notify.user2.uid)) || '' + const userId = await this.ctx.ntUserApi.getUinByUid(notify.user2.uid) const groupInviteEvent = new OB11GroupRequestEvent( parseInt(notify.group.groupCode), - parseInt(userId), + parseInt(userId) || 0, flag, - undefined, + notify.postscript, undefined, 'invite' ) this.dispatch(groupInviteEvent) } } catch (e: any) { - this.ctx.logger.error('解析群通知失败', e.stack.toString()) + this.ctx.logger.error('解析群通知失败', e.stack) } } } diff --git a/src/onebot11/entities.ts b/src/onebot11/entities.ts index 43ff05e..003738e 100644 --- a/src/onebot11/entities.ts +++ b/src/onebot11/entities.ts @@ -427,7 +427,7 @@ export namespace OB11Entities { ctx.logger.info(`收到我被踢出或退群提示, 群${msg.peerUid}`, groupElement) ctx.ntGroupApi.quitGroup(msg.peerUid) try { - const adminUin = (await ctx.ntGroupApi.getGroupMember(msg.peerUid, groupElement.adminUid))?.uin || (await ctx.ntUserApi.getUidByUin(groupElement.adminUid)) + const adminUin = (await ctx.ntGroupApi.getGroupMember(msg.peerUid, groupElement.adminUid))?.uin || (await ctx.ntUserApi.getUinByUid(groupElement.adminUid)) if (adminUin) { return new OB11GroupDecreaseEvent( parseInt(msg.peerUid),