mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-02-04 14:41:14 +00:00
* feat: support thumbnail for flash-transfer * fix: fix get thumbnail path unknown type error * Refactor flash module types and enums Standardized TypeScript interface property formatting in flash.ts, flash data, and wrapper files. Introduced the UploadSceneType enum for upload scene types, replacing hardcoded numeric values. Improved type annotations and consistency across the flash API and related data structures. * Update arg type in NodeQQNTWrapperUtil interface Changed the type of the 'arg' parameter in the NodeQQNTWrapperUtil interface from optional number to 'number | null | undefined' for improved type clarity. * Refactor flash scene type and update method params Introduced BusiScene enum for sceneType in FileListInfoRequests to improve type safety. Renamed parameters in getFileThumbSavePathForSend for better clarity. * Refactor downloadSceneType to use enum type Replaced numeric downloadSceneType fields with the DownloadSceneType enum in relevant interfaces. Updated NodeIKernelFlashTransferService method signatures to use DownloadSceneType for download operations, improving type safety and code clarity. * refactor: remove thumbnail dependency for QQ resource icons * fix: remove useless console.log --------- Co-authored-by: 手瓜一十雪 <nanaeonn@outlook.com>
63 lines
2.1 KiB
TypeScript
63 lines
2.1 KiB
TypeScript
import { OneBotAction } from '@/napcat-onebot/action/OneBotAction';
|
||
import { ActionName } from '@/napcat-onebot/action/router';
|
||
import { Static, Type, Optional } from '@sinclair/typebox';
|
||
import path from 'node:path';
|
||
|
||
const richMediaList = [
|
||
'.mp4', '.mov', '.avi', '.wmv', '.mpeg', '.mpg', '.flv', '.mkv',
|
||
'.png', '.gif', '.jpg', '.jpeg', '.webp', '.bmp',
|
||
];
|
||
|
||
// 不全部使用json因为:一个文件解析Form-data会变字符串!!! 但是api文档就写List
|
||
const SchemaData = Type.Object({
|
||
files: Type.Union([
|
||
Type.Array(Type.String()),
|
||
Type.String(),
|
||
]),
|
||
name: Optional(Type.String()),
|
||
thumb_path: Optional(Type.String()),
|
||
});
|
||
type Payload = Static<typeof SchemaData>;
|
||
|
||
export class CreateFlashTask extends OneBotAction<Payload, unknown> {
|
||
override actionName = ActionName.CreateFlashTask;
|
||
override payloadSchema = SchemaData;
|
||
|
||
async _handle (payload: Payload) {
|
||
const fileList = Array.isArray(payload.files) ? payload.files : [payload.files];
|
||
let thumbPath: string = '';
|
||
|
||
if (fileList.length === 1) {
|
||
// 我是真没hook到那种合并的缩略图是哪个方法产生的,暂时不实现(怀疑是js直接canvas渲染的!!) // 确认了猜想
|
||
const filePath = fileList[0];
|
||
if (filePath === undefined) {
|
||
return {};
|
||
}
|
||
const ext = path.extname(filePath).toLowerCase();
|
||
|
||
if (richMediaList.includes(ext)) {
|
||
try {
|
||
const res = await this.core.apis.FlashApi.createFileThumbnail(filePath);
|
||
if (res && typeof res === 'object' && 'result' in res && res.result === 0) {
|
||
thumbPath = res.targetPath as string;
|
||
}
|
||
} catch (_e) {
|
||
}
|
||
}
|
||
}
|
||
|
||
function toPlatformPath (inputPath: string) {
|
||
const unifiedPath = inputPath.replace(/[\\/]/g, path.sep);
|
||
return path.normalize(unifiedPath);
|
||
}
|
||
|
||
let normalPath: string;
|
||
if (payload.thumb_path !== undefined) {
|
||
normalPath = path.normalize(payload.thumb_path);
|
||
} else {
|
||
normalPath = toPlatformPath(thumbPath);
|
||
}
|
||
return await this.core.apis.FlashApi.createFlashTransferUploadTask(fileList, normalPath, payload.name || '');
|
||
}
|
||
}
|