From 8817dc6b1054c0e91a8d6a448aaeb19482b0c940 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 18:01:31 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20Uid/Uin=E8=BD=AC=E6=8D=A2V2?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/utils/MessageUnique.ts | 2 +- src/common/utils/helper.ts | 14 ++++++++ src/core/src/apis/friend.ts | 21 +++++++++++- src/core/src/apis/group.ts | 9 ++--- src/core/src/apis/user.ts | 33 ++++++++++++------- src/core/src/core.ts | 10 ++++-- src/core/src/data.ts | 10 +++--- .../src/listeners/NodeIKernelGroupListener.ts | 2 +- .../src/services/NodeIKernelGroupService.ts | 14 ++++++-- .../src/services/NodeIKernelProfileService.ts | 4 +-- 10 files changed, 90 insertions(+), 29 deletions(-) diff --git a/src/common/utils/MessageUnique.ts b/src/common/utils/MessageUnique.ts index 215c63ed..cb8ce4a5 100644 --- a/src/common/utils/MessageUnique.ts +++ b/src/common/utils/MessageUnique.ts @@ -2,7 +2,7 @@ import { Peer } from '@/core'; import crypto, { randomInt, randomUUID } from 'crypto'; import { logError } from './log'; -class LimitedHashTable { +export class LimitedHashTable { private keyToValue: Map = new Map(); private valueToKey: Map = new Map(); private maxSize: number; diff --git a/src/common/utils/helper.ts b/src/common/utils/helper.ts index 65ed495f..625c3940 100644 --- a/src/common/utils/helper.ts +++ b/src/common/utils/helper.ts @@ -350,6 +350,20 @@ export function getDefaultQQVersionConfigInfo(): QQVersionConfigType { buildId: '26702' }; } +export async function promisePipeline(promises: Promise[], callback: (result: any) => boolean): Promise { + let callbackCalled = false; + for (const promise of promises) { + if (callbackCalled) break; + try { + const result = await promise; + if (!callbackCalled) { + callbackCalled = callback(result); + } + } catch (error) { + console.error("Error in promise pipeline:", error); + } + } +} export function getQQVersionConfigPath(exePath: string = ""): string | undefined { let configVersionInfoPath; diff --git a/src/core/src/apis/friend.ts b/src/core/src/apis/friend.ts index f05c9934..795a9517 100644 --- a/src/core/src/apis/friend.ts +++ b/src/core/src/apis/friend.ts @@ -1,7 +1,8 @@ import { FriendRequest, FriendV2, SimpleInfo, User } from '@/core/entities'; import { BuddyListReqType, napCatCore, NodeIKernelBuddyListener, NodeIKernelProfileService, OnBuddyChangeParams } from '@/core'; import { NTEventDispatch } from '@/common/utils/EventTask'; - +import { LimitedHashTable } from '@/common/utils/MessageUnique'; +import { CacheClassFuncAsyncExtend } from '@/common/utils/helper'; export class NTQQFriendApi { static async getBuddyV2(refresh = false): Promise { let uids: string[] = []; @@ -13,6 +14,24 @@ export class NTQQFriendApi { ); return Array.from(data.values()); } + @CacheClassFuncAsyncExtend(5000, 'getBuddyIdMap', true) + static async getBuddyIdMapCache(refresh = false): Promise> { + return await NTQQFriendApi.getBuddyIdMap(refresh); + } + static async getBuddyIdMap(refresh = false): Promise> { + let uids: string[] = []; + let retMap: LimitedHashTable = new LimitedHashTable(5000); + const buddyService = napCatCore.session.getBuddyService(); + const buddyListV2 = refresh ? await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL) : await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL); + uids.push(...buddyListV2.data.flatMap(item => item.buddyUids)); + const data = await NTEventDispatch.CallNoListenerEvent( + 'NodeIKernelProfileService/getCoreAndBaseInfo', 5000, 'nodeStore', uids + ); + data.forEach((value, key) => { + retMap.set(value.uin!, value.uid!); + }); + return retMap; + } static async getBuddyV2ExWithCate(refresh = false) { let uids: string[] = []; let categoryMap: Map = new Map(); diff --git a/src/core/src/apis/group.ts b/src/core/src/apis/group.ts index 478a01da..6ecc0ae7 100644 --- a/src/core/src/apis/group.ts +++ b/src/core/src/apis/group.ts @@ -1,5 +1,5 @@ -import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group, MemberExtSourceType, GroupNotifyTypes, ChatType, Peer } from '../entities'; -import { GeneralCallResult, NTQQUserApi, napCatCore } from '@/core'; +import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group, MemberExtSourceType, GroupNotifyTypes, ChatType, Peer, GroupListUpdateType } from '../entities'; +import { GeneralCallResult, NTQQUserApi, NodeIKernelGroupListener, napCatCore } from '@/core'; import { NTEventDispatch } from '@/common/utils/EventTask'; import { log } from '@/common/utils/log'; import { groupMembers } from '../data'; @@ -9,14 +9,15 @@ export class NTQQGroupApi { return napCatCore.session.getGroupService().setHeader(gc, filePath); } static async getGroups(forced = false) { + type ListenerType = NodeIKernelGroupListener['onGroupListUpdate']; let [_retData, _updateType, groupList] = await NTEventDispatch.CallNormalEvent - <(force: boolean) => Promise, (updateType: number, groupList: Group[]) => void> + <(force: boolean) => Promise, ListenerType> ( 'NodeIKernelGroupService/getGroupList', 'NodeIKernelGroupListener/onGroupListUpdate', 1, 5000, - () => true, + (updateType) => true, forced ); return groupList; diff --git a/src/core/src/apis/user.ts b/src/core/src/apis/user.ts index d2b8c153..bb3360ab 100644 --- a/src/core/src/apis/user.ts +++ b/src/core/src/apis/user.ts @@ -214,15 +214,25 @@ export class NTQQUserApi { logWarn("uin转换到uid时异常", Uin); return false; }) + static async getUidByUinV2(Uin: string) { + let uid = (await napCatCore.session.getProfileService().getUidByUin('FriendsServiceImpl', [Uin])).get(Uin); + if (uid) return uid; + uid = (await napCatCore.session.getGroupService().getUidByUins([Uin])).uids.get(Uin); + return uid; + } + static async getUinByUidV2(Uid: string) { + let uid = (await napCatCore.session.getProfileService().getUinByUid('FriendsServiceImpl', [Uid])).get(Uid); + if (uid) return uid; + uid = (await napCatCore.session.getGroupService().getUinByUids([Uid])).uins.get(Uid); + return uid; + } static async getUidByUin(Uin: string) { - //Uid 接口转 - let ret = await NTEventDispatch.CallNoListenerEvent - <(Uin: string[]) => Promise<{ uidInfo: Map }>>( - 'NodeIKernelUixConvertService/getUid', - 5000, - [Uin] - ); - let uid = ret.uidInfo.get(Uin); + if (!requireMinNTQQBuild('26702')) { + let uidV2 = NTQQUserApi.getUidByUinV2(Uin); + if (uidV2) return uidV2; + } + // 通用转换开始尝试 + let uid = (await napCatCore.session.getUixConvertService().getUid([Uin])).uinInfo.get(Uin); // Uid 好友转 if (!uid) { Array.from(friends.values()).forEach((t) => { @@ -256,9 +266,10 @@ export class NTQQUserApi { logWarn("uid转换到uin时异常", Uid); return false; }) - static async getUinByUid(Uid: string | undefined) { - if (!Uid) { - return ''; + static async getUinByUid(Uid: string) { + if (!requireMinNTQQBuild('26702')) { + let uinV2 = NTQQUserApi.getUidByUinV2(Uid); + if (uinV2) return uinV2; } let ret = await NTEventDispatch.CallNoListenerEvent <(Uin: string[]) => Promise<{ uinInfo: Map }>>( diff --git a/src/core/src/core.ts b/src/core/src/core.ts index 7b205d13..f7ed72c8 100644 --- a/src/core/src/core.ts +++ b/src/core/src/core.ts @@ -20,7 +20,7 @@ import { hostname, systemVersion } from '@/common/utils/system'; import { genSessionConfig } from '@/core/sessionConfig'; import { sleep } from '@/common/utils/helper'; import crypto from 'node:crypto'; -import { friends, groupMembers, groups, selfInfo, stat } from '@/core/data'; +import { groupMembers, groups, selfInfo, stat } from '@/core/data'; import { GroupMember, RawMessage } from '@/core/entities'; import { NTEventDispatch } from '@/common/utils/EventTask'; import { @@ -33,6 +33,7 @@ import { setLogSelfInfo } from '@/common/utils/log'; import { napCatConfig } from '@/core/utils/config'; +import { NTQQFriendApi } from './apis'; export interface OnLoginSuccess { (uin: string, uid: string): void | Promise; @@ -262,8 +263,13 @@ export class NapCatCore { this.session.getBuddyService().getBuddyList(true).then(arg => { // console.log('getBuddyList', arg); }); + } else { + // NTQQFriendApi.getBuddyV2(true).then((res) => { + // res.forEach((item) => { + // CachedIdMap.set(item.uid!, item.uin!); + // }); + // }).catch(); } - interface SelfStatusInfo { uid: string status: number diff --git a/src/core/src/data.ts b/src/core/src/data.ts index 31143f41..edeb662d 100644 --- a/src/core/src/data.ts +++ b/src/core/src/data.ts @@ -3,9 +3,11 @@ import { type Group, type GroupMember, type SelfInfo, - type BuddyCategoryType + type BuddyCategoryType, + FriendV2 } from './entities'; import { isNumeric } from '@/common/utils/helper'; +import { LimitedHashTable } from '@/common/utils/MessageUnique'; import { NTQQGroupApi } from '@/core/apis'; export const selfInfo: SelfInfo = { @@ -14,8 +16,6 @@ export const selfInfo: SelfInfo = { nick: '', online: true }; -// 未来只在此处保留 selfInfo stat -// groupCode -> Group export const groups: Map = new Map(); export function deleteGroup(groupQQ: string) { @@ -26,9 +26,11 @@ export function deleteGroup(groupQQ: string) { // 群号 -> 群成员map(uid=>GroupMember) export const groupMembers: Map> = new Map>(); -// uid -> Friend 下面这俩个准备移除 QQ里面自带缓存 export const friends: Map = new Map(); +//转换列表 +//export const CachedIdMap = new LimitedHashTable(1000); + export async function getGroup(qq: string | number): Promise { let group = groups.get(qq.toString()); if (!group) { diff --git a/src/core/src/listeners/NodeIKernelGroupListener.ts b/src/core/src/listeners/NodeIKernelGroupListener.ts index c80a775e..9434d4e4 100644 --- a/src/core/src/listeners/NodeIKernelGroupListener.ts +++ b/src/core/src/listeners/NodeIKernelGroupListener.ts @@ -96,7 +96,7 @@ export class GroupListener implements IGroupListener { onGroupFirstBulletinNotify(...args: unknown[]) { } - onGroupListUpdate(updateType: number, groupList: Group[]) { + onGroupListUpdate(updateType: GroupListUpdateType, groupList: Group[]) { } onGroupNotifiesUpdated(dboubt: boolean, notifies: GroupNotify[]) { diff --git a/src/core/src/services/NodeIKernelGroupService.ts b/src/core/src/services/NodeIKernelGroupService.ts index 52d07526..d23139ad 100644 --- a/src/core/src/services/NodeIKernelGroupService.ts +++ b/src/core/src/services/NodeIKernelGroupService.ts @@ -9,7 +9,7 @@ import { import { GeneralCallResult } from '@/core/services/common'; export interface NodeIKernelGroupService { - + getUidByUin(uin: string): Promise; getUinByUid(uid: string): Promise; @@ -17,8 +17,16 @@ export interface NodeIKernelGroupService { getGroupMemberLevelInfo(groupCode: string): Promise; //26702 getGroupHonorList(groupCodes: Array): unknown; - getUinByUids(uins: string[]): Promise; - getUidByUins(uins: string[]): Promise; + getUinByUids(uins: string[]): Promise<{ + errCode: number, + errMsg: string, + uins: Map + }>; + getUidByUins(uins: string[]): Promise<{ + errCode: number, + errMsg: string, + uids: Map + }>; //26702(其实更早 但是我不知道) checkGroupMemberCache(arrayList: Array): Promise; //26702(其实更早 但是我不知道) diff --git a/src/core/src/services/NodeIKernelProfileService.ts b/src/core/src/services/NodeIKernelProfileService.ts index ec7e9861..e626a332 100644 --- a/src/core/src/services/NodeIKernelProfileService.ts +++ b/src/core/src/services/NodeIKernelProfileService.ts @@ -15,9 +15,9 @@ export enum ProfileBizType { } export interface NodeIKernelProfileService { - getUidByUin(uin: string): Promise; + getUidByUin(callfrom: string, uin: Array): Promise>;//uin->uid - getUinByUid(uid: string): Promise; + getUinByUid(callfrom: string, uid: Array): Promise>; // { // coreInfo: CoreInfo, // baseInfo: BaseInfo,