diff --git a/repo/js/采集cd管理/README.md b/repo/js/采集cd管理/README.md index 330163065..35504330f 100644 --- a/repo/js/采集cd管理/README.md +++ b/repo/js/采集cd管理/README.md @@ -15,5 +15,5 @@ - **配队管理**:支持为每个路径组指定配队名称,自动切换配队。 ## 使用方法 -1. 将要运行的地图追踪文件放在pathing文件夹下的不同路径组中,将会按照路径组的顺序执行,并跳过未刷新的路线。可以在文件夹名称后面添加“.disabled”以禁用这个文件夹下的路径追踪文件。 +1. 将要运行的地图追踪文件放在pathing文件夹下的不同路径组中,将会按照路径组的顺序执行,并跳过未刷新的路线 2. 根据需要修改自定义配置,设置操作模式、路径组CD类型、配队名称等参数。 \ No newline at end of file diff --git a/repo/js/采集cd管理/main.js b/repo/js/采集cd管理/main.js index 02f571403..c3d3a52be 100644 --- a/repo/js/采集cd管理/main.js +++ b/repo/js/采集cd管理/main.js @@ -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; // 终止循环 diff --git a/repo/js/采集cd管理/manifest.json b/repo/js/采集cd管理/manifest.json index c57122c72..5381bf94d 100644 --- a/repo/js/采集cd管理/manifest.json +++ b/repo/js/采集cd管理/manifest.json @@ -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", diff --git a/repo/js/采集cd管理/settings.json b/repo/js/采集cd管理/settings.json index 59bd5dcd0..14b3a4ec0 100644 --- a/repo/js/采集cd管理/settings.json +++ b/repo/js/采集cd管理/settings.json @@ -72,5 +72,10 @@ "name": "infoFileName", "type": "input-text", "label": "输入用于存储信息的文件名,只在不同账号分别管理CD时填写" + }, + { + "name": "disableJsons", + "type": "input-text", + "label": "填写需要禁用的路线的关键词,使用中文分号分隔\n文件路径含有相关关键词的路线会被禁用" } -] +] \ No newline at end of file