Files
NapCatQQ/packages/napcat-core/helper/group-file.ts
T
TanTan f954252a34
Build NapCat Artifacts / Type Check & Test (push) Waiting to run
Release Tag / validate-version (push) Waiting to run
NapCatQQ source snapshot
2026-11-13 09:01:47 +08:00

62 lines
2.7 KiB
TypeScript

import type { NodeIKernelRichMediaService } from '../services/NodeIKernelRichMediaService';
type GroupFileService = Pick<NodeIKernelRichMediaService, 'getGroupFileInfo' | 'deleteGroupFile'>;
function withTimeout<T> (promise: Promise<T>, operation: string): Promise<T> {
return new Promise<T>((resolve, reject) => {
const timer = setTimeout(() => reject(new Error(`${operation}超时,请重新查询群文件列表确认文件状态`)), 15000);
promise.then(resolve, reject).finally(() => clearTimeout(timer));
});
}
function assertBusId (busId: number): void {
if (!Number.isInteger(busId) || busId <= 0 || busId > 0xFFFFFFFF) {
throw new Error('Invalid bus_id');
}
}
export async function deleteGroupFiles (service: GroupFileService, groupCode: string, files: string[], busIds?: number[]) {
if (!files.length || files.some(fileId => !fileId)) {
throw new Error('Invalid file_id');
}
if (busIds && busIds.length !== files.length) {
throw new Error('bus_id 数量必须与文件数量一致');
}
const resolvedBusIds: number[] = [];
for (const [index, fileId] of files.entries()) {
let busId = busIds?.[index];
if (busId === undefined) {
const info = await withTimeout(service.getGroupFileInfo(groupCode, fileId), '查询群文件信息');
if (info?.result !== 0) {
throw new Error(`查询群文件信息失败: ${info?.errMsg || info?.result}`);
}
const detail = info.groupFileInfoResult;
if (detail?.retCode !== 0 || detail.fileInfo?.fileId !== fileId) {
throw new Error(`查询群文件信息失败: ${detail?.clientWording || detail?.retMsg || '未返回目标文件信息'}`);
}
busId = detail.fileInfo.busId;
}
assertBusId(busId);
resolvedBusIds.push(busId);
}
const response = await withTimeout(service.deleteGroupFile(groupCode, resolvedBusIds, files), '删除群文件');
if (response?.result !== 0) {
throw new Error(`删除群文件失败: ${response?.errMsg || response?.result}`);
}
const detail = response.transGroupFileResult;
if (detail?.result?.retCode !== 0) {
throw new Error(`删除群文件失败: ${detail?.result?.clientWording || detail?.result?.retMsg || detail?.result?.retCode || '缺少删除结果'}`);
}
if (!Array.isArray(detail.successFileIdList) || !Array.isArray(detail.failFileIdList)) {
throw new Error('删除群文件失败: 缺少逐文件删除结果');
}
const missing = files.filter(fileId => !detail.successFileIdList.includes(fileId));
if (detail.failFileIdList.length || missing.length) {
const failed = [...new Set([...detail.failFileIdList, ...missing])];
throw new Error(`删除群文件失败: ${failed.join(', ')}`);
}
return response;
}