mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-12-18 20:30:08 +08:00
* feat: pnpm new * Refactor build and release workflows, update dependencies Switch build scripts and workflows from npm to pnpm, update build and artifact paths, and simplify release workflow by removing version detection and changelog steps. Add new dependencies (silk-wasm, express, ws, node-pty-prebuilt-multiarch), update exports in package.json files, and add vite config for napcat-framework. Also, rename manifest.json for framework package and fix static asset copying in shell build config.
134 lines
4.8 KiB
TypeScript
134 lines
4.8 KiB
TypeScript
import { FriendRequest, FriendV2 } from '@/napcat-core/types';
|
|
import { BuddyListReqType, InstanceContext, NapCatCore } from '@/napcat-core/index';
|
|
import { LimitedHashTable } from 'napcat-common/src/message-unique';
|
|
|
|
export class NTQQFriendApi {
|
|
context: InstanceContext;
|
|
core: NapCatCore;
|
|
|
|
constructor (context: InstanceContext, core: NapCatCore) {
|
|
this.context = context;
|
|
this.core = core;
|
|
}
|
|
|
|
async setBuddyRemark (uid: string, remark: string) {
|
|
return this.context.session.getBuddyService().setBuddyRemark({ uid, remark });
|
|
}
|
|
|
|
async getBuddyV2SimpleInfoMap () {
|
|
const buddyService = this.context.session.getBuddyService();
|
|
let uids: string[] = [];
|
|
if (this.core.context.basicInfoWrapper.requireMinNTQQBuild('41679')) {
|
|
const buddyListV2NT = await buddyService.getBuddyListV2('0', true, BuddyListReqType.KNOMAL);
|
|
uids = buddyListV2NT.data.flatMap(item => item.buddyUids);
|
|
} else {
|
|
const buddyListV2 = await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL);
|
|
uids = buddyListV2.data.flatMap(item => item.buddyUids);
|
|
}
|
|
return await this.core.eventWrapper.callNoListenerEvent(
|
|
'NodeIKernelProfileService/getCoreAndBaseInfo',
|
|
'nodeStore',
|
|
uids
|
|
);
|
|
}
|
|
|
|
async getBuddy (): Promise<FriendV2[]> {
|
|
return Array.from((await this.getBuddyV2SimpleInfoMap()).values());
|
|
}
|
|
|
|
async getBuddyIdMap (): Promise<LimitedHashTable<string, string>> {
|
|
const retMap: LimitedHashTable<string, string> = new LimitedHashTable<string, string>(5000);
|
|
const data = await this.getBuddyV2SimpleInfoMap();
|
|
data.forEach((value) => retMap.set(value.uin!, value.uid!));
|
|
return retMap;
|
|
}
|
|
|
|
async delBuudy (uid: string, tempBlock = false, tempBothDel = false) {
|
|
return this.context.session.getBuddyService().delBuddy({
|
|
friendUid: uid,
|
|
tempBlock,
|
|
tempBothDel,
|
|
});
|
|
}
|
|
|
|
async getBuddyV2ExWithCate () {
|
|
const buddyService = this.context.session.getBuddyService();
|
|
let uids: string[] = [];
|
|
let buddyListV2: Awaited<ReturnType<typeof buddyService.getBuddyListV2>>['data'];
|
|
if (this.core.context.basicInfoWrapper.requireMinNTQQBuild('41679')) {
|
|
buddyListV2 = (await buddyService.getBuddyListV2('0', true, BuddyListReqType.KNOMAL)).data;
|
|
uids = buddyListV2.flatMap(item => item.buddyUids);
|
|
} else {
|
|
buddyListV2 = (await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL)).data;
|
|
uids = buddyListV2.flatMap(item => item.buddyUids);
|
|
}
|
|
const data = await this.core.eventWrapper.callNoListenerEvent(
|
|
'NodeIKernelProfileService/getCoreAndBaseInfo',
|
|
'nodeStore',
|
|
uids
|
|
);
|
|
return buddyListV2.map(category => ({
|
|
categoryId: category.categoryId,
|
|
categorySortId: category.categorySortId,
|
|
categoryName: category.categroyName,
|
|
categoryMbCount: category.categroyMbCount,
|
|
onlineCount: category.onlineCount,
|
|
buddyList: category.buddyUids.map(uid => data.get(uid)).filter(value => !!value),
|
|
}));
|
|
}
|
|
|
|
async isBuddy (uid: string) {
|
|
return this.context.session.getBuddyService().isBuddy(uid);
|
|
}
|
|
|
|
async clearBuddyReqUnreadCnt () {
|
|
return this.context.session.getBuddyService().clearBuddyReqUnreadCnt();
|
|
}
|
|
|
|
async getBuddyReq () {
|
|
const [, ret] = await this.core.eventWrapper.callNormalEventV2(
|
|
'NodeIKernelBuddyService/getBuddyReq',
|
|
'NodeIKernelBuddyListener/onBuddyReqChange',
|
|
[]
|
|
);
|
|
return ret;
|
|
}
|
|
|
|
async handleFriendRequest (notify: FriendRequest, accept: boolean) {
|
|
this.context.session.getBuddyService()?.approvalFriendRequest({
|
|
friendUid: notify.friendUid,
|
|
reqTime: notify.reqTime,
|
|
accept,
|
|
});
|
|
}
|
|
|
|
async handleDoubtFriendRequest (friendUid: string, str1: string = '', str2: string = '') {
|
|
this.context.session.getBuddyService().approvalDoubtBuddyReq(friendUid, str1, str2);
|
|
}
|
|
|
|
async getDoubtFriendRequest (count: number) {
|
|
const date = Date.now().toString();
|
|
const [, ret] = await this.core.eventWrapper.callNormalEventV2(
|
|
'NodeIKernelBuddyService/getDoubtBuddyReq',
|
|
'NodeIKernelBuddyListener/onDoubtBuddyReqChange',
|
|
[date, count, ''],
|
|
() => true,
|
|
(data) => data.reqId === date
|
|
);
|
|
const requests = Promise.all(ret.doubtList.map(async (item) => {
|
|
return {
|
|
flag: item.uid, // 注意强制String 非isNumeric 不遵守则不符合设计
|
|
uin: await this.core.apis.UserApi.getUinByUidV2(item.uid) ?? 0, // 信息字段
|
|
nick: item.nick, // 信息字段 这个不是nickname 可能是来源的群内的昵称
|
|
source: item.source, // 信息字段
|
|
reason: item.reason, // 信息字段
|
|
msg: item.msg, // 信息字段
|
|
group_code: item.groupCode, // 信息字段
|
|
time: item.reqTime, // 信息字段
|
|
type: 'doubt', // 保留字段
|
|
};
|
|
}));
|
|
return requests;
|
|
}
|
|
}
|