Merge branch 'dev' of github.com:linyuchen/LiteLoaderQQNT-OneBotApi into dev

This commit is contained in:
linyuchen 2024-03-18 11:46:38 +08:00
commit dc559ce36c
3 changed files with 106 additions and 0 deletions

View File

@ -0,0 +1,103 @@
import BaseAction from "../BaseAction";
import {ActionName} from "../types";
import fs from "fs";
import {join as joinPath} from "node:path";
import {calculateFileMD5, DATA_DIR} from "../../../common/utils";
interface Payload {
thread_count?: number
url?: string
base64?: string
name?: string
headers?: string | string[]
}
interface FileResponse {
file: string
}
const localPath = joinPath(DATA_DIR, "file_cache")
export default class GoCQHTTPDownloadFile extends BaseAction<Payload, FileResponse> {
actionName = ActionName.GoCQHTTP_DownloadFile
constructor() {
super();
if (!fs.existsSync(localPath)) {
fs.mkdirSync(localPath)
}
}
protected async _handle(payload: Payload): Promise<FileResponse> {
let name = payload.name || "";
const isRandomName = !payload.name
if (isRandomName) {
do {
name = this.generateRandomString(10);
// 使用循环防止极低概率的情况下随机出已有的文件, 导致覆盖
} while (fs.existsSync(joinPath(localPath, name)));
}
const filePath = joinPath(localPath, name);
if (payload.base64) {
fs.writeFileSync(filePath, payload.base64, 'base64')
} else if (payload.url) {
const headers = this.getHeaders(payload.headers);
const result = await fetch(payload.url, {headers})
if (! result.ok) throw new Error(`下载文件失败: ${result.statusText}`)
const blob = await result.blob();
let buffer = await blob.arrayBuffer();
fs.writeFileSync(filePath, Buffer.from(buffer), 'binary');
} else {
throw new Error("不存在任何文件, 无法下载")
}
if (fs.existsSync(filePath)) {
if (isRandomName) {
// 默认实现要名称未填写时文件名为文件 md5
const md5 = await calculateFileMD5(filePath);
const newPath = joinPath(localPath, md5);
fs.renameSync(filePath, newPath);
return { file: newPath }
}
return { file: filePath }
} else {
throw new Error("文件写入失败, 检查权限")
}
}
generateRandomString(length: number): string {
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let randomString = '';
for (let i = 0; i < length; i++) {
const randomIndex = Math.floor(Math.random() * characters.length);
randomString += characters.charAt(randomIndex);
}
return randomString;
}
getHeaders(headersIn?: string | string[]): any {
const headers = {};
if (typeof headersIn == 'string') {
headersIn = headersIn.split('[\\r\\n]');
}
if (Array.isArray(headersIn)) {
for (const headerItem of headersIn) {
const spilt = headerItem.indexOf('=');
if (spilt < 0) {
headers[headerItem] = "";
} else {
const key = headerItem.substring(0, spilt);
headers[key] = headerItem.substring(0, spilt + 1);
}
}
}
if (!headers['Content-Type']) {
headers['Content-Type'] = 'application/octet-stream';
}
return headers;
}
}

View File

@ -36,6 +36,7 @@ import GoCQHTTPUploadGroupFile from "./go-cqhttp/UploadGroupFile";
import {GetConfigAction, SetConfigAction} from "./llonebot/Config"; import {GetConfigAction, SetConfigAction} from "./llonebot/Config";
import GetGroupAddRequest from "./llonebot/GetGroupAddRequest"; import GetGroupAddRequest from "./llonebot/GetGroupAddRequest";
import SetQQAvatar from './llonebot/SetQQAvatar' import SetQQAvatar from './llonebot/SetQQAvatar'
import GoCQHTTPDownloadFile from "./go-cqhttp/DownloadFile";
export const actionHandlers = [ export const actionHandlers = [
new Debug(), new Debug(),
@ -72,6 +73,7 @@ export const actionHandlers = [
new GoCQHTTPSendGroupForwardMsg(), new GoCQHTTPSendGroupForwardMsg(),
new GoCQHTTPSendPrivateForwardMsg(), new GoCQHTTPSendPrivateForwardMsg(),
new GoCQHTTPGetStrangerInfo(), new GoCQHTTPGetStrangerInfo(),
new GoCQHTTPDownloadFile(),
new GetGuildList(), new GetGuildList(),
new GoCQHTTPMarkMsgAsRead(), new GoCQHTTPMarkMsgAsRead(),
new GoCQHTTPUploadGroupFile(), new GoCQHTTPUploadGroupFile(),

View File

@ -54,4 +54,5 @@ export enum ActionName {
GetGuildList = "get_guild_list", GetGuildList = "get_guild_list",
GoCQHTTP_MarkMsgAsRead = "mark_msg_as_read", GoCQHTTP_MarkMsgAsRead = "mark_msg_as_read",
GoCQHTTP_UploadGroupFile = "upload_group_file", GoCQHTTP_UploadGroupFile = "upload_group_file",
GoCQHTTP_DownloadFile = "download_file",
} }