diff --git a/repo/js/AutoPlan/README.md b/repo/js/AutoPlan/README.md index 60906d8dc..18b23dcda 100644 --- a/repo/js/AutoPlan/README.md +++ b/repo/js/AutoPlan/README.md @@ -45,21 +45,21 @@ | 位置 | 字段 | 是否必填 | 说明 | 示例 | |:--:|:-----------:|:---:|:--------------------------------------:|:-----------------------:| | 1 | 类型 | **必填** | 秘境/地脉(后期支持地脉冗余字段) | 秘境/地脉 | -| |||***`秘境类型后几位参数说明`*** -| 2 | 队伍名称 | 可选 | BetterGI 中已保存的队伍名称(用于切换队伍) | 速刷 / 雷国 / 国家队 | -| 3 | 秘境名称/刷取物品名称 | **必填** | 与 BetterGI 自动秘境识别的名称保持一致 | 苍白的遗荣 / 炽烈的炎之魔女 / 辰砂往生录 | -| 4 | 刷几轮 | 可选 | 整数,执行几轮(每轮 = 1次完整秘境) | 3 / 5 / 10 | -| 5 | 限时/周日 | 可选 | 1=周一~周六可用、2=周日可用、3=仅周日、留空=不限制 | 1 / 2 / 3 | -| 6 | 周几执行(0-6) | 可选 | 0=周日,1=周一,...,6=周六;可多选按`/`分割,不填=每天都可执行 | 0/3,3 | -| 7 | 树脂使用顺序 | 可选 | 原粹树脂,浓缩树脂,须臾树脂,脆弱树脂`/`分割,不填=默认执行 原粹树脂 | 原粹树脂/浓缩树脂,须臾树脂 | -| 8 | 执行顺序 | 可选 | 数字越大越优先执行(同时间点先跑优先级高的) | 9 / 5 / 1 | +| 2 | 周几执行(0-6) | 可选 | 0=周日,1=周一,...,6=周六;可多选按`/`分割,不填=每天都可执行 | 0/3,3 | +| 3 | 执行顺序 | 可选 | 数字越大越优先执行(同时间点先跑优先级高的) | 9 / 5 / 1 | +| |||***`秘境类型后几位参数说明`*** +| 4 | 队伍名称 | 可选 | BetterGI 中已保存的队伍名称(用于切换队伍) | 速刷 / 雷国 / 国家队 | +| 5 | 秘境名称/刷取物品名称 | **必填** | 与 BetterGI 自动秘境识别的名称保持一致 | 苍白的遗荣 / 炽烈的炎之魔女 / 辰砂往生录 | +| 6 | 刷几轮 | 可选 | 整数,执行几轮(每轮 = 1次完整秘境) | 3 / 5 / 10 | +| 7 | 限时/周日 | 可选 | 1=周一~周六可用、2=周日可用、3=仅周日、留空=不限制 | 1 / 2 / 3 | +| 8 | 树脂使用顺序 | 可选 | 原粹树脂,浓缩树脂,须臾树脂,脆弱树脂`/`分割,不填=默认执行 原粹树脂 | 原粹树脂/浓缩树脂,须臾树脂 | **配置示例** ``` -秘境|速刷|苍白的遗荣|3|1|0/3||9, # 优先级最高,周日,周三刷3轮遗荣 -秘境|国家队|炽烈的炎之魔女|5||||5, # 优先级次之,每天刷5轮魔女 -秘境|雷国|无想之刃狭间|2|2|0|浓缩树脂/原粹树脂|2 # 只在周日刷,优先使用浓缩树脂后使用原粹树脂,优先级较低 +秘境|0/3|9|速刷|苍白的遗荣|3|1, # 优先级最高,周日,周三刷3轮遗荣 +秘境||5|国家队|炽烈的炎之魔女|5||, # 优先级次之,每天刷5轮魔女 +秘境|0|2|雷国|无想之刃狭间|2|2|浓缩树脂/原粹树脂 # 只在周日刷,优先使用浓缩树脂后使用原粹树脂,优先级较低 ``` (注意:最后一条也可以不带逗号) ### 计划配置语法(config/run_config.json 配置) diff --git a/repo/js/AutoPlan/main.js b/repo/js/AutoPlan/main.js index bf6b8d60c..6a90fb083 100644 --- a/repo/js/AutoPlan/main.js +++ b/repo/js/AutoPlan/main.js @@ -111,23 +111,23 @@ async function autoDomain(autoFight) { */ async function autoLeyLineOutcrop(autoLeyLineOutcrop) { //todo :地脉花 - autoLeyLineOutcrop={ - "count": 0, - "country": "country_cb3d792be8db", - "leyLineOutcropType": "leyLineOutcropType_f259b77fabcb", - // "isResinExhaustionMode": true, - // "openModeCountMin": true, - "useAdventurerHandbook": false, - "friendshipTeam": "friendshipTeam_7122cab56b16", - "team": "team_d0798ca3aa27", - "timeout": 0, - "isGoToSynthesizer": false, - "useFragileResin": false, - "useTransientResin": false, - "isNotification": false + autoLeyLineOutcrop = { + "count": 0, + "country": "country_cb3d792be8db", + "leyLineOutcropType": "leyLineOutcropType_f259b77fabcb", + // "isResinExhaustionMode": true, + // "openModeCountMin": true, + "useAdventurerHandbook": false, + "friendshipTeam": "friendshipTeam_7122cab56b16", + "team": "team_d0798ca3aa27", + "timeout": 0, + "isGoToSynthesizer": false, + "useFragileResin": false, + "useTransientResin": false, + "isNotification": false } - if (true){ + if (true) { log.info("地脉 暂不支持") return } @@ -188,11 +188,98 @@ function parseInteger(day) { /** * 根据不同的加载方式加载秘境配置 * @param {string} Load - 加载方式类型,如uid或input - * @param {Set} autoFightOrderSet - 用于存储秘境顺序的Set集合 + * @param {Set} autoOrderSet - 用于存储秘境顺序的Set集合 * @param {string} runConfig - 输入的配置字符串,仅在Load为input时使用 */ -async function loadMode(Load, autoFightOrderSet, runConfig) { +async function loadMode(Load, autoOrderSet, runConfig) { switch (Load) { + case LoadType.input: + // 通过输入字符串方式加载配置 + if (runConfig) { + // 处理输入字符串:去除首尾空格,将中文逗号替换为英文逗号,然后按逗号分割 + runConfig.trim().replaceAll(',', ',').split(",").forEach( + item => { + // 将当前项按"|"分割成数组 + let arr = item.split("|") + + let runType = arr[0]; // 解析运行类型 + let days = arr[1].trim() !== "" + ? arr[1].split('/').map(d => parseInt(d.trim())).filter(d => !isNaN(d)) + : []; + // 解析顺序值,处理可能的无效值 + let order = (() => { + const rawOrder = arr[2]; // 获取原始值 + if (rawOrder == null || String(rawOrder).trim() === "") { + return 0; // 若为空或无效值,默认返回 0 + } + const parsedOrder = parseInt(String(rawOrder).trim(), 10); // 转换为整数 + return isNaN(parsedOrder) ? 0 : parsedOrder; // 若转换失败,返回默认值 0 + })(); + + // 创建秘境顺序对象 + let autoOrder = { + order: order, // 顺序值 + // day: day,// 执行日期 + days: days, // 执行日期(数组) + autoFight: undefined, // 秘境信息对象 + autoLeyLineOutcrop: undefined // 地脉信息对象 + } + + if (!config.user.runTypes.includes(runType)) { + throwError(`运行类型${runType}输入错误`) + } else if (config.user.runTypes[0] === runType) { + let partyName = arr[3]; // 解析队伍名称 + let domainName = arr[4]; // 解析秘境名称 + let domainRoundNum = arr[5]; // 解析副本轮数 + let sundaySelectedValue = arr[6]; // 解析周日|限时选择的值 + + // 检查秘境名称是否有效 + if (!config.domainNames.has(domainName)) { + //秘境名称没有记录 查询是否是物品名称 + if (config.itemNames.has(domainName)) { + const domainNameTemp = config.domainItemsMap.get(domainName); + if (!domainNameTemp) { + throw new Error(`${domainName} 输入错误`); + } + const domainSelectedValue = parseInt(config.domainOrderMap.get(domainName) + ""); + sundaySelectedValue = domainSelectedValue + domainName = domainNameTemp + } else { + throw new Error(`${domainName} 输入错误`); + } + } + // 创建秘境信息对象 + let autoFight = { + domainName: undefined,//秘境名称 + partyName: undefined,//队伍名称 + sundaySelectedValue: undefined,//周日|限时选择的值 + domainRoundNum: undefined,//副本轮数 + } + // 设置秘境信息的各个属性 + autoFight.partyName = partyName // 队伍名称 + autoFight.domainName = domainName // 秘境名称 + autoFight.domainRoundNum = domainRoundNum // 副本轮数 + autoFight.sundaySelectedValue = sundaySelectedValue // 周日|限时选择的值 + + + autoOrder.autoFight=autoFight // 将秘境信息对象添加到秘境顺序对象中 + + }else if(config.user.runTypes[1]===runType){ + let autoLeyLineOutcrop={ + count: 0, + country: undefined, + + } + + } + + // 将秘境顺序对象添加到列表中 + autoOrderSet.add(autoOrder) + } + ) + } + break + case LoadType.uid: // 通过UID方式加载配置 @@ -211,83 +298,10 @@ async function loadMode(Load, autoFightOrderSet, runConfig) { item.days = item.days.map(day => parseInteger(day)) // item.day = parseInteger(item.day); } - autoFightOrderSet.add(item) + autoOrderSet.add(item) }) } break - case LoadType.input: - // 通过输入字符串方式加载配置 - if (runConfig) { - // 处理输入字符串:去除首尾空格,将中文逗号替换为英文逗号,然后按逗号分割 - runConfig.trim().replaceAll(',', ',').split(",").forEach( - item => { - // 将当前项按"|"分割成数组 - let arr = item.split("|") - // 创建秘境信息对象 - let autoFight = { - domainName: undefined,//秘境名称 - partyName: undefined,//队伍名称 - sundaySelectedValue: undefined,//周日|限时选择的值 - domainRoundNum: undefined,//副本轮数 - } - let runType = arr[0]; // 解析运行类型 - if (!config.user.runTypes.includes(runType)) { - throwError(`运行类型${runType}输入错误`) - } - let partyName = arr[1]; // 解析队伍名称 - let domainName = arr[2]; // 解析秘境名称 - let domainRoundNum = arr[3]; // 解析副本轮数 - let sundaySelectedValue = arr[4]; // 解析周日|限时选择的值 - // let day = arr[4].trim() != "" ? parseInt(arr[4]) : undefined; - let days = arr[5].trim() !== "" - ? arr[4].split('/').map(d => parseInt(d.trim())).filter(d => !isNaN(d)) - : []; - // 解析顺序值,处理可能的无效值 - let order = (() => { - const rawOrder = arr[6]; // 获取原始值 - if (rawOrder == null || String(rawOrder).trim() === "") { - return 0; // 若为空或无效值,默认返回 0 - } - const parsedOrder = parseInt(String(rawOrder).trim(), 10); // 转换为整数 - return isNaN(parsedOrder) ? 0 : parsedOrder; // 若转换失败,返回默认值 0 - })(); - - - // 检查秘境名称是否有效 - if (!config.domainNames.has(domainName)) { - //秘境名称没有记录 查询是否是物品名称 - if (config.itemNames.has(domainName)) { - const domainNameTemp = config.domainItemsMap.get(domainName); - if (!domainNameTemp) { - throw new Error(`${domainName} 输入错误`); - } - const domainSelectedValue = parseInt(config.domainOrderMap.get(domainName) + ""); - sundaySelectedValue = domainSelectedValue - domainName = domainNameTemp - } else { - throw new Error(`${domainName} 输入错误`); - } - } - - // 设置秘境信息的各个属性 - autoFight.partyName = partyName // 队伍名称 - autoFight.domainName = domainName // 秘境名称 - autoFight.domainRoundNum = domainRoundNum // 副本轮数 - autoFight.sundaySelectedValue = sundaySelectedValue // 周日|限时选择的值 - // 创建秘境顺序对象 - let autoFightOrder = { - order: order, // 顺序值 - // day: day,// 执行日期 - days: days, // 执行日期(数组) - autoFight: autoFight // 秘境信息对象 - } - // 将秘境顺序对象添加到列表中 - autoFightOrderSet.add(autoFightOrder) - // autoFightOrderSet.push(autoFightOrder) - } - ) - } - break case LoadType.bgi_tools: // 通过bgi_tools方式加载配置 log.info(`开始拉取bgi_tools配置`) @@ -301,7 +315,7 @@ async function loadMode(Load, autoFightOrderSet, runConfig) { item.days = item.days.map(day => parseInteger(day)) // item.day = parseInteger(item.day); } - autoFightOrderSet.add(item) + autoOrderSet.add(item) }) } break @@ -346,16 +360,16 @@ async function initRunOrderList(domainConfig) { //过滤掉不执行的秘境 .filter(item => config.user.runTypes.includes(item.runType)) .filter(item => { - // if (item.day) { - // return item.day === dayOfWeek.day - // } - if (item.days && item.days.length > 0) { - const includes = item.days.includes(dayOfWeek.day); - log.debug(`[{1}]item.days:{0}`, dayOfWeek.day, JSON.stringify(item.days)) - return includes; - } - return true - }) + // if (item.day) { + // return item.day === dayOfWeek.day + // } + if (item.days && item.days.length > 0) { + const includes = item.days.includes(dayOfWeek.day); + log.debug(`[{1}]item.days:{0}`, dayOfWeek.day, JSON.stringify(item.days)) + return includes; + } + return true + }) from.sort((a, b) => b.order - a.order) log.debug(`from:{0}`, JSON.stringify(from)) return from; @@ -389,7 +403,7 @@ async function main() { const autoRunOrderList = await initRunOrderList(runConfig); const list = autoRunOrderList.filter(item => (item.runType === config.user.runTypes[0] && item?.autoFight.domainRoundNum > 0) - || (item.runType === config.user.runTypes[1] && item?.autoLeyLineOutcrop.count > 0) + || (item.runType === config.user.runTypes[1] && item?.autoLeyLineOutcrop.count > 0) ) if (list?.length > 0) { await autoRunList(list);