mirror of
https://github.com/babalae/bettergi-scripts-list.git
synced 2026-03-16 03:33:25 +08:00
js:采集cd管理1.3.4 (#1876)
1.移除作者Juhao73692,回退所有不合理更新 2.新增自定义配置,禁用关键词 3.优化切换队伍逻辑,仅在对应路径组有路线要执行时才切换 4.修改卡时间功能,增加提前量
This commit is contained in:
@@ -15,5 +15,5 @@
|
||||
- **配队管理**:支持为每个路径组指定配队名称,自动切换配队。
|
||||
|
||||
## 使用方法
|
||||
1. 将要运行的地图追踪文件放在pathing文件夹下的不同路径组中,将会按照路径组的顺序执行,并跳过未刷新的路线。可以在文件夹名称后面添加“.disabled”以禁用这个文件夹下的路径追踪文件。
|
||||
1. 将要运行的地图追踪文件放在pathing文件夹下的不同路径组中,将会按照路径组的顺序执行,并跳过未刷新的路线
|
||||
2. 根据需要修改自定义配置,设置操作模式、路径组CD类型、配队名称等参数。
|
||||
@@ -7,7 +7,7 @@
|
||||
//如此便可以在js运行过程中伪造地图追踪的日志信息,可以在日志分析等中查看
|
||||
|
||||
async function fakeLog(name, isJs, isStart, duration) {
|
||||
await sleep(10);
|
||||
await sleep(1);
|
||||
const currentTime = Date.now();
|
||||
// 参数检查
|
||||
if (typeof name !== 'string') {
|
||||
@@ -97,9 +97,21 @@ const userSettings = {
|
||||
otherPathGroupsCdTypes: settings.otherPathGroupsCdTypes || "",
|
||||
partyNames: settings.partyNames || "",
|
||||
skipTimeRanges: settings.skipTimeRanges || "",
|
||||
infoFileName: settings.infoFileName || ""
|
||||
infoFileName: settings.infoFileName || "",
|
||||
disableJsons: settings.disableJsons || ""
|
||||
};
|
||||
|
||||
// 解析禁用名单
|
||||
let disableArray = [];
|
||||
if (userSettings.disableJsons) {
|
||||
tmp = userSettings.disableJsons.split(';');
|
||||
for (k = 0; k < tmp.length; k++) {
|
||||
s = tmp[k].trim();
|
||||
if (s) disableArray[disableArray.length] = s;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 将 partyNames 分割并存储到一个数组中
|
||||
const partyNamesArray = userSettings.partyNames.split(";").map(name => name.trim());
|
||||
|
||||
@@ -122,7 +134,7 @@ if (!userSettings.infoFileName) {
|
||||
userSettings.pathGroup2CdType,
|
||||
userSettings.pathGroup3CdType,
|
||||
userSettings.otherPathGroupsCdTypes,
|
||||
].join("_");
|
||||
].join(".");
|
||||
}
|
||||
|
||||
// 定义自定义函数 basename,用于获取文件名
|
||||
@@ -159,11 +171,8 @@ async function readFolder(folderPath, onlyJson) {
|
||||
// 临时数组,用于存储子文件夹路径
|
||||
const subFolders = [];
|
||||
for (const filePath of filesInSubFolder) {
|
||||
if (file.IsFolder(filePath)) { // 如果是文件夹,先存储到临时数组中
|
||||
if (filePath.toLowerCase().endsWith(".disabled")) { // 跳过以.disabled结尾的被禁用的路径
|
||||
log.info(`跳过禁用的文件夹:${filePath}`);
|
||||
continue;
|
||||
}
|
||||
if (file.IsFolder(filePath)) {
|
||||
// 如果是文件夹,先存储到临时数组中
|
||||
subFolders.push(filePath);
|
||||
} else {
|
||||
// 如果是文件,根据 onlyJson 判断是否存储
|
||||
@@ -197,6 +206,25 @@ async function readFolder(folderPath, onlyJson) {
|
||||
return files;
|
||||
}
|
||||
|
||||
//切换队伍
|
||||
async function switchPartyIfNeeded(partyName) {
|
||||
if (!partyName) {
|
||||
await genshin.returnMainUi();
|
||||
return;
|
||||
}
|
||||
try {
|
||||
log.info("正在尝试切换至" + partyName);
|
||||
if (!await genshin.switchParty(partyName)) {
|
||||
log.info("切换队伍失败,前往七天神像重试");
|
||||
await genshin.tpToStatueOfTheSeven();
|
||||
await genshin.switchParty(partyName);
|
||||
}
|
||||
} catch {
|
||||
log.error("队伍切换失败,可能处于联机模式或其他不可切换状态");
|
||||
notification.error(`队伍切换失败,可能处于联机模式或其他不可切换状态`);
|
||||
await genshin.returnMainUi();
|
||||
}
|
||||
}
|
||||
|
||||
(async function () {
|
||||
try {
|
||||
@@ -239,10 +267,10 @@ async function readFolder(folderPath, onlyJson) {
|
||||
const targetFolder = `pathing/路径组${i}`; // 动态生成目标文件夹路径
|
||||
const files = await readFolder(targetFolder, true);
|
||||
const filePaths = files.map(file => file.fullPath);
|
||||
// 如果文件夹为空,跳过当前路径组
|
||||
// 如果文件夹为空,退出循环
|
||||
if (filePaths.length === 0) {
|
||||
log.info(`路径组${i} 文件夹为空,跳过`);
|
||||
continue;
|
||||
log.info(`路径组${i} 文件夹为空,停止处理`);
|
||||
break;
|
||||
}
|
||||
// 用于存储符合条件的文件名的数组
|
||||
const jsonFileNames = [];
|
||||
@@ -307,18 +335,12 @@ async function readFolder(folderPath, onlyJson) {
|
||||
let groupNumber = i;
|
||||
const pathGroupFilePath = `${subFolderPath}/路径组${groupNumber}.txt`; // 动态生成路径组文件路径
|
||||
|
||||
genshin.returnMainUi();
|
||||
|
||||
//切换到指定配队
|
||||
if (groupNumber - 1 < partyNamesArray.length && partyNamesArray[groupNumber - 1] !== "") { //队伍配置存在且不为空
|
||||
await genshin.switchParty(partyNamesArray[groupNumber - 1])
|
||||
}
|
||||
|
||||
genshin.returnMainUi();
|
||||
await genshin.returnMainUi();
|
||||
|
||||
try {
|
||||
let pathGroupContent = await file.readText(pathGroupFilePath);
|
||||
let pathGroupEntries = pathGroupContent.trim().split('\n');
|
||||
let changedParty = false;
|
||||
for (let i = 0; i < pathGroupEntries.length; i++) {
|
||||
const entryWithTimestamp = pathGroupEntries[i].trim();
|
||||
const [entryName, entryTimestamp] = entryWithTimestamp.split('::');
|
||||
@@ -334,23 +356,51 @@ async function readFolder(folderPath, onlyJson) {
|
||||
const entryDate = new Date(entryTimestamp);
|
||||
if (startTime <= entryDate) {
|
||||
log.info(`当前任务 ${entryName} 未刷新,跳过任务 ${i + 1}/${pathGroupEntries.length} 个`);
|
||||
await sleep(10);
|
||||
continue; // 跳过当前任务
|
||||
}
|
||||
|
||||
// 新增校验:若当前时间的小时数和 skipTimeRanges 一致,则跳过任务
|
||||
const currentHour = startTime.getHours(); // 获取当前时间的小时数
|
||||
const skipHours = userSettings.skipTimeRanges
|
||||
.split(';')
|
||||
.map(s => s.trim())
|
||||
.filter(s => s !== '' && !isNaN(s)) // 过滤空字符串和非数字
|
||||
.map(Number); // 将 skipTimeRanges 转换为数字数组
|
||||
if (skipHours.includes(currentHour)) {
|
||||
log.info(`当前时间的小时数为 ${currentHour},在跳过时间范围内,跳过任务 ${entryName}`);
|
||||
continue; // 跳过当前任务
|
||||
let currentHour = startTime.getHours(); // 获取当前时间的小时数
|
||||
const currentMin = startTime.getMinutes(); // 获取当前分钟数
|
||||
const skipHours = userSettings.skipTimeRanges.split(';').map(Number); // 将 skipTimeRanges 转换为数字数组
|
||||
|
||||
// 10分钟内等待逻辑
|
||||
const nextHour = (currentHour + 1) % 24;
|
||||
if (skipHours.includes(nextHour) && currentMin >= 50) {
|
||||
const waitMin = 60 - currentMin;
|
||||
log.info(`接近目标时间,开始等待${waitMin}分钟`);
|
||||
await sleep(waitMin * 60 * 1000);
|
||||
currentHour = nextHour;
|
||||
break; // 只等待一次
|
||||
}
|
||||
|
||||
// 原跳过判断
|
||||
if (skipHours.includes(currentHour)) {
|
||||
log.info(`当前时间的小时数为 ${currentHour},在跳过时间范围内,跳过任务 ${i + 1}/${pathGroupEntries.length} 个`);
|
||||
await sleep(10);
|
||||
break; // 跳过当前任务
|
||||
}
|
||||
|
||||
let doSkip = false;
|
||||
|
||||
// 禁用名单跳过(includes 子串匹配)
|
||||
for (k = 0; k < disableArray.length; k++) {
|
||||
if (pathingFilePath.includes(disableArray[k])) {
|
||||
log.info('路径文件 ' + pathingFilePath + ' 包含禁用关键词 "' + disableArray[k] + '",跳过任务 ' + entryName);
|
||||
doSkip = true; // 立即进入下一轮任务
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (doSkip) continue;
|
||||
|
||||
//切换到指定配队
|
||||
if (!changedParty) {
|
||||
if (partyNamesArray[groupNumber - 1] !== "") {
|
||||
await switchPartyIfNeeded(partyNamesArray[groupNumber - 1]);
|
||||
}
|
||||
changedParty = true;
|
||||
}
|
||||
//伪造地图追踪开始的日志
|
||||
await fakeLog(entryName, false, true, 0);
|
||||
|
||||
@@ -368,7 +418,7 @@ async function readFolder(folderPath, onlyJson) {
|
||||
|
||||
//捕获任务取消的信息并跳出循环
|
||||
try {
|
||||
await sleep(10); // 假设 sleep 是一个异步函数,休眠 10 毫秒
|
||||
await sleep(1); // 假设 sleep 是一个异步函数,休眠 1 毫秒
|
||||
} catch (error) {
|
||||
log.error(`发生错误: ${error}`);
|
||||
break; // 终止循环
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"manifest_version": 1,
|
||||
"name": "采集cd管理",
|
||||
"version": "1.3.3",
|
||||
"version": "1.3.4",
|
||||
"bgi_version": "0.44.8",
|
||||
"description": "仅面对会操作文件和读readme的用户,基于文件夹操作自动管理采集路线的cd,会按照路径组的顺序依次运行,直到指定的时间,并会按照给定的cd类型,自动跳过未刷新的路线",
|
||||
"saved_files": [
|
||||
"pathing/",
|
||||
"record/"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "mno",
|
||||
"links": "https://github.com/Bedrockx"
|
||||
},
|
||||
{
|
||||
"name": "Juhao73692",
|
||||
"links": "https://github.com/Juhao73692"
|
||||
}
|
||||
],
|
||||
"settings_ui": "settings.json",
|
||||
|
||||
@@ -72,5 +72,10 @@
|
||||
"name": "infoFileName",
|
||||
"type": "input-text",
|
||||
"label": "输入用于存储信息的文件名,只在不同账号分别管理CD时填写"
|
||||
},
|
||||
{
|
||||
"name": "disableJsons",
|
||||
"type": "input-text",
|
||||
"label": "填写需要禁用的路线的关键词,使用中文分号分隔\n文件路径含有相关关键词的路线会被禁用"
|
||||
}
|
||||
]
|
||||
]
|
||||
Reference in New Issue
Block a user