From 690a2f7d347863a32d73348f7f273f409e8bc471 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: Sun, 4 Aug 2024 16:27:25 +0800 Subject: [PATCH] =?UTF-8?q?refctor:=20getBuddyV2=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/src/apis/friend.ts | 55 +++++++++++++++++++---- src/core/src/entities/user.ts | 5 ++- src/onebot11/action/user/GetFriendList.ts | 2 +- src/onebot11/constructor.ts | 15 ++++++- src/onebot11/types/entity.ts | 2 + 5 files changed, 67 insertions(+), 12 deletions(-) diff --git a/src/core/src/apis/friend.ts b/src/core/src/apis/friend.ts index 71188509..742d0da1 100644 --- a/src/core/src/apis/friend.ts +++ b/src/core/src/apis/friend.ts @@ -1,23 +1,62 @@ -import { FriendRequest, SimpleInfo, User } from '@/core/entities'; +import { FriendRequest, FriendV2, SimpleInfo, User } from '@/core/entities'; import { BuddyListReqType, napCatCore, NodeIKernelBuddyListener, NodeIKernelProfileService, OnBuddyChangeParams } from '@/core'; import { NTEventDispatch } from '@/common/utils/EventTask'; export class NTQQFriendApi { - static async getBuddyV2(refresh = false): Promise { - // NTEventDispatch.RegisterListen('NodeIKernelBuddyListener/onBuddyListChange', 1, 5000, (arg: OnBuddyChangeParams) => { - // console.log(arg); - // return true; - // }).catch().then(); + static async getBuddyV2(refresh = false): Promise { let uids: string[]; + let categoryMap: Map = new Map(); if (!refresh) { - uids = (await napCatCore.session.getBuddyService().getBuddyListFromCache('0')).flatMap((item) => item.buddyUids); + uids = (await napCatCore.session.getBuddyService().getBuddyListFromCache('0')).flatMap((item) => { + for (let i = 0; i < item.buddyUids.length; i++) { + categoryMap.set(item.buddyUids[i], { categoryId: item.categoryId, categroyName: item.categroyName }); + } + return item.buddyUids; + }); } uids = (await (napCatCore.session.getBuddyService().getBuddyListV2('0', BuddyListReqType.KNOMAL))).data.flatMap((item) => item.buddyUids); let data = await NTEventDispatch.CallNoListenerEvent('NodeIKernelProfileService/getCoreAndBaseInfo', 5000, 'nodeStore', uids); //遍历data - let retArr = Array.from(data.values()); + let retArr: FriendV2[] = []; + data.forEach((value, key) => { + let category = categoryMap.get(key); + if (category) { + retArr.push({ + ...value, + categoryId: category.categoryId, + categroyName: category.categroyName + }); + } + }) return retArr; } + static async getBuddyV2Ex(refresh = false): Promise { + let uids: string[] = []; + let categoryMap: Map = new Map(); + + const buddyService = napCatCore.session.getBuddyService(); + + if (!refresh) { + const cachedBuddyList = await buddyService.getBuddyListFromCache('0'); + cachedBuddyList.forEach(item => { + item.buddyUids.forEach(uid => { + categoryMap.set(uid, { categoryId: item.categoryId, categroyName: item.categroyName }); + }); + uids.push(...item.buddyUids); + }); + } + + const buddyListV2 = await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL); + uids.push(...buddyListV2.data.flatMap(item => item.buddyUids)); + + const data = await NTEventDispatch.CallNoListenerEvent( + 'NodeIKernelProfileService/getCoreAndBaseInfo', 5000, 'nodeStore', uids + ); + return Array.from(data).map(([key, value]) => { + const category = categoryMap.get(key); + return category ? { ...value, categoryId: category.categoryId, categroyName: category.categroyName } : value; + }); +} static async isBuddy(uid: string) { return napCatCore.session.getBuddyService().isBuddy(uid); } diff --git a/src/core/src/entities/user.ts b/src/core/src/entities/user.ts index 1946802a..eefb9c33 100644 --- a/src/core/src/entities/user.ts +++ b/src/core/src/entities/user.ts @@ -173,7 +173,10 @@ export interface SimpleInfo { otherFlags: any | null; intimate: any | null; } - +export interface FriendV2 extends SimpleInfo { + categoryId?: number; + categroyName?: string; +} export interface UserDetailInfoListenerArg { uid: string; uin: string; diff --git a/src/onebot11/action/user/GetFriendList.ts b/src/onebot11/action/user/GetFriendList.ts index e72eaa31..bc1e8df6 100644 --- a/src/onebot11/action/user/GetFriendList.ts +++ b/src/onebot11/action/user/GetFriendList.ts @@ -23,7 +23,7 @@ export default class GetFriendList extends BaseAction { protected async _handle(payload: Payload) { if (requireMinNTQQBuild('26702')) { //全新逻辑 - return OB11Constructor.friendsV2(await NTQQFriendApi.getBuddyV2(payload?.no_cache === true || payload?.no_cache === 'true')); + return OB11Constructor.friendsV2(await NTQQFriendApi.getBuddyV2Ex(payload?.no_cache === true || payload?.no_cache === 'true')); } if (friends.size === 0 || payload?.no_cache === true || payload?.no_cache === 'true') { const _friends = await NTQQFriendApi.getFriends(true); diff --git a/src/onebot11/constructor.ts b/src/onebot11/constructor.ts index 17808394..756d3170 100644 --- a/src/onebot11/constructor.ts +++ b/src/onebot11/constructor.ts @@ -14,6 +14,7 @@ import { ChatType, FaceIndex, Friend, + FriendV2, GrayTipElementSubType, Group, GroupMember, @@ -553,11 +554,21 @@ export class OB11Constructor { nickname: selfInfo.nick, }; } - static friendsV2(friends: SimpleInfo[]): OB11User[] { + static friendsV2(friends: FriendV2[]): OB11User[] { const data: OB11User[] = []; friends.forEach(friend => { const sexValue = this.sex(friend.baseInfo.sex!); - data.push({ ...friend.baseInfo, ...friend.coreInfo, user_id: parseInt(friend.coreInfo.uin), nickname: friend.coreInfo.nick, remark: friend.coreInfo.nick, sex: sexValue, level: 0 }); + data.push({ + ...friend.baseInfo, + ...friend.coreInfo, + user_id: parseInt(friend.coreInfo.uin), + nickname: friend.coreInfo.nick, + remark: friend.coreInfo.nick, + sex: sexValue, + level: 0, + categroyName: friend.categroyName, + categoryId: friend.categoryId + }); }); return data; } diff --git a/src/onebot11/types/entity.ts b/src/onebot11/types/entity.ts index 6dcba604..d17eab8b 100644 --- a/src/onebot11/types/entity.ts +++ b/src/onebot11/types/entity.ts @@ -7,6 +7,8 @@ export interface OB11User { age?: number; qid?: string; login_days?: number; + categroyName?:string; + categoryId?:number; } export enum OB11UserSex {