Files
bettergi-scripts-list/repo/js/AutoPlan/main.js
云端客 3d7bd2b385 体力计划JS (#2947)
* feat(AutoPlanDomain): 添加自动秘境计划功能

- 新增domain.json配置文件,包含天赋、武器、圣遗物三大类秘境数据
- 创建main.js核心逻辑文件,实现秘境数据映射和排序功能
- 添加manifest.json插件配置文件,定义插件基本信息和依赖
- 创建settings.json空配置文件用于后续设置界面
- 实现领域名称到物品列表的映射关系
- 支持按顺序排列的秘境配置功能

* feat(domain): 添加原神秘境自动规划功能

- 新增配置文件config.js用于管理秘境数据结构
- 实现秘境配置初始化和数据映射功能
- 添加domain.json配置文件包含所有秘境信息
- 实现秘境自动执行核心逻辑
- 添加秘境顺序列表初始化和排序功能
- 实现秘境批量执行处理机制
- 添加错误处理和配置验证机制

* feat(config): 添加设置初始化和多复选框配置管理功能

- 新增info对象用于存储manifest和settings信息
- 添加manifest.json路径配置
- 实现initSettings函数用于读取和解析设置文件
- 实现getMultiCheckboxMap函数用于获取多复选框映射表
- 实现getValueByMultiCheckboxName函数用于获取复选框组对应值
- 在main.js中引入并调用initSettings进行设置初始化
- 扩展导出接口包含新的设置管理函数

* fix(AutoPlanDomain): 解决秘境任务执行中的字符串转数字问题

- 修复了order变量解析时缺少空字符串转换的问题
- 添加了物品名称到秘境名称的映射查询功能
- 实现了域名临时变量获取和周日选择值更新逻辑
- 增加了输入错误时的异常处理机制
- 优化了秘境名称不存在时的错误提示信息

* feat(AutoPlanDomain): 添加自动秘境计划配置功能

- 在配置文件中添加manifest对象结构
- 为domainList添加默认空数组配置避免解析错误
- 重构order解析逻辑增加空值和类型验证保护
- 添加自动秘境计划配置设置项支持文本输入
- 实现配置初始化异步加载功能
- 增加多复选框映射表获取函数注释文档

* feat(AutoPlanDomain): 添加域配置文件支持并优化初始化逻辑

- 新增 domainConfig 配置项用于加载 ./config/domain_config.json 文件
- 在 initDomainOrderList 函数中添加对 domainConfig 的空值检查
- 修复变量名错误:将 DomainRoundNum 统一改为 domainRoundNum
- 添加秘境配置为空时的错误检查和提示
- 移除重复的秘境配置空值检查代码
- 优化代码结构和错误处理机制

* feat(config): 添加用户UID配置并优化秘境顺序列表初始化逻辑

- 在配置文件中添加用户UID字段用于个性化配置
- 将秘境顺序列表从数组改为Set以避免重复数据
- 实现基于UID的配置读取功能
- 添加配置文件解析逻辑支持多用户配置
- 修改返回逻辑将Set转换为数组确保兼容性
- 更新错误检查条件适配新的数据结构

* feat(config): 添加密钥验证功能

- 在配置中新增 key 字段用于存储密钥
- 实现 checkKey 函数用于验证密钥正确性
- 添加密钥错误时的异常处理机制
- 将 checkKey 函数导出供外部使用
- 添加初始化秘境配置的相关注释文档

* feat(config): 添加OCR识别UID功能

- 在配置文件中导入ocrUid工具函数
- 修复checkKey函数中参数赋值的格式问题
- 在initConfig函数中集成OCR识别获取用户UID
- 将识别到的UID存储到配置对象中
- 在主程序中使用配置中的UID替代未定义变量
- 新增tool.js工具模块实现区域OCR识别功能
- 新增uid.js模块专门处理UID识别逻辑
- 实现了屏幕指定区域的文字识别功能

* feat(config): 添加UID配置加载开关功能

- 在配置域中新增load_uid_config开关字段
- 实现基于配置开关的OCR UID加载条件判断
- 确保配置缺失时的错误处理机制正常运行
- 保持原有配置验证逻辑完整性
- 添加对settings.load_uid_config的优先级支持

* feat(domain): 添加多加载方式支持

- 添加 LoadType 枚举定义 uid 和 input 加载类型
- 添加 LoadMap 映射表关联加载方式名称和类型
- 修改配置结构将 load_uid_config 替换为 loads 数组
- 实现多加载方式切换逻辑支持 UID 加载和输入加载
- 更新 initDomainOrderList 函数支持异步 UID 识别
- 在设置界面添加 auto_load 多选框配置加载模式
- 实现基于配置的动态加载策略选择机制

* fix(config): 解决配置密钥验证和加载列表处理问题

- 添加了配置密钥验证逻辑,确保密钥匹配
- 实现了密钥不匹配时的错误抛出机制
- 修复了自动加载列表的获取和映射处理
- 统一了代码格式和空格规范

* refactor(AutoPlanDomain): 重构秘境配置加载逻辑

- 将原来的初始化函数拆分为独立的加载模式处理函数
- 提取loadMode函数专门处理不同加载方式的配置
- 保留initDomainOrderList函数作为入口点调用加载模式
- 优化代码结构提高可读性和维护性
- 为关键变量和逻辑添加更详细的注释说明

* feat(AutoPlanDomain): 更新插件配置和密钥设置

- 在 manifest.json 中添加了新的 key 字段用于标识插件
- 重构 settings.json 配置项,将 domain_config 重命名为 key
- 更新了配置项的标签说明,改为密钥配置提示
- 恢复了 domain_config 配置项到设置列表末尾
- 为新旧配置项提供了清晰的用户指引说明

* feat(bgi_tools): 添加BGI工具HTTP配置拉取推送功能

- 实现pullJsonConfig函数用于拉取指定uid的JSON配置数据
- 实现pushAllJsonConfig函数用于推送全部JSON配置数据
- 在配置中添加bgi_tools相关API接口地址配置项
- 新增bgi_tools加载类型支持并添加到加载映射表中
- 更新加载模式界面选项增加bgi_tools加载选项
- 修改加载顺序逻辑支持按优先级排序
- 修复自动域参数初始化时副本轮数传递问题
- 更新多选框组件标签文本增加http获取配置说明
- 添加OCR区域资源释放后的空行格式化调整

* feat(AutoPlanDomain): 添加bgi_tools配置同步功能

- 在bgi_tools.js中导出pullJsonConfig和pushAllJsonConfig方法
- 在main.js中导入并集成bgi_tools配置加载逻辑
- 新增LoadType.bgi_tools分支处理远程配置拉取
- 添加settings.json配置项用于设置bgi_tools的HTTP接口地址
- 实现从远程JSON配置文件读取自动战斗计划功能

* feat(bgi_tools): 添加配置推送开关和API配置功能

- 在配置文件中添加open对象用于控制推送功能
- 实现bgi_tools相关API配置的动态设置
- 将uid配置移动到合适位置避免重复执行
- 修复pullJsonConfig调用时的参数类型转换问题
- 在设置界面添加推送开关复选框和推送API输入框
- 集成OCR获取UID功能到配置初始化流程

* feat(AutoPlanDomain): 添加bgi_tools配置推送功能

- 在bgi_tools方式加载配置时添加开始拉取日志记录
- 添加bgi_tools配置推送功能,在main函数中根据开关判断是否推送配置
- 实现pushAllJsonConfig调用以推送本地域配置文件内容

* feat(AutoPlanDomain): 添加秘境配置按日期执行功能

- 新增 parseDay 辅助函数用于安全解析 day 字段
- 在配置加载过程中对 day 字段进行解析和验证
- 解析输入数据时新增 day 字段支持并调整索引位置
- 在秘境顺序对象中添加 day 执行日期字段
- 更新配置字符串格式说明文档
- 新增 getDayOfWeek 工具函数获取当前星期信息
- 添加星期几执行的逻辑判断功能

* feat(AutoPlanDomain): 添加按星期几过滤秘境功能

- 引入 getDayOfWeek 工具函数
- 在秘境顺序列表中添加按当前星期几过滤的逻辑
- 只有当配置了 day 字段且匹配当前星期几时才执行该秘境
- 未配置 day 字段的秘境仍会正常执行

* feat(AutoPlanDomain): 添加执行日期字段支持

- 在autoFight对象中新增day属性用于存储执行日期
- 为秘境战斗配置添加日期维度的规划能力

* docs(AutoPlanDomain): 添加自动秘境计划JS项目文档

- 创建项目README文件
- 添加版本密钥表格
- 记录版本历史信息
- 注明作者信息

* docs(AutoPlanDomain): 更新 README 文档添加 BetterGI 集成说明

- 添加了关于通过 BetterGI 本体实现体力计划的描述
- 补充了脚本功能说明,解释了与 BetterGI 的集成关系

* refactor(bgi_tools): 重构BGI工具配置管理功能

- 修改pullJsonConfig函数参数结构,移除默认值并优化HTTP请求处理逻辑
- 更新pushAllJsonConfig函数参数结构,修改数据传输格式为json对象包装
- 简化配置文件路径定义,移除冗余的相对路径前缀
- 移除配置文件中的大量硬编码领域数据,改为动态读取配置文件
- 在main.js中更新函数调用参数,传递正确的API端点地址
- 修复settings.json中的选项字段名从option改为options
- 移除配置文件中的重复分隔注释行
- 添加getConfig导出函数用于外部获取配置对象
- 增加调试日志输出以支持配置加载过程追踪

* docs(AutoPlanDomain): 更新README文档完善功能说明和配置指南

- 添加功能说明章节,详细介绍脚本的核心能力
- 新增配置项说明表格,清晰展示各项参数含义
- 补充计划配置语法详细说明和字段详解
- 添加配置示例和使用建议
- 完善常见问题解答
- 优化版本历史记录格式
- 更新版本密钥表格样式

* docs(AutoPlanDomain): 更新 README 文档中的表格格式和配置语法说明

- 调整表格对齐格式,统一使用居中对齐样式
- 修正周几执行说明,移除多余描述
- 删除表格底部多余的示例注释
- 新增计划配置语法章节,添加 config/domain_config.json 配置示例
- 补充配置对象的字段说明文档

* docs(AutoPlanDomain): 更新 README 中的配置示例注释

- 修改了速刷任务的时间安排描述,从周一~周六改为每天
- 更新了注释说明以更准确反映配置的实际行为

* feat(AutoPlanDomain): 支持多日期执行配置

- 将单日期执行配置改为多日期数组配置,支持多个执行日期
- 修改数据结构从 day 字段改为 days 数组字段存储执行日期
- 更新日期解析逻辑,支持通过 "/" 分割符配置多个执行日期
- 调整过滤条件以匹配新的多日期数组格式
- 更新 README 文档说明多日期配置的使用方法
- 修改示例配置展示多日期功能的使用场景

* refactor(bgi_tools): 优化pullJsonConfig函数的参数传递方式

- 将uid参数从请求体改为URL查询参数
- 简化HTTP请求调用方式
- 移除不必要的JSON序列化操作
- 保留调试日志功能

* fix(AutoPlanDomain): 修复日期过滤逻辑并添加默认配置

- 修复了日期过滤条件,将 undefined 检查改为布尔值检查
- 添加了对空任务列表的检查,避免执行空任务
- 更新了主函数调用方式为立即执行的异步函数
- 添加了新的测试函数 test1 用于配置拉取测试
- 简化了日志输出中的对象字符串化处理
- 为 API 配置字段添加了默认本地地址值

* docs(config): 更新配置项标签描述

- 简化加载模式选项的说明文字
- 简化自动秘境计划配置的语法说明
- 统一配置项标签为更简洁的文档引用格式

* feat(game): 添加原粹树脂识别功能

- 新增 physical.js 工具模块,实现原粹树脂识别逻辑
- 在配置文件中添加用户体力相关配置项
- 集成体力识别流程到初始化过程
- 添加图像模板匹配资源管理
- 实现主界面导航和返回功能
- 增加错误处理和异常捕获机制

* fix(config): 修复配置密钥验证逻辑

- 更新 checkKey 函数以安全访问嵌套的 manifest.key 属性
- 移除重复的密钥匹配检查逻辑
- 添加对 config.info.manifest.key 的空值检查
- 统一使用 checkKey 函数进行密钥验证
- 简化 initConfig 函数中的密钥处理流程

* ```
fix(domain): 解决体力检测逻辑错误问题

- 移除了配置初始化中的体力OCR检测代码
- 在主执行函数中重新实现体力检测逻辑
- 添加体力不足时的错误提示功能
- 确保体力检测在每次执行前进行验证
```

* chore(logging): 将bgi_tools配置日志级别从info调整为debug

- 修改config.js中的日志级别设置
- 将bgi_tools配置信息的日志输出从info级别降级为debug级别
- 减少生产环境中的冗余日志输出

* docs(readme): 更新文档添加工具部署说明和配置界面截图

- 添加了 bettergi-scripts-tools 部署要求说明
- 新增登录界面截图展示
- 添加初始化配置界面截图
- 补充完整配置界面多张截图
- 更新文档结构优化用户体验说明

* feat(config): 添加 bgi_tools 授权 token 配置项

- 在配置表格中新增 bgi_tools_token 字段
- 支持 tokenName=tokenValue 语法格式
- 用于 bgi_tools 推送功能的身份验证

* fix(domain): 更新哲学和武器配置列表

- 将「纷争」的哲学替换为「诗文」的哲学
- 调整武器列表顺序,将神合秘烟的启示与贡祭炽心的荣膺位置互换
- 更新配置文件中的哲学和武器数据结构

* fix(AutoPlanDomain): 修复秘境自动战斗配置过滤逻辑

- 修复了pushAllJsonConfig函数调用中的参数格式问题
- 添加了对autoFight.DomainRoundNum大于0的条件过滤
- 确保只有设置了有效刷取轮数的配置才会参与排序和执行
- 避免无效配置导致的自动战斗异常执行

* fix(AutoPlanDomain): 修复体力检查逻辑并优化异步处理

- 修正体力不足判断条件,从 current >= min 改为 current < min
- 添加throwError函数导入以支持错误抛出功能
- 修复initDomainOrderList调用缺少await导致的异步问题
- 添加日志输出显示处理后的秘境顺序列表
- 修复physical.js中工具函数导入路径错误
- 添加原神分辨率配置常量定义

* fix(AutoPlanDomain): 修复秘境任务执行中的代码错误和日志输出问题

- 修复了导入语句中的多余空格问题
- 添加了秘境任务开始执行的日志输出
- 为秘境参数的各个属性添加了详细的日志记录
- 在设置副本轮数时添加了异常处理和类型转换
- 修复了日志输出中的格式化字符串语法错误
- 修复了异步函数调用中的语法错误

* feat(auto-plan): 添加秘境退出界面处理功能

- 新增 outDomainUI 函数用于处理秘境退出界面
- 添加 isInOutDomainUI 函数检测是否在秘境退出界面
- 实现 findTextAndClick 通用文本查找点击功能
- 在 main.js 中关闭自动分解和原粹树脂榨干功能
- 修复代码格式化问题和拼写错误
- 添加退出秘境相关的图片资源映射配置

* feat(AutoPlanDomain): 添加体力类型优先级配置功能

- 实现物理体力类型的排序和优先级列表配置
- 添加原粹树脂和其他类型树脂的数量统计逻辑
- 修改体力不足判断条件以支持多种体力类型组合
- 配置秘境参数中的树脂使用优先级列表
- 注释掉当前暂不启用的优先级功能代码

* ```
refactor(AutoPlanDomain): 更新领域配置逻辑以支持开关控制

- 将物理领域配置从数量控制改为开关控制
- 添加open字段来控制领域是否启用
- 修改求和逻辑从count字段改为基于open状态计算
- 修复注释中的错别字和描述准确性
```

* feat(AutoPlanDomain): 添加树脂类型配置和使用优先级功能

- 在配置文件中新增树脂类型名称数组,支持原粹树脂、浓缩树脂、须臾树脂、脆弱树脂
- 实现动态初始化物理树脂配置,从配置中读取树脂类型并生成默认配置
- 修改秘境执行逻辑,只对启用的树脂类型进行优先级排序
- 更新树脂使用优先级判断条件,启用树脂优先级配置功能
- 更新 README 文档,添加树脂使用顺序配置说明和示例
- 在计划配置语法中添加 physical 配置项说明

* fix(physical): 修复物理域过滤逻辑和求和计算问题

- 修改了物理域为空或无开启项目时的判断条件
- 优化了非原粹树脂项目的求和计算方式
- 修正了原粹树脂项目的求和计算方法
- 移除了冗余的 map 和 reduce 操作,改用 filter.length 计算

* fix(utils): 修正日期获取逻辑以适配4点刷新需求

- 在获取当前日期后减去4小时以适配4点刷新机制
- 确保日期计算准确性避免跨日问题

* feat(utils): 添加游戏刷新时间校准参数到getDayOfWeek函数

- 在getDayOfWeek函数中添加calibrationGameRefreshTime参数,默认值为true
- 当calibrationGameRefreshTime为true时执行4小时时间校准逻辑
- 添加函数参数说明注释
- 保留原有的星期信息获取功能

* fix(AutoPlanDomain): 修复原粹树脂数量计算逻辑

- 将 find 方法改为 filter 方法以正确计算原粹树脂项目数量
- 确保只统计开启状态的原粹树脂项目
- 修复了因方法使用错误导致的数量统计不准确问题

* refactor(physical): 更新工具函数导入并调整操作延迟时间

- 从 ./tool 模块导入 throwError 函数
- 将原粹树脂识别操作的延迟时间从 1000ms 增加到 2000ms

* fix(AutoPlanDomain): 解决原粹树脂识别和按钮点击问题

- 在物理值OCR识别前添加1秒延迟以提高准确性
- 将操作延迟时间从2000毫秒调整为1000毫秒
- 修正增加按钮的坐标和尺寸参数以匹配当前界面布局
- 注释掉衍生裁剪区域的释放操作避免潜在错误

* fix(AutoPlanDomain): 修复物理域过滤和周日选择值处理逻辑

- 修复了原粹树脂过滤条件中的多余空格问题
- 统一了过滤器链中的空格格式
- 添加了周日选择值的空值检查,避免未定义值的赋值
- 将周日选择值转换为字符串类型以确保数据一致性
- 优化了条件赋值逻辑,提高代码健壮性

* refactor(AutoPlanDomain): 更新树脂优先级列表设置方法

- 将直接赋值方式改为调用 SetResinPriorityList 方法
- 使用展开运算符合并树脂优先级列表参数

* refactor(AutoPlanDomain): 优化秘境顺序处理逻辑

- 将 getDayOfWeek 函数调用改为异步方式
- 修改日志级别从 info 到 debug,并添加调试信息
- 为日期过滤逻辑添加详细的日志输出
- 移除重复的排序操作并统一在数据处理最后进行排序
- 修正代码执行顺序以提高性能和可读性

* refactor(AutoPlanDomain): 移除不必要的过滤操作

- 移除 item.days 数组中 parseDay 映射后的空值过滤
- 简化数据处理逻辑,保持原始数组长度不变
- 提升代码简洁性,移除冗余的 filter 操作

* refactor(AutoPlanDomain): 更新执行顺序列表初始化函数命名

- 将 initDomainOrderList 函数重命名为 initRunOrderList
- 更新相关注释描述,从"秘境顺序"改为"执行顺序"
- 修改函数调用处的函数名引用

* refactor(AutoPlanDomain): 更新变量命名以匹配功能实际用途

- 将 autoFightOrderList 重命名为 autoRunOrderList 以准确反映其功能
- 相应更新过滤操作中的变量引用
- 保持原有业务逻辑不变

* refactor(AutoPlanDomain): 重命名自动执行函数名称

- 将 autoDomainList 函数重命名为 autoRunList
- 更新函数调用以使用新的函数名称
- 保持原有功能逻辑不变

* refactor(AutoPlanDomain): 优化配置变量命名

- 将 domainConfig 重命名为 runConfig 以提高代码可读性
- 更新注释内容以准确描述配置获取功能
- 保持原有逻辑不变,仅调整变量命名规范

* refactor(AutoPlanDomain): 将域配置参数重命名为运行配置

- 将 config.js 中的 domainConfig 属性重命名为 runConfig
- 将 main.js 中的函数参数 domainConfig 重命名为 runConfig
- 更新函数内部对配置路径的引用,从 domainConfig 改为 runConfig
- 修改注释中参数名称的描述,保持文档一致性

* refactor(config): 将配置对象中的domain属性重命名为run

- 将config.js中的domain对象重命名为run对象
- 更新所有引用config.domain为config.run的地方
- 修改main.js中对配置对象的访问路径
- 确保配置加载逻辑保持一致性

* rename(config): 将 domain_config 重命名为 run_config

- 修改配置文件路径从 config/domain_config.json 到 config/run_config.json
- 更新代码中引用的配置项名称从 domain_config 到 run_config
- 更新 README.md 文档中的配置项说明
- 更新 settings.json 中的配置字段名称

* feat(AutoPlanDomain): 添加计划配置类型字段支持

- 在表格中新增类型字段作为必填项,支持秘境/地脉类型选择
- 更新配置示例格式,在开头添加类型标识符
- 在JSON配置中添加runType字段,默认为秘境类型
- 调整表格结构并优化字段说明文档
- 为后续地脉功能扩展预留字段支持

* feat(AutoPlanDomain): 添加运行类型配置支持秘境和地脉

- 在配置中新增runTypes数组,支持'秘境'和'地脉'两种运行类型
- 修改解析逻辑以支持运行类型参数作为第一个参数
- 添加运行类型验证检查,确保输入类型在允许范围内
- 更新数组索引解析,调整各参数对应的数组位置
- 过滤条件中添加运行类型为'秘境'的条件限制

* fix(AutoPlanDomain): 修复自动运行配置中的队伍类型判断逻辑

- 将硬编码的"秘境"字符串替换为配置项config.user.runTypes[0]
- 提高代码的可配置性和灵活性
- 避免因固定值导致的潜在错误

* docs(AutoPlan): 更新项目名称和功能描述

- 将项目名称从 AutoPlanDomain 重命名为 AutoPlan
- 更新功能描述从"自动秘境计划JS"为"自动体力计划JS"
- 移除关于BetterGI自动秘境的冗余说明

* fix(AutoPlan): 修正错误提示信息

- 将秘境配置错误提示修改为体力配置错误提示
- 确保错误信息与实际功能配置相匹配

* feat(AutoPlan): 添加运行类型判断逻辑

- 实现了根据runType字段控制autoDomain执行的功能
- 当runType为config.user.runTypes[0]时执行autoDomain
- 当runType为config.user.runTypes[1]时预留地脉花功能
- 保持了原有的自动域名执行列表循环结构

* refactor(AutoPlan): 优化自动执行列表处理函数命名

- 将函数参数名从 autoDomainOrderList 更改为 autoRunOrderList
- 更新函数注释描述以匹配新的通用功能
- 修改循环变量引用以使用新的参数名称
- 调整函数逻辑以支持更广泛的自动配置类型

* feat(AutoPlan): 添加复活重试机制和地脉花功能支持

- 实现复活重试逻辑,最多重试5次
- 只对秘境复活场景进行重试处理
- 添加地脉花任务的异步函数框架
- 完善自动执行列表中的地脉花调用
- 修复代码中的空格格式问题

* todo

* fix(AutoPlan): 修复树脂耗尽模式和开放模式计数配置

- 将 isResinExhaustionMode 配置项从 false 修改为 true
- 将 openModeCountMin 配置项从 false 修改为 true
- 更新自动运行列表过滤条件以支持多个运行类型
- 添加对 autoLeyLineOutcrop.count 的可选链检查
- 扩展运行配置以同时处理 DomainRoundNum 和 LeyLineOutcrop 计数

* ```
feat(AutoPlan): 添加地脉异常处理和参数配置功能

- 注释掉树脂耗尽模式和开放模式计数最小值配置项
- 添加地脉暂不支持的日志提示并返回
- 创建AutoLeyLineOutcropParam对象并设置各项参数
- 重新启用树脂耗尽模式和开放模式计数最小值
- 实现复活重试机制,最多重试5次
- 仅在包含复活错误信息时进行重试
- 移除其他场景的重试逻辑
```

* feat(AutoPlan): 添加秘境执行类型过滤功能

- 在自动战斗计划中添加配置过滤器,只执行指定类型的秘境
- 保留原有的日期过滤逻辑作为备用选项
- 通过配置项控制不同秘境类型的执行策略

* refactor(AutoPlan): 统一副本轮数参数命名规范

- 将 DomainRoundNum 属性名统一改为 domainRoundNum
- 更新 main.js 中的参数引用以保持一致性
- 修改 README.md 文档中的参数名称说明
- 确保所有相关代码使用相同的参数命名风格

* refactor(AutoPlan): 重命名解析函数以提高语义清晰度

- 将 parseDay 函数重命名为 parseInteger 以更准确反映其功能
- 更新所有调用点以使用新的函数名称
- 保持原有解析逻辑不变,仅改进函数命名的准确性

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

- 重命名 autoFightOrderSet 为 autoOrderSet 以统一变量命名
- 重构 loadMode 函数中的参数解析逻辑,调整数组索引对应关系
- 重新组织秘境顺序对象的数据结构,支持地脉功能扩展
- 更新 README.md 中的配置参数表格和示例格式
- 调整配置参数的顺序映射关系,统一索引计算逻辑
- 修复 UID 配置加载的变量引用错误
- 优化代码缩进格式保持一致性

* refactor(AutoPlan): 优化自动规划配置解析逻辑

- 使用索引变量替代硬编码数组下标提高代码可读性
- 重构运行类型配置解析,支持更灵活的参数结构
- 完善地脉开采功能配置项,增加更多可配置参数
- 添加详细的注释说明各类配置参数的作用和格式
- 优化数组遍历逻辑,避免直接使用固定下标访问元素

* fix(auto-plan): 修复地脉功能布尔值解析和配置文档

- 修复 useFragileResin、useTransientResin、isGoToSynthesizer、useAdventurerHandbook、isNotification 字段的布尔值解析逻辑
- 修改 timeout 字段解析使用 parseInteger 函数
- 更新 README.md 中的地脉功能配置说明和参数详解表格
- 添加地脉类型的详细参数说明和配置示例
- 修复版本密钥表格格式问题
- 补充 JSON 配置格式示例和地脉功能相关配置项说明

* fix(AutoPlan): 解决地脉数据解析中的数组越界问题

- 在访问friendshipTeam字段前添加数组长度检查
- 在访问useFragileResin字段前添加数组长度检查
- 在访问useTransientResin字段前添加数组长度检查
- 在访问isGoToSynthesizer字段前添加数组长度检查
- 在访问useAdventurerHandbook字段前添加数组长度检查
- 在访问isNotification字段前添加数组长度检查
- 在访问timeout字段前添加数组长度检查
- 防止因数组索引超出范围导致的解析错误

* fix(AutoPlan): 修复副本配置解析中的数组越界问题

- 添加数组长度检查以防止访问超出边界的索引
- 为sundaySelectedValue设置默认值避免未定义错误
- 在解析域选择值前验证数组索引范围
- 保持原有逻辑功能的同时增强代码健壮性

* fix(AutoPlan): 修复队伍名称为空时的设置问题

- 添加了队伍名称非空判断条件
- 防止空字符串被设置为队伍名称
- 确保只有有效名称才会被赋值给autoFight.partyName

* Revert "fix(AutoPlan): 修复队伍名称为空时的设置问题"

This reverts commit 2dc019f4cc.

* refactor(AutoPlan): 优化秘境战斗配置对象初始化逻辑

- 将秘境信息对象autoFight的创建位置从错误处理分支后移至条件判断前
- 统一了对象属性的初始化值,sundaySelectedValue默认值设为1
- 删除了重复的对象声明代码,提高了代码可读性
- 保持了原有的功能逻辑不变,仅调整代码结构

* ```
refactor(AutoPlan): 注释地脉花功能配置对象

- 将 autoLeyLineOutcrop 配置对象注释掉以禁用该功能
- 保留原始配置代码便于后续功能启用
- 添加功能暂不支持的日志提示信息
```

* fix(auto-plan): 修复UID配置读取问题

- 确保UID作为字符串类型进行配置映射查找
- 更新文档中UID字段的数据类型说明

* feat(auto-plan): 添加运行类型支持并优化名称和资源管理

- 在自动计划配置中添加runType字段用于指定运行类型
- 将插件名称从"自动秘境计划"更改为"自动体力计划"
- 为图像识别添加调试日志输出功能
- 使用try-finally块确保图像捕获区域资源正确释放
- 优化退出界面逻辑,增加主界面检测和确认按钮点击处理
- 添加循环跳出条件避免无限重试

* feat(config): 添加复活重试次数配置选项

- 在配置文件中添加 retry_count 参数,默认值为 3
- 从设置界面读取重试次数并转换为整数值
- 将硬编码的重试次数 5 替换为配置值
- 在设置界面添加下拉选择框供用户自定义重试次数
- 添加复活重试功能的 UI 输出调用

* feat(bgi_tools): 添加全部国家配置推送功能

- 新增 pushAllCountryConfig 函数用于推送国家配置数据
- 配置文件中添加 httpPushAllCountryConfig API 地址配置项
- 添加 countryList.json 文件存储国家列表数据
- 在 main.js 中集成国家配置推送逻辑
- 设置文件中添加国家配置推送API设置选项
- 完善相关依赖注入和配置初始化流程

* fix(config): 更新 BGI 工具推送国家配置 API 默认地址

- 修改默认 API 地址从 /country/all 到 /country/json/all
- 保持其他配置项不变

* docs(AutoPlan): 更新 README 中限时/周日参数说明

- 将限时/周日参数说明从具体的可用时间描述改为与本体一致的数值说明
- 保持参数选项 1 / 2 / 3 不变
- 简化了参数含义的表述方式

* docs(AutoPlan): 更新战斗超时配置说明

- 将战斗超时选项的默认值从"启用随便填个值"更正为"可选,默认 120"
- 修正README文档中的配置参数描述准确性

* feat(AutoPlan): 实现自动运行列表的循环执行机制

- 添加while循环结构支持重复执行autoRunList
- 集成体力检测逻辑防止体力耗尽时继续运行
- 添加循环控制条件避免无限执行
- 实现体力不足时的自动中断机制
- 优化运行流程确保按需执行和停止

* refactor(AutoPlan): 优化秘境自动化任务执行逻辑

- 将复活重试逻辑包装在try-finally块中确保退出秘境操作始终执行
- 修复多处代码格式问题包括空格和缩进统一
- 优化条件判断语句的格式和可读性
- 统一变量赋值语句的空格格式
- 改进字符串拼接和条件表达式的写法
- 优化while循环中的退出条件判断逻辑

* fix(AutoPlan): 移除体力检查逻辑

- 删除了配置中的体力值下限判断条件
- 移除了当用户当前体力低于最低要求时的中断逻辑
- 简化了循环执行的条件判断流程

* Revert "fix(AutoPlan): 移除体力检查逻辑"

This reverts commit 71126e94dc.

* fix(AutoPlan): 修复数组越界检查逻辑

- 将条件判断从 index < arr.length 修改为 index <= arr.length-1
- 防止在解析配置数组时发生索引越界错误
- 确保所有可选配置项都能正确解析而不会抛出异常

* fix(AutoPlan): 修复自动运行循环的条件判断逻辑

- 修改了循环终止条件,将硬编码的 true 改为 false
- 添加了体力值检查条件 config.user.physical.current < config.user.physical.min
- 调整了体力不足时的 break 逻辑位置
- 移除了冗余的 else if 分支,简化代码结构

* fix(AutoPlan): 修复自动计划循环逻辑

- 修改了循环条件判断逻辑
- 更新了体力不足时的循环行为
- 添加了正确的循环控制注释

* refactor(AutoPlan): 调整体力检查逻辑结构

- 重构了循环中的条件判断结构
- 将体力检查逻辑嵌套到新的条件分支中
- 添加了体力耗尽的注释说明
- 优化了代码执行流程的控制逻辑

* chore(AutoPlan): 添加循环注释

- 在自动运行列表循环中添加了循环注释标记

* feat(plan): 添加循环体力计划功能

- 在配置文件中添加 loop_plan 选项,默认为 false
- 将设置项 loop_plan 与配置项进行绑定
- 修改主循环逻辑,根据 loop_plan 配置决定是否启用循环体力计划
- 在设置界面添加循环体力计划的复选框选项

* feat(AutoPlan): 添加循环体力计划和复活重试功能

- 新增 loop_plan 配置项支持循环体力计划
- 新增 retry_count 配置项控制复活重试次数
- 更新战斗超时默认值显示格式
- 扩展自动加载模式的功能选项

* feat(settings): 更新循环体力计划配置项标签

- 在循环体力计划标签中添加体力耗尽自动终止说明

* 等本体地脉花 先上个草稿 (#2883)

* feat(bettergi): 添加自动地脉花任务参数类型定义

- 定义 AutoLeyLineOutcropParam 类型
- 添加刷取次数、国家地区、地脉花类型等基本属性
- 实现树脂耗尽模式、好感队、战斗队伍等相关配置
- 添加自动合成浓缩树脂和使用各类树脂的功能选项
- 包含超时设置和通知功能配置
- 生成自动生成的别名声明

* feat(dispatcher): 添加自动地脉花任务功能

- 添加 runAutoLeyLineOutcropTask 方法用于运行自动地脉花任务
- 添加 RunAutoLeyLineOutcropTask 别名用于兼容性支持
- 提供自定义取消令牌参数支持
- 完善类型定义文件中的相关接口声明

(cherry picked from commit ca0eb532c4)

* refactor(AutoPlan): 移除地脉功能的调试代码

- 注释掉地脉暂不支持的日志输出逻辑
- 保留AutoLeyLineOutcropParam参数初始化代码
- 清理相关调试标记以优化代码结构

* fix(config): 修复配置文件中的数组格式问题

- 移除了 options 数组中多余的逗号,修正了 JSON 格式错误
- 确保配置文件符合标准 JSON 语法规范

* feat(AutoPlan): 更新秘境退出检测逻辑

- 将 isInOutDomainUI 函数改为异步函数,使用 OCR 文本识别替代模板匹配
- 添加 findText 函数用于在指定区域内查找文本内容,支持多次尝试和重试机制
- 修改 outDomainUI 函数逻辑,优化退出秘境流程和错误处理
- 增加最大尝试次数限制,避免无限循环等待
- 添加详细的 JSDoc 注释文档说明 findText 函数参数和返回值

* style(utils): 格式化代码并添加测试功能

- 修复 tool.js 中的代码格式问题,包括括号位置和空格调整
- 将 main.js 中的日志级别从 info 调整为 debug 以减少冗余输出
- 在 main.js 中添加 test2 测试函数用于初始化和退出秘境界面测试
- 在 outDomainUI 函数中添加主界面状态检测逻辑
- 优化退出秘境流程的条件判断,增加 inMainUI 状态变量
- 修复代码中的语法格式问题,统一代码风格

* ```
feat(AutoPlan): 添加退出秘境的UI处理功能

- 实现了退出秘境界面处理函数
- 添加了点击确认按钮的交互逻辑
- 集成了界面状态检测机制
- 完善了相关操作的日志记录
```

* ```
fix(AutoPlan): 优化自动秘境执行流程并修复索引逻辑错误

- 添加秘境任务开始和完成的日志记录
- 将地脉功能的info日志改为warn日志并更新开始执行日志
- 在执行列表循环中添加1秒延迟避免过快执行
- 修复索引递增逻辑错误,移除重复的index++操作
- 统一数组长度比较中的空格式
- 优化循环计划的条件判断格式
- 添加测试函数的空行分隔
```

* perf(AutoPlan): 优化秘境任务执行逻辑

- 在秘境任务开始时添加警告日志提示等待时间可能较长
- 保留体力消耗相关配置参数以支持后续功能扩展

* chore(version): 更新版本号到 0.57.1

- 将 bgi_version 从 0.55.0 更新到 0.57.1

* chore(version): 降级版本号从 0.57.1 到 0.57.0

- 将 manifest.json 中的 bgi_version 从 0.57.1 修改为 0.57.0

* fix(AutoPlan): 修复地脉异常处理逻辑中的无限循环问题

- 调整了 ESCAPE 键按压和睡眠操作的位置以避免重复执行
- 确保在主界面检测成功时能够正确跳出循环
- 保持原有的重试机制和错误处理逻辑不变

* docs(readme): 更新AutoPlan文档标题和描述

- 将标题从"AutoPlan"更改为"AutoPlan自动体力计划"
- 更新脚本描述为中文说明
- 保留原有的功能介绍内容

* fix(AutoPlan): 修正地脉刷取配置格式

- 修正了地脉刷取配置的字段格式
- 统一了配置文件的语法结构
- 修正了注释格式以匹配新的配置规范

* fix(AutoPlan): 调整自动化脚本执行间隔和界面切换逻辑

- 将计划执行间隔从 1 秒增加到 3 秒
- 在界面切换后添加延迟以确保操作稳定
- 在地图打开操作前添加延迟等待

* fix(AutoPlan): 解决地脉任务参数解析问题

- 移除地脉任务的临时禁用代码
- 修复参数传递中的类型转换问题,使用 parseInteger 处理计数参数
- 更新 BGI 版本号从 0.57.0 到 0.57.2
- 添加参数对象的构造注释代码作为备选实现方案

* fix(AutoPlan): 添加延迟等待解决复活重试问题

- 在复活重试逻辑前添加1秒延迟
- 防止重试过程中的时间冲突问题

* chore(AutoPlan): 移除多余调试日志并添加关键参数输出

- 注释掉秘境名称、队伍名称、周日选择值和副本轮数的详细调试日志
- 添加秘境参数的JSON字符串化输出便于调试
- 添加地脉参数的JSON字符串化输出便于调试

* fix(AutoPlan): 修复冒险手册使用逻辑错误

- 和本体保持一致,反转 useAdventurerHandbook 参数值
- 修正了自动规划功能中的布尔参数取反逻辑

* Revert "chore(AutoPlan): 移除多余调试日志并添加关键参数输出"

This reverts commit a348a2cdbc.

* fix(config): 更新bgi_tools拉取配置api默认地址

- 修正了bgi_tools拉取配置api的默认路径从/domain/json改为/json

* fix(config): 修复配置项默认值处理逻辑

- 修改 loop_plan 配置项的默认值处理,避免 undefined 值覆盖原有配置
- 优化物理识别模块中的按钮匹配逻辑,增加空值检查防止程序崩溃

* fix(AutoPlan): 修复自动规划模块中的空指针和配置读取问题

- 修复了地脉任务参数构造中的字符串拼接问题
- 将配置文件读取的数据结构从Map改为Object以避免兼容性问题
- 添加了对配置列表长度和大小的双重检查以防止空指针异常
- 为数字解析函数添加了异常处理和默认值参数
- 修复了日志输出格式中的空格问题

* fix(AutoPlan): 修复计划解析中的空值处理问题

- 添加了对null和undefined值的安全检查
- 使用String()确保类型转换的一致性
- 在parseInt中指定基数参数以避免潜在问题
- 注释掉旧代码以便后续清理
- 提高了日期解析的健壮性

* fix(AutoPlan): 解决物理域数据访问中的空值错误

- 添加可选链操作符以防止访问未定义对象属性
- 修复过滤器中对空值的处理逻辑
- 确保数组映射操作的安全性避免运行时错误

* fix(AutoPlan): 修复数组元素空值检查逻辑

- 添加 null 检查以避免对空值进行 trim 操作
- 确保 useFragileResin 属性正确处理空值情况
- 确保 useTransientResin 属性正确处理空值情况
- 确保 isGoToSynthesizer 属性正确处理空值情况
- 确保 useAdventurerHandbook 属性正确处理空值情况
- 确保 isNotification 属性正确处理空值情况
- 在条件判断前添加额外的换行符以提高代码可读性

* refactor(utils): 优化代码逻辑和资源管理

- 修改 bgi_tools.js 中注释掉不必要的返回语句
- 格式化 config.js 中数组和条件判断的代码风格
- 重构 token 解析逻辑,使用更安全的分割方法
- 修复 physical.js 中方法名大小写错误 (Dispose -> dispose)
- 优化 main.js 中循环逻辑,添加体力值重新获取功能
- 完善 uid.js 中数字提取逻辑,增加边界情况处理

* fix(autoPlan): 解决无效加载方式导致的错误处理问题

- 添加对无效加载方式的检查和错误抛出
- 防止当LoadMap中不存在对应项时程序崩溃
- 提供更清晰的错误信息帮助调试

* refactor(config): 优化重试次数配置解析逻辑

- 使用更安全的 Number.parseInt 和 Number.isFinite 替代 parseInt
- 添加空值检查和默认值回退机制
- 移除旧的配置解析代码
- 更新工具函数文档注释类型定义

* refactor(AutoPlan): 更新体力识别函数返回值字段命名

- 将返回对象中的remainder字段重命名为current,提高语义清晰度
- 保持其他功能逻辑不变,仅调整字段名称以更好地反映其含义

* fix(config): 修正配置文件中的文本错误

- 修正了 domain.json 中 "长夜火的烈辉" 为正确的 "长夜燧火的烈辉"
- 确保配置项的一致性和准确性
2026-03-02 18:10:15 +08:00

544 lines
24 KiB
JavaScript
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 {config, initConfig, initSettings, LoadType} from './config/config';
import {ocrUid} from './utils/uid';
import {getDayOfWeek, outDomainUI, throwError} from './utils/tool';
import {pullJsonConfig, pushAllCountryConfig, pushAllJsonConfig} from './utils/bgi_tools';
import {ocrPhysical} from "./utils/physical";
/**
* 自动执行秘境任务的异步函数
* @param {Object} autoFight - 包含秘境自动配置参数的对象
* @returns {Promise<void>} - 执行完成后返回的Promise
*/
async function autoDomain(autoFight) {
log.info(`{0}`, "开始执行秘境任务")
log.warn(`{0}`, "非体力耗尽情况下(受本体限制),等待退出秘境时间较长")
//定死做预留冗余 先不实现 不能指定次数 只能指定启用
let physical_domain = autoFight?.physical
// || [
// {order: 0, name: "原粹树脂", count: 1, open: true},
// {order: 1, name: "浓缩树脂", count: 0, open: false},
// {order: 2, name: "须臾树脂", count: 0, open: false},
// {order: 3, name: "脆弱树脂", count: 0, open: false},
// ]
if ((!physical_domain) || physical_domain.filter(item => item?.open).length === 0) {
const names = config.user.physical.names;
physical_domain = []
names.forEach((name, index) => {
physical_domain.push({order: index, name: name, open: index === 0})
})
}
physical_domain.sort((a, b) => a.order - b.order)
// 不包含原粹树脂的和
const noOriginalSum = physical_domain.filter(item => item?.name.trim() !== "原粹树脂")
.filter(item => item?.open).length;//求和
// 只包含原粹树脂的和
const originalSum = physical_domain.filter(item => item?.name?.trim() === "原粹树脂")
.filter(item => item?.open).length;
const resinPriorityList = physical_domain.filter(item => item?.open).map(item => item?.name?.trim())
// /** 树脂使用优先级列表 */
// resinPriorityList: string[];
// /** 使用原粹树脂次数 */
// originalResinUseCount: number;
// /** 使用浓缩树脂次数 */
// condensedResinUseCount: number;
// /** 使用须臾树脂次数 */
// transientResinUseCount: number;
// /** 使用脆弱树脂次数 */
// fragileResinUseCount: number;
await sleep(1000)
//流程->返回主页 打开地图 返回主页
const physicalOcr = await ocrPhysical(true, true)
config.user.physical.current = physicalOcr.current
config.user.physical.min = physicalOcr.min
const physical = config.user.physical
if (physical.current < physical.min && noOriginalSum <= 0 && originalSum > 0) {
throwError(`体力不足,当前体力${physical.current},最低体力${physical.min},请手动补充体力后重试`)
}
// 创建秘境参数对象初始化值为0
let domainParam = new AutoDomainParam();
//关闭分解
domainParam.autoArtifactSalvage = false
//关闭榨干原粹树脂
domainParam.specifyResinUse = true
//配置树脂使用优先级
if (resinPriorityList.length > 0) {
domainParam.SetResinPriorityList(...resinPriorityList)
}
// log.debug(`开始执行秘境任务`)
//秘境名称
domainParam.DomainName = autoFight.domainName || domainParam.DomainName;
log.debug(`秘境名称:${domainParam.DomainName}`)
//队伍名称
domainParam.PartyName = autoFight.partyName || domainParam.PartyName;
log.debug(`队伍名称:${domainParam.PartyName}`)
if (autoFight.sundaySelectedValue) {
//周日|限时选择的值
domainParam.SundaySelectedValue = "" + (autoFight.sundaySelectedValue || domainParam.SundaySelectedValue);
}
log.debug(`周日|限时选择的值:${domainParam.SundaySelectedValue}`)
//副本轮数
try {
domainParam.DomainRoundNum = parseInt((autoFight.domainRoundNum || domainParam.DomainRoundNum) + "");
} catch (e) {
log.debug(`副本轮数:${autoFight.domainRoundNum}`)
throwError(e.message)
}
log.debug(`副本轮数:${domainParam.DomainRoundNum}`)
try {
// 复活重试
for (let i = 0; i < config.run.retry_count; i++) {
try {
await dispatcher.RunAutoDomainTask(domainParam);
// 其他场景不重试
break;
} catch (e) {
const errorMessage = e.message
// 只有选择了秘境的时候才会重试
if (errorMessage.includes("复活") && domainParam.DomainName) {
continue;
}
throw e;
}
}
} finally {
log.info(`{0}`, "执行完成")
// 退出秘境
await outDomainUI()
}
}
/**
* 自动执行地脉花任务的异步函数
* @param autoLeyLineOutcrop
* @returns {Promise<void>}
*/
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
// }
log.info(`{0}`, "开始执行地脉任务")
// if (true) {
// log.warn("地脉 暂不支持")
// return
// }
let param = new AutoLeyLineOutcropParam(parseInteger(autoLeyLineOutcrop.count + ""), autoLeyLineOutcrop.country, autoLeyLineOutcrop.leyLineOutcropType);
// let param = new AutoLeyLineOutcropParam();
// param.count = parseInteger(autoLeyLineOutcrop.count+"");
// param.country = autoLeyLineOutcrop.country;
// param.leyLineOutcropType = autoLeyLineOutcrop.leyLineOutcropType;
//和本体保持一致
param.useAdventurerHandbook = !autoLeyLineOutcrop.useAdventurerHandbook;
param.friendshipTeam = autoLeyLineOutcrop.friendshipTeam;
param.team = autoLeyLineOutcrop.team;
param.timeout = autoLeyLineOutcrop.timeout;
param.isGoToSynthesizer = autoLeyLineOutcrop.isGoToSynthesizer;
param.useFragileResin = autoLeyLineOutcrop.useFragileResin;
param.useTransientResin = autoLeyLineOutcrop.useTransientResin;
param.isNotification = autoLeyLineOutcrop.isNotification;
param.isResinExhaustionMode = true;
param.openModeCountMin = true;
await sleep(1000)
// 复活重试
for (let i = 0; i < config.run.retry_count; i++) {
try {
await dispatcher.RunAutoLeyLineOutcropTask(param);
// 其他场景不重试
break;
} catch (e) {
const errorMessage = e.message
// 只有选择了秘境的时候才会重试
if (errorMessage.includes("复活")) {
continue;
}
throw e;
}
}
}
/**
* 自动执行列表处理函数
* @param {Array} autoRunOrderList - 包含自动配置的数组
*/
async function autoRunList(autoRunOrderList) {
//计划执行
for (const item of autoRunOrderList) {
await sleep(3000)
if (item.runType === config.user.runTypes[0]) {
await autoDomain(item.autoFight);
} else if (item.runType === config.user.runTypes[1]) {
await autoLeyLineOutcrop(item.autoLeyLineOutcrop);
}
}
}
// 辅助函数:安全地解析 day 字段
function parseInteger(day) {
if (day == null || String(day).trim() === "") {
return undefined; // 空值或无效值返回 undefined
}
const parsedDay = parseInt(String(day).trim(), 10);
return isNaN(parsedDay) ? undefined : parsedDay; // 非法数字返回 undefined
}
/**
* 根据不同的加载方式加载秘境配置
* @param {string} Load - 加载方式类型如uid或input
* @param {Set} autoOrderSet - 用于存储秘境顺序的Set集合
* @param {string} runConfig - 输入的配置字符串仅在Load为input时使用
*/
async function loadMode(Load, autoOrderSet, runConfig) {
switch (Load) {
case LoadType.input:
// 通过输入字符串方式加载配置
if (runConfig) {
// 处理输入字符串:去除首尾空格,将中文逗号替换为英文逗号,然后按逗号分割
runConfig.trim().replaceAll('', ',').split(",").forEach(
item => {
// 将当前项按"|"分割成数组
let arr = item.split("|")
// 类型|执行日期|执行顺序
let index = 0
let runType = arr[index]; // 解析运行类型
index++
const rawDays = arr[index];
let days = (rawDays != null && String(rawDays).trim() !== "")
? String(rawDays).split('/').map(d => parseInt(d.trim(), 10)).filter(d => !isNaN(d))
: [];
// let days = arr[index].trim() !== ""
// ? arr[index].split('/').map(d => parseInt(d.trim())).filter(d => !isNaN(d))
// : [];
index++
// 解析顺序值,处理可能的无效值
let order = (() => {
const rawOrder = arr[index]; // 获取原始值
if (rawOrder == null || String(rawOrder).trim() === "") {
return 0; // 若为空或无效值,默认返回 0
}
const parsedOrder = parseInt(String(rawOrder).trim(), 10); // 转换为整数
return isNaN(parsedOrder) ? 0 : parsedOrder; // 若转换失败,返回默认值 0
})();
index++
// 创建秘境顺序对象
let autoOrder = {
order: order, // 顺序值
// day: day,// 执行日期
runType: runType, // 运行类型
days: days, // 执行日期(数组)
autoFight: undefined, // 秘境信息对象
autoLeyLineOutcrop: undefined // 地脉信息对象
}
if (!config.user.runTypes.includes(runType)) {
throwError(`运行类型${runType}输入错误`)
} else if (config.user.runTypes[0] === runType) {
// 创建秘境信息对象
let autoFight = {
domainName: undefined,//秘境名称
partyName: undefined,//队伍名称
sundaySelectedValue: 1,//周日|限时选择的值
domainRoundNum: 0,//副本轮数
}
//"|队伍名称|秘境名称/刷取物品名称|刷几轮|限时/周日,..."
let partyName = arr[index]; // 解析队伍名称
index++
let domainName = arr[index]; // 解析秘境名称
index++
let domainRoundNum = arr[index]; // 解析副本轮数
index++
let sundaySelectedValue = "1"
if (index <= arr.length - 1)
sundaySelectedValue = arr[index]; // 解析周日|限时选择的值
// 检查秘境名称是否有效
if (!config.domainNames.has(domainName)) {
//秘境名称没有记录 查询是否是物品名称
if (config.itemNames.has(domainName)) {
const domainNameTemp = config.domainItemsMap.get(domainName);
if (!domainNameTemp) {
throw new Error(`${domainName} 输入错误`);
}
if (index <= arr.length - 1) {
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 // 周日|限时选择的值
autoOrder.autoFight = autoFight // 将秘境信息对象添加到秘境顺序对象中
} else if (config.user.runTypes[1] === runType) {
//"|队伍名称|国家|刷几轮|花类型|好感队|是否使用脆弱树脂|是否使用须臾树脂|是否前往合成台合成浓缩树脂|是否使用冒险之证|发送详细通知|战斗超时时间,..."
let autoLeyLineOutcrop = {
count: 0, // 刷几次0=自动/无限)
country: undefined, // 国家地区
leyLineOutcropType: undefined, // 需映射为经验/摩拉
useAdventurerHandbook: false, // 是否使用冒险之证
friendshipTeam: "", // 好感队伍ID
team: "", // 主队伍ID
timeout: 120, // 超时时间(秒)
isGoToSynthesizer: false, // 是否前往合成台
useFragileResin: false, // 使用脆弱树脂
useTransientResin: false, // 使用须臾树脂(须臾=Transient
isNotification: false // 是否通知
}
autoLeyLineOutcrop.team = arr[index]
index++
autoLeyLineOutcrop.country = arr[index]
index++
autoLeyLineOutcrop.count = arr[index]
index++
autoLeyLineOutcrop.leyLineOutcropType = arr[index]
index++
if (index <= arr.length - 1)
autoLeyLineOutcrop.friendshipTeam = arr[index]
index++
if (index <= arr.length - 1)
autoLeyLineOutcrop.useFragileResin = (arr[index] != null && arr[index].trim() !== "")
index++
if (index <= arr.length - 1)
autoLeyLineOutcrop.useTransientResin = (arr[index] != null && arr[index].trim() !== "")
index++
if (index <= arr.length - 1)
autoLeyLineOutcrop.isGoToSynthesizer = (arr[index] != null && arr[index].trim() !== "")
index++
if (index <= arr.length - 1)
autoLeyLineOutcrop.useAdventurerHandbook = (arr[index] != null && arr[index].trim() !== "")
index++
if (index <= arr.length - 1)
autoLeyLineOutcrop.isNotification = (arr[index] != null && arr[index].trim() !== "")
index++
if (index <= arr.length - 1)
autoLeyLineOutcrop.timeout = parseInteger(arr[index])
autoOrder.autoLeyLineOutcrop = autoLeyLineOutcrop // 将地脉信息对象添加到顺序对象中
}
// 将秘境顺序对象添加到列表中
autoOrderSet.add(autoOrder)
}
)
}
break
case LoadType.uid:
// 通过UID方式加载配置
const uid = config.user.uid || (await ocrUid()) // 获取用户UID如果未配置则通过OCR识别获取
// const configAutoFightOrderMap = JSON.parse(file.readTextSync(config.path.runConfig)) || new Map() // 读取本地配置文件并转换为Map对象
// const uidConfigList = configAutoFightOrderMap.get(uid + "") || []; // 获取当前UID对应的配置列表
const configAutoFightOrderMap = JSON.parse(file.readTextSync(config.path.runConfig)) || {} // 读取本地配置文件
const uidConfigList = configAutoFightOrderMap[uid + ""] || []; // 获取当前UID对应的配置列表
if (uidConfigList?.length > 0) {
// 如果配置列表不为空,遍历并添加到结果集合中
uidConfigList.forEach(item => {
// 将秘境顺序对象添加到列表中
// 主逻辑优化
// if (item.day !== undefined) {
// item.day = parseInteger(item.day);
// }
if (item.days && item.days.length > 0) {
item.days = item.days.map(day => parseInteger(day))
// item.day = parseInteger(item.day);
}
autoOrderSet.add(item)
})
}
break
case LoadType.bgi_tools:
// 通过bgi_tools方式加载配置
log.info(`开始拉取bgi_tools配置`)
const uidConfigListBgiTools = await pullJsonConfig(config.user.uid + '', config.bgi_tools.api.httpPullJsonConfig) || []
if (uidConfigListBgiTools?.length > 0) {
// 如果配置列表不为空,遍历并添加到结果集合中
uidConfigListBgiTools.forEach(item => {
// 将秘境顺序对象添加到列表中
// 主逻辑优化
if (item.days && item.days.length > 0) {
item.days = item.days.map(day => parseInteger(day))
// item.day = parseInteger(item.day);
}
autoOrderSet.add(item)
})
}
break
default:
throw new Error("请先配置加载方式");
// break;
}
}
/**
* 初始化执行顺序列表
* @param {string} domainConfig - 输入的字符串,包含秘境顺序信息
* @returns {Array} 返回处理后的秘境顺序列表
*/
async function initRunOrderList(domainConfig) {
const autoFightOrderSet = new Set() // 存储秘境顺序列表的数组
/* let te = {
order: 1, // 顺序值
day: 0,// 执行日期
autoFight: {
domainName: undefined,//秘境名称
partyName: undefined,//队伍名称
sundaySelectedValue: undefined,//周日|限时选择的值
domainRoundNum: undefined,//副本轮数
} // 秘境信息对象
}*/
// let Load = LoadType.uid
for (const Load of config.run.loads) {
await loadMode(Load.load, autoFightOrderSet, domainConfig);
}
// 检查是否已配置秘境
if (!autoFightOrderSet || autoFightOrderSet.size <= 0) {
throw new Error("请先配置体力配置");
}
// 返回处理后的秘境顺序列表
let from = Array.from(autoFightOrderSet);
let dayOfWeek = await getDayOfWeek();
log.debug(`old-from:{0}`, JSON.stringify(from))
from = from
//过滤掉不执行的秘境
.filter(item => config.user.runTypes.includes(item.runType))
.filter(item => {
// if (item.day) {
// return item.day === dayOfWeek.day
// }
log.debug(`[{1}]item.days.length:{0}`, dayOfWeek.day, item?.days?.length || 0)
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;
}
/**
* 初始化函数
* 该函数用于执行初始化操作使用async/await处理异步操作
*/
async function init() {
// 调用initConfig函数并等待其完成
// 这是一个异步初始化配置的步骤
await initSettings()
await initConfig();
}
/**
* 主函数,用于执行秘境自动刷取任务
* @async
*/
async function main() {
// 初始化配置
await init();
if (config.bgi_tools.open.open_push) {
log.info(`开始推送bgi_tools配置`)
await pushAllJsonConfig(JSON.parse(file.readTextSync(config.path.domain)), config.bgi_tools.api.httpPushAllJsonConfig, config.bgi_tools.token)
await pushAllCountryConfig(JSON.parse(file.readTextSync(config.path.countryList)), config.bgi_tools.api.httpPushAllCountryConfig, config.bgi_tools.token)
}
// 获取配置
let runConfig = config.run.config;
//"队伍名称|秘境名称/刷取物品名称|刷几轮|限时/周日|周几执行(0-6)不填默认执行|执行顺序,..."
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)
)
if (list?.length > 0) {
//循环跑
while (true) {
await autoRunList(list);
if (config.run.loop_plan) {
// 重新获取当前体力值
const physicalOcr = await ocrPhysical(true, true);
config.user.physical.current = physicalOcr.current;
//循环
if (config.user.physical.current < config.user.physical.min) {
//体力耗尽
break
}
} else {
//不循环
break
}
}
} else {
log.info(`本日无计划`)
}
}
(async function () {
// await test()
// await test1()
// await test2()
await main()
})()
async function test() {
await init();
const text = file.readTextSync(config.path.domain);
// log.info("settings:{1}",config.info.settings)
// log.info("text:{1}",text)
const list = JSON.parse(text);
// log.info("list:{1}",list)
log.info("httpPullJsonConfig:{1}", config.bgi_tools.api.httpPushAllJsonConfig)
log.info("|test==>config.bgi_tools:{1}", JSON.stringify(config.bgi_tools))
await pushAllJsonConfig(list, config.bgi_tools.api.httpPushAllJsonConfig)
}
async function test1() {
await init();
// log.info("text:{1}",text)
// log.info("list:{1}",list)
log.info("httpPullJsonConfig:{1}", config.bgi_tools.api.httpPullJsonConfig)
log.info("|test==>config.bgi_tools:{1}", JSON.stringify(config.bgi_tools))
const list = await pullJsonConfig(config.user.uid, config.bgi_tools.api.httpPullJsonConfig)
log.info("list:{1}", JSON.stringify(list))
}
async function test2() {
await init();
await outDomainUI();
}