Compare commits

...

6 Commits

Author SHA1 Message Date
手瓜一十雪
93c140ed4e Improve error message for group notice image upload
Enhanced the error message when group notice image upload fails to include the error details from the upload API response.
2025-11-07 20:00:17 +08:00
手瓜一十雪
457b072f0e Update NTQQ build version check to 41679
Changed the minimum NTQQ build version required for buddy list operations from 40990 to 41679 in NTQQFriendApi. Ensures compatibility with newer NTQQ builds.
2025-11-07 19:57:07 +08:00
手瓜一十雪
1869493473 Update getBuddyV2ExWithCate for NTQQ build compatibility
Modified getBuddyV2ExWithCate to conditionally call getBuddyListV2 with an extra boolean argument for NTQQ builds >= 40990, ensuring compatibility with different API signatures.
2025-11-07 19:50:11 +08:00
Mlikiowa
f33c66ce15 release: v4.9.28 2025-11-07 11:35:58 +00:00
手瓜一十雪
e8d6f86458 feat: 修复一些问题 2025-11-07 19:35:35 +08:00
手瓜一十雪
a000ffdf0d fix: buddylist 2025-11-07 19:29:39 +08:00
9 changed files with 91 additions and 67 deletions

2
.gitignore vendored
View File

@@ -15,3 +15,5 @@ devconfig/*
checkVersion.sh
bun.lockb
tests/run/
guild1.db-wal
guild1.db-shm

View File

@@ -4,7 +4,7 @@
"name": "NapCatQQ",
"slug": "NapCat.Framework",
"description": "高性能的 OneBot 11 协议实现",
"version": "4.9.27",
"version": "4.9.28",
"icon": "./logo.png",
"authors": [
{

View File

@@ -2,7 +2,7 @@
"name": "napcat",
"private": true,
"type": "module",
"version": "4.9.27",
"version": "4.9.28",
"scripts": {
"build:universal": "npm run build:webui && npm run dev:universal || exit 1",
"build:framework": "npm run build:webui && npm run dev:framework || exit 1",

View File

@@ -1 +1 @@
export const napCatVersion = '4.9.27';
export const napCatVersion = '4.9.28';

View File

@@ -17,8 +17,14 @@ export class NTQQFriendApi {
async getBuddyV2SimpleInfoMap () {
const buddyService = this.context.session.getBuddyService();
const buddyListV2 = await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL);
const uids = buddyListV2.data.flatMap(item => item.buddyUids);
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',
@@ -47,10 +53,15 @@ export class NTQQFriendApi {
async getBuddyV2ExWithCate () {
const buddyService = this.context.session.getBuddyService();
const buddyListV2 = (await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL)).data;
const uids = buddyListV2.flatMap(item => {
return item.buddyUids;
});
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',

View File

@@ -3,122 +3,133 @@ import { NodeIKernelBuddyListener } from '@/core/listeners';
import { BuddyListReqType } from '@/core/types/user';
export interface NodeIKernelBuddyService {
getBuddyListV2(callFrom: string, reqType: BuddyListReqType): Promise<GeneralCallResult & {
getBuddyListV2 (callFrom: string, reqType: BuddyListReqType): Promise<GeneralCallResult & {
data: Array<{
categoryId: number,
categorySortId: number,
categroyName: string,
categroyMbCount: number,
onlineCount: number,
buddyUids: Array<string>
}>
buddyUids: Array<string>;
}>;
}>;
getBuddyListV2 (callFrom: string, isPullRefresh: boolean, reqType: BuddyListReqType): Promise<GeneralCallResult & {
data: Array<{
categoryId: number,
categorySortId: number,
categroyName: string,
categroyMbCount: number,
onlineCount: number,
buddyUids: Array<string>;
}>;
}>;
getBuddyListFromCache(reqType: BuddyListReqType): Promise<Array<
{
categoryId: number, // 9999为特别关心
categorySortId: number, // 排序方式
categroyName: string, // 分类名
categroyMbCount: number, // 不懂
onlineCount: number, // 在线数目
buddyUids: Array<string>// Uids
}>>;
addKernelBuddyListener(listener: NodeIKernelBuddyListener): number;
getBuddyListFromCache (reqType: BuddyListReqType): Promise<Array<
{
categoryId: number, // 9999为特别关心
categorySortId: number, // 排序方式
categroyName: string, // 分类名
categroyMbCount: number, // 不懂
onlineCount: number, // 在线数目
buddyUids: Array<string>;// Uids
}>>;
getAllBuddyCount(): number;
addKernelBuddyListener (listener: NodeIKernelBuddyListener): number;
removeKernelBuddyListener(listenerId: number): void;
getAllBuddyCount (): number;
removeKernelBuddyListener (listenerId: number): void;
// getBuddyList(nocache: boolean): Promise<GeneralCallResult>;
getBuddyNick(uid: number): string;
getBuddyNick (uid: number): string;
getBuddyRemark(uid: number): string;
getBuddyRemark (uid: number): string;
setBuddyRemark(param: { uid: string, remark: string, signInfo?: unknown }): void;
setBuddyRemark (param: { uid: string, remark: string, signInfo?: unknown; }): void;
getAvatarUrl(uid: number): string;
getAvatarUrl (uid: number): string;
isBuddy(uid: string): boolean;
isBuddy (uid: string): boolean;
getCategoryNameWithUid(uid: number): string;
getCategoryNameWithUid (uid: number): string;
getTargetBuddySetting(uid: number): unknown;
getTargetBuddySetting (uid: number): unknown;
getTargetBuddySettingByType(uid: number, type: number): unknown;
getTargetBuddySettingByType (uid: number, type: number): unknown;
getBuddyReqUnreadCnt(): number;
getBuddyReqUnreadCnt (): number;
getBuddyReq(): Promise<GeneralCallResult>;
getBuddyReq (): Promise<GeneralCallResult>;
delBuddyReq(uid: number): void;
delBuddyReq (uid: number): void;
clearBuddyReqUnreadCnt(): Promise<GeneralCallResult>;
clearBuddyReqUnreadCnt (): Promise<GeneralCallResult>;
reqToAddFriends(uid: number, msg: string): void;
reqToAddFriends (uid: number, msg: string): void;
setSpacePermission(uid: number, permission: number): void;
setSpacePermission (uid: number, permission: number): void;
approvalFriendRequest(arg: {
approvalFriendRequest (arg: {
friendUid: string;
reqTime: string;
accept: boolean;
}): Promise<void>;
delBuddy(param: {
delBuddy (param: {
friendUid: string;
tempBlock: boolean;
tempBothDel: boolean;
}): Promise<unknown>;
delBatchBuddy(uids: number[]): void;
delBatchBuddy (uids: number[]): void;
getSmartInfos(uid: number): unknown;
getSmartInfos (uid: number): unknown;
setBuddyCategory(uid: number, category: number): void;
setBuddyCategory (uid: number, category: number): void;
setBatchBuddyCategory(uids: number[], category: number): void;
setBatchBuddyCategory (uids: number[], category: number): void;
addCategory(category: string): void;
addCategory (category: string): void;
delCategory(category: string): void;
delCategory (category: string): void;
renameCategory(oldCategory: string, newCategory: string): void;
renameCategory (oldCategory: string, newCategory: string): void;
resortCategory(categorys: string[]): void;
resortCategory (categorys: string[]): void;
pullCategory(uid: number, category: string): void;
pullCategory (uid: number, category: string): void;
setTop(uid: number, isTop: boolean): void;
setTop (uid: number, isTop: boolean): void;
SetSpecialCare(uid: number, isSpecialCare: boolean): void;
SetSpecialCare (uid: number, isSpecialCare: boolean): void;
setMsgNotify(uid: number, isNotify: boolean): void;
setMsgNotify (uid: number, isNotify: boolean): void;
hasBuddyList(): boolean;
hasBuddyList (): boolean;
setBlock(uid: number, isBlock: boolean): void;
setBlock (uid: number, isBlock: boolean): void;
isBlocked(uid: number): boolean;
isBlocked (uid: number): boolean;
modifyAddMeSetting(setting: unknown): void;
modifyAddMeSetting (setting: unknown): void;
getAddMeSetting(): unknown;
getAddMeSetting (): unknown;
getDoubtBuddyReq(reqId: string, num: number, uk:string): Promise<GeneralCallResult>;
getDoubtBuddyReq (reqId: string, num: number, uk: string): Promise<GeneralCallResult>;
getDoubtBuddyUnreadNum(): number;
getDoubtBuddyUnreadNum (): number;
approvalDoubtBuddyReq(uid: string, str1: string, str2: string): void;
approvalDoubtBuddyReq (uid: string, str1: string, str2: string): void;
delDoubtBuddyReq(uid: number): void;
delDoubtBuddyReq (uid: number): void;
delAllDoubtBuddyReq(): Promise<GeneralCallResult>;
delAllDoubtBuddyReq (): Promise<GeneralCallResult>;
reportDoubtBuddyReqUnread(): void;
reportDoubtBuddyReqUnread (): void;
getBuddyRecommendContactArkJson(uid: string, phoneNumber: string): Promise<GeneralCallResult & { arkMsg: string }>;
getBuddyRecommendContactArkJson (uid: string, phoneNumber: string): Promise<GeneralCallResult & { arkMsg: string; }>;
isNull(): boolean;
isNull (): boolean;
}

View File

@@ -37,7 +37,7 @@ export class SendGroupNotice extends OneBotAction<Payload, null> {
await checkFileExist(path, 5000);
const ImageUploadResult = await this.core.apis.GroupApi.uploadGroupBulletinPic(payload.group_id.toString(), path);
if (ImageUploadResult.errCode !== 0) {
throw new Error(`群公告${payload.image}设置失败,图片上传失败`);
throw new Error(`群公告${payload.image}设置失败,图片上传失败 错误信息:${ImageUploadResult.errMsg}`);
}
unlink(path).catch(() => { });

Binary file not shown.