From 57112c21a29fb561fa73397f4141153c00b65fa7 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: Thu, 5 Dec 2024 14:17:09 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20flag=20handle&onebot=E6=A0=87?= =?UTF-8?q?=E5=87=86=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/friend.ts | 14 ++--- src/core/apis/group.ts | 16 ++---- .../action/extends/GetGroupAddRequest.ts | 18 ++---- .../action/group/GetGroupIgnoredNotifies.ts | 25 +++------ src/onebot/action/group/SetGroupAddRequest.ts | 26 +++++++-- src/onebot/action/system/GetSystemMsg.ts | 56 ++++++------------- src/onebot/action/user/SetFriendAddRequest.ts | 15 +++-- src/onebot/index.ts | 5 +- src/onebot/types/data.ts | 11 ++++ 9 files changed, 81 insertions(+), 105 deletions(-) diff --git a/src/core/apis/friend.ts b/src/core/apis/friend.ts index eff2fcd1..7714d683 100644 --- a/src/core/apis/friend.ts +++ b/src/core/apis/friend.ts @@ -1,4 +1,4 @@ -import { FriendV2 } from '@/core/types'; +import { FriendRequest, FriendV2 } from '@/core/types'; import { BuddyListReqType, InstanceContext, NapCatCore } from '@/core'; import { LimitedHashTable } from '@/common/message-unique'; @@ -79,16 +79,10 @@ export class NTQQFriendApi { return ret; } - async handleFriendRequest(flag: string, accept: boolean) { - const data = flag.split('|'); - if (data.length < 2) { - return; - } - const friendUid = data[0]; - const reqTime = data[1]; + async handleFriendRequest(notify: FriendRequest, accept: boolean) { this.context.session.getBuddyService()?.approvalFriendRequest({ - friendUid: friendUid, - reqTime: reqTime, + friendUid: notify.friendUid, + reqTime: notify.reqTime, accept, }); } diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 35674530..60bf065a 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -7,6 +7,7 @@ import { KickMemberV2Req, MemberExtSourceType, NapCatCore, + GroupNotify, } from '@/core'; import { isNumeric, solveAsyncProblem } from '@/common/helper'; import { LimitedHashTable } from '@/common/message-unique'; @@ -120,7 +121,7 @@ export class NTQQGroupApi { } return this.groupMemberCache; } - + async getGroupMember(groupCode: string | number, memberUinOrUid: string | number) { const groupCodeStr = groupCode.toString(); const memberUinOrUidStr = memberUinOrUid.toString(); @@ -288,20 +289,15 @@ export class NTQQGroupApi { return this.context.session.getGroupService().uploadGroupBulletinPic(groupCode, _Pskey, imageurl); } - async handleGroupRequest(flag: string, operateType: NTGroupRequestOperateTypes, reason?: string) { - const flagitem = flag.split('|'); - const groupCode = flagitem[0]; - const seq = flagitem[1]; - const type = parseInt(flagitem[2]); - + async handleGroupRequest(notify: GroupNotify, operateType: NTGroupRequestOperateTypes, reason?: string) { return this.context.session.getGroupService().operateSysNotify( false, { operateType: operateType, targetMsg: { - seq: seq, // 通知序列号 - type: type, - groupCode: groupCode, + seq: notify.seq, // 通知序列号 + type: notify.type, + groupCode: notify.group.groupCode, postscript: reason ?? ' ', // 仅传空值可能导致处理失败,故默认给个空格 }, }); diff --git a/src/onebot/action/extends/GetGroupAddRequest.ts b/src/onebot/action/extends/GetGroupAddRequest.ts index 9f0598db..1469292a 100644 --- a/src/onebot/action/extends/GetGroupAddRequest.ts +++ b/src/onebot/action/extends/GetGroupAddRequest.ts @@ -1,17 +1,7 @@ import { GroupNotifyMsgStatus } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; - -interface Notify { - request_id: string; - invitor_uin: number; - invitor_nick?: string; - group_id?: number; - group_name?: string; - checked: boolean; - requester_nick?: string; - actor: number; -} +import { Notify } from '@/onebot/types'; export default class GetGroupAddRequest extends OneBotAction { actionName = ActionName.GetGroupIgnoreAddRequest; @@ -28,13 +18,15 @@ export default class GetGroupAddRequest extends OneBotAction { - actionName = ActionName.GetGroupSystemMsg; + actionName = ActionName.GetGroupIgnoredNotifies; async _handle(): Promise { - const NTQQUserApi = this.core.apis.UserApi; - const NTQQGroupApi = this.core.apis.GroupApi; - const SingleScreenNotifies = await NTQQGroupApi.getSingleScreenNotifies(false, 50); + const SingleScreenNotifies = await this.core.apis.GroupApi.getSingleScreenNotifies(false, 50); const retData: RetData = { InvitedRequest: [], join_requests: [] }; const notifyPromises = SingleScreenNotifies.map(async (SSNotify) => { - const invitorUin = SSNotify.user1?.uid ? +await NTQQUserApi.getUinByUidV2(SSNotify.user1.uid) : 0; - const actorUin = SSNotify.user2?.uid ? +await NTQQUserApi.getUinByUidV2(SSNotify.user2.uid) : 0; - + const invitorUin = SSNotify.user1?.uid ? +await this.core.apis.UserApi.getUinByUidV2(SSNotify.user1.uid) : 0; + const actorUin = SSNotify.user2?.uid ? +await this.core.apis.UserApi.getUinByUidV2(SSNotify.user2.uid) : 0; const commonData = { - request_id: `${SSNotify.group.groupCode}|${SSNotify.seq}|${SSNotify.type}`, + request_id: +SSNotify.seq, invitor_uin: invitorUin, invitor_nick: SSNotify.user1?.nickName, group_id: +SSNotify.group?.groupCode, + message: SSNotify?.postscript, group_name: SSNotify.group?.groupName, checked: SSNotify.status !== GroupNotifyMsgStatus.KUNHANDLE, actor: actorUin, diff --git a/src/onebot/action/group/SetGroupAddRequest.ts b/src/onebot/action/group/SetGroupAddRequest.ts index 389e71ff..f9f54cf7 100644 --- a/src/onebot/action/group/SetGroupAddRequest.ts +++ b/src/onebot/action/group/SetGroupAddRequest.ts @@ -4,9 +4,9 @@ import { ActionName } from '@/onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const SchemaData = Type.Object({ - flag: Type.String(), + flag: Type.Union([Type.String(), Type.Number()]), approve: Type.Optional(Type.Union([Type.Boolean(), Type.String()])), - reason: Type.Union([Type.String({ default: ' ' }), Type.Null()]), + reason: Type.Optional(Type.Union([Type.String({ default: ' ' }), Type.Null()])), }); type Payload = Static; @@ -18,10 +18,26 @@ export default class SetGroupAddRequest extends OneBotAction { async _handle(payload: Payload): Promise { const flag = payload.flag.toString(); const approve = payload.approve?.toString() !== 'false'; - await this.core.apis.GroupApi.handleGroupRequest(flag, + const reason = payload.reason ?? ' '; + + let notify = await this.findNotify(flag); + if (!notify) { + throw new Error('No such request'); + } + + await this.core.apis.GroupApi.handleGroupRequest( + notify, approve ? NTGroupRequestOperateTypes.KAGREE : NTGroupRequestOperateTypes.KREFUSE, - payload.reason ?? ' ', + reason, ); return null; } -} + + private async findNotify(flag: string) { + let notify = (await this.core.apis.GroupApi.getSingleScreenNotifies(false, 100)).find(e => e.seq == flag); + if (!notify) { + notify = (await this.core.apis.GroupApi.getSingleScreenNotifies(true, 100)).find(e => e.seq == flag); + } + return notify; + } +} \ No newline at end of file diff --git a/src/onebot/action/system/GetSystemMsg.ts b/src/onebot/action/system/GetSystemMsg.ts index a8a22228..01605869 100644 --- a/src/onebot/action/system/GetSystemMsg.ts +++ b/src/onebot/action/system/GetSystemMsg.ts @@ -1,59 +1,39 @@ import { GroupNotifyMsgStatus } from '@/core'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; - -interface Notify { - request_id: string; - invitor_uin: number; - invitor_nick?: string; - group_id?: number; - group_name?: string; - checked: boolean; - actor: number; -} - -interface JoinRequest extends Notify { - requester_nick?: string; -} +import { Notify } from '@/onebot/types'; interface RetData { InvitedRequest: Notify[]; - join_requests: JoinRequest[]; + join_requests: Notify[]; } export class GetGroupSystemMsg extends OneBotAction { actionName = ActionName.GetGroupSystemMsg; async _handle(): Promise { - const NTQQUserApi = this.core.apis.UserApi; - const NTQQGroupApi = this.core.apis.GroupApi; - const SingleScreenNotifies = await NTQQGroupApi.getSingleScreenNotifies(false, 50); + const SingleScreenNotifies = await this.core.apis.GroupApi.getSingleScreenNotifies(false, 50); const retData: RetData = { InvitedRequest: [], join_requests: [] }; const notifyPromises = SingleScreenNotifies.map(async (SSNotify) => { - const invitorUin = SSNotify.user1?.uid ? +await NTQQUserApi.getUinByUidV2(SSNotify.user1.uid) : 0; - const actorUin = SSNotify.user2?.uid ? +await NTQQUserApi.getUinByUidV2(SSNotify.user2.uid) : 0; + const invitorUin = SSNotify.user1?.uid ? +await this.core.apis.UserApi.getUinByUidV2(SSNotify.user1.uid) : 0; + const actorUin = SSNotify.user2?.uid ? +await this.core.apis.UserApi.getUinByUidV2(SSNotify.user2.uid) : 0; + const commonData = { + request_id: +SSNotify.seq, + invitor_uin: invitorUin, + invitor_nick: SSNotify.user1?.nickName, + group_id: +SSNotify.group?.groupCode, + message: SSNotify?.postscript, + group_name: SSNotify.group?.groupName, + checked: SSNotify.status !== GroupNotifyMsgStatus.KUNHANDLE, + actor: actorUin, + requester_nick: SSNotify.user1?.nickName, + }; if (SSNotify.type === 1) { - retData.InvitedRequest.push({ - request_id: `${SSNotify.group.groupCode}|${SSNotify.seq}|${SSNotify.type}`, - invitor_uin: invitorUin, - invitor_nick: SSNotify.user1?.nickName, - group_id: +SSNotify.group?.groupCode, - group_name: SSNotify.group?.groupName, - checked: SSNotify.status !== GroupNotifyMsgStatus.KUNHANDLE, - actor: actorUin, - }); + retData.InvitedRequest.push(commonData); } else if (SSNotify.type === 7) { - retData.join_requests.push({ - request_id: `${SSNotify.group.groupCode}|${SSNotify.seq}|${SSNotify.type}`, - invitor_uin: invitorUin, - requester_nick: SSNotify.user1?.nickName, - group_id: +SSNotify.group?.groupCode, - group_name: SSNotify.group?.groupName, - checked: SSNotify.status !== GroupNotifyMsgStatus.KUNHANDLE, - actor: actorUin, - }); + retData.join_requests.push(commonData); } }); diff --git a/src/onebot/action/user/SetFriendAddRequest.ts b/src/onebot/action/user/SetFriendAddRequest.ts index 1170b552..aaa739c7 100644 --- a/src/onebot/action/user/SetFriendAddRequest.ts +++ b/src/onebot/action/user/SetFriendAddRequest.ts @@ -3,7 +3,7 @@ import { ActionName } from '@/onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; const SchemaData = Type.Object({ - flag: Type.String(), + flag: Type.Union([Type.String(), Type.Number()]), approve: Type.Optional(Type.Union([Type.String(), Type.Boolean()])), remark: Type.Optional(Type.String()) }); @@ -16,14 +16,13 @@ export default class SetFriendAddRequest extends OneBotAction { async _handle(payload: Payload): Promise { const approve = payload.approve?.toString() !== 'false'; - await this.core.apis.FriendApi.handleFriendRequest(payload.flag, approve); + let notify = (await this.core.apis.FriendApi.getBuddyReq()).buddyReqs.find(e => e.reqTime == payload.flag.toString()); + if (!notify) { + throw new Error('No such request'); + } + await this.core.apis.FriendApi.handleFriendRequest(notify, approve); if (payload.remark) { - const data = payload.flag.split('|'); - if (data.length < 2) { - throw new Error('Invalid flag'); - } - const friendUid = data[0]; - await this.core.apis.FriendApi.setBuddyRemark(friendUid, payload.remark); + await this.core.apis.FriendApi.setBuddyRemark(notify.friendUid, payload.remark); } return null; } diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 5c9c4419..29fc73f7 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -333,7 +333,7 @@ export class NapCatOneBot11Adapter { this.core, +requesterUin, req.extWords, - req.friendUid + '|' + req.reqTime + req.reqTime ) ); } catch (e) { @@ -365,8 +365,7 @@ export class NapCatOneBot11Adapter { if (notifyTime < this.bootTime) { continue; } - - const flag = notify.group.groupCode + '|' + notify.seq + '|' + notify.type; + const flag = notify.seq; this.context.logger.logDebug('收到群通知', notify); if ( [GroupNotifyMsgType.REQUEST_JOIN_NEED_ADMINI_STRATOR_PASS].includes(notify.type) && diff --git a/src/onebot/types/data.ts b/src/onebot/types/data.ts index 3039ba0b..8b3acab2 100644 --- a/src/onebot/types/data.ts +++ b/src/onebot/types/data.ts @@ -11,6 +11,17 @@ export interface OB11User { categoryName?: string; // 分组名称 categoryId?: number; // 分组ID 999为特别关心 } +export interface Notify { + request_id: number; + invitor_uin: number; + invitor_nick?: string; + group_id?: number; + group_name?: string; + message?: string; + checked: boolean; + actor: number; + requester_nick?: string; +} export enum OB11UserSex { male = 'male', // 男性