LaiTool/src/define/Tools/common.ts
lq1405 22cfe65dde 3.1.9 2024.10.28
1. (聚合推文)MJ反推、SD反推 添加剪映分镜
2. (聚合推文)完善SD反推分类(界面同MJ反推,些许不一致)
3. (聚合推文)完成一键合成视频(单个和批量)
4. 修改聚合推文进入界面小说批次任务表格样式
5. (聚合推文)完善一键重置
6. (聚合推文)完善一键删除
2024-10-28 18:38:11 +08:00

91 lines
3.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { escapeRegExp } from "lodash";
/**
* 检查字符串中是不是包含中文或者标点符号
* @param str 需要判断的字符串
* @returns 返回的数据有中文或者标点符号返回true否则返回false
*/
export function ContainsChineseOrPunctuation(str: string): boolean {
return /[\u4e00-\u9fa5]|[\u3000-\u301e\u2013\u2014\u2018\u2019\u201c\u201d\u2026\u203b\uff08\uff09\uff1a\uff1b\uff1f\uff01\uff0c\u3001\uff0e\u3002\uff1f\uff01\u2018\u2019\u201c\u201d]/.test(
str
)
}
/**
* 通用的重试函数
* @param fn 要执行的函数
* @param retries 最大重试次数
* @param delay 每次重试之间的延迟(毫秒)
* @returns 返回函数的结果
*/
export async function RetryWithBackoff<T>(fn: () => Promise<T>, retries: number = 5, delay: number = 2000): Promise<T> {
let attempts = 0;
while (attempts < retries) {
try {
return await fn();
} catch (error) {
attempts++;
// 这边记下日志吧
global.logger.error(
fn.name + '_RetryWithBackoff',
`${attempts} 请求失败,开始下一次重试,失败信息如下:` + error.toString()
)
if (attempts >= retries) {
throw new Error(`失败次数超过 ${retries} 错误信息如下: ${error.message}`);
}
await new Promise(resolve => setTimeout(resolve, delay));
}
}
throw new Error('所有重试失败'); // 理论上不会到达这里
}
/**
* 并发执行任务(控制同时执行的任务数)
* @param tasks 总的任务列表
* @param concurrentCount 同时执行的数量
* @returns
*/
export async function ExecuteConcurrently(tasks: Array<() => Promise<any>>, concurrentCount: number): Promise<any[]> {
let activeTasks: Array<Promise<any>> = [];
let results: Array<Promise<any>> = [];
while (tasks.length > 0) {
if (activeTasks.length < concurrentCount) {
let task = tasks.shift();
let promise = task().then(result => {
activeTasks = activeTasks.filter(t => t !== promise);
return result;
}).catch(error => {
// 抛出任务,停止所有的任务
tasks.length = 0;
throw error
});
activeTasks.push(promise);
results.push(promise);
} else {
await Promise.race(activeTasks);
}
}
return Promise.all(results);
}
/**
* 替换主字符串中的子字符串
* @param mainString 主字符串
* @param substringArray 子字符串数组
* @returns 替换后的字符串
*/
export function ReplaceSubstrings(mainString: string, substringArray: string[], replacement: string = " "): string {
// 按长度降序排序子字符串数组,以确保较长的子字符串先被替换
substringArray.sort((a, b) => b.length - a.length);
// 对每个子字符串进行替换
for (const substring of substringArray) {
// 创建一个正则表达式,用于全局匹配子字符串
const regex = new RegExp(escapeRegExp(substring), 'g');
// 将匹配到的子字符串替换为等长的空格
mainString = mainString.replace(regex, replacement);
}
return mainString;
}