refactor(AutoPlan): 重构秘境配置解析逻辑并更新文档

- 重命名 autoFightOrderSet 为 autoOrderSet 以统一变量命名
- 重构 loadMode 函数中的参数解析逻辑,调整数组索引对应关系
- 重新组织秘境顺序对象的数据结构,支持地脉功能扩展
- 更新 README.md 中的配置参数表格和示例格式
- 调整配置参数的顺序映射关系,统一索引计算逻辑
- 修复 UID 配置加载的变量引用错误
- 优化代码缩进格式保持一致性
This commit is contained in:
yan
2026-02-17 11:28:47 +08:00
parent b052da6596
commit 4f0e152e76
2 changed files with 128 additions and 114 deletions

View File

@@ -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 配置)

View File

@@ -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);