From c5c268e0e3bf32c9960d1ba468e8101d2a488125 Mon Sep 17 00:00:00 2001 From: yan Date: Sun, 11 Jan 2026 16:10:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(config):=20=E6=9B=B4=E6=96=B0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E8=B7=AF=E5=BE=84=E5=92=8C=E5=A4=9A?= =?UTF-8?q?=E5=A4=8D=E9=80=89=E6=A1=86=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改配置根目录为 'config' 并更新相关路径引用 - 重构多复选框映射表存储结构,保存标签和选项对象 - 新增根据多选框名称获取JSON数据的异步函数 - 更新从复选框映射表获取值的方法以返回选项数组 - 修改用户设置文件路径和名称为 uid_settings.json - 添加错误处理机制避免写入配置文件时崩溃 - 优化配置过滤逻辑支持路径和标签匹配 - 新增提取方括号内容的工具函数 - 调整配置界面显示格式和索引计数逻辑 --- repo/js/FullyAutoAndSemiAutoTools/main.js | 103 ++++++++++++++++-- .../FullyAutoAndSemiAutoTools/settings.json | 6 +- 2 files changed, 96 insertions(+), 13 deletions(-) diff --git a/repo/js/FullyAutoAndSemiAutoTools/main.js b/repo/js/FullyAutoAndSemiAutoTools/main.js index a82904bb2..6a2cee742 100644 --- a/repo/js/FullyAutoAndSemiAutoTools/main.js +++ b/repo/js/FullyAutoAndSemiAutoTools/main.js @@ -2,6 +2,7 @@ let manifest_json = "manifest.json"; let manifest = undefined let configSettings = undefined let AUTO_STOP = undefined +let AUTO_SKIP = undefined let debug = undefined let isDebug = false let SEMI_AUTO = false @@ -13,8 +14,9 @@ const PATHING_ALL = new Array({level: 0, name: `${pathingName}`, parent_name: "" let settingsNameList = new Array() const settingsNameAsList = new Array() let PATH_JSON_LIST = new Array() +const config_root = 'config' // 定义记录文件的路径 -let RecordText = "Record\\record.json" +let RecordText = `${config_root}\\record.json` let RecordList = new Array() let RecordLast = { name: "", @@ -245,12 +247,26 @@ async function getMultiCheckboxMap() { // 记录调试信息,包含名称、标签、选项和选项数量 log.debug("name={key1},label={key2},options={key3},length={key4}", name, label, JSON.stringify(options), options.length); // 将名称和对应的选项数组存入Map - multiCheckboxMap.set(name, options); + // multiCheckboxMap.set(name, options); + multiCheckboxMap.set(name, {label: label, options: options}); }) // 返回包含多复选框配置的Map return multiCheckboxMap } +/** + * 根据多选框名称获取对应的JSON数据 + * 该函数是一个异步函数,用于从复选框映射表中获取指定名称的值 + * @param {string} name - 多选框的名称,用于在映射表中查找对应的值 + * @returns {Promise} 返回一个Promise,解析后为找到的值,如果未找到则返回undefined + */ +async function getJsonByMultiCheckboxName(name) { + // 获取复选框映射表,这是一个异步操作 + let multiCheckboxMap = await getMultiCheckboxMap() + // 从映射表中获取并返回指定名称对应的值 + return multiCheckboxMap.get(name) +} + /** * 根据复选框组名称获取对应的值 * 这是一个异步函数,用于从复选框映射中获取指定名称的值 @@ -261,7 +277,7 @@ async function getValueByMultiCheckboxName(name) { // 获取复选框映射表,这是一个异步操作 let multiCheckboxMap = await getMultiCheckboxMap() // 从映射表中获取并返回指定名称对应的值 - return multiCheckboxMap.get(name) + return multiCheckboxMap.get(name).options } async function init() { @@ -276,6 +292,7 @@ async function init() { throw new Error("密钥不匹配") } AUTO_STOP = (AUTO_STOP) ? AUTO_STOP : settings.autoStop + AUTO_SKIP = (AUTO_SKIP) ? AUTO_SKIP : settings.autoSkip debug = (debug) ? debug : settings.debug isDebug = settings.isDebug SEMI_AUTO = settings.mode === settings.mode @@ -295,7 +312,7 @@ async function init() { // 读取现有配置并合并 let uidSettingsMap = new Map() - const uidSettingsJson = "settings/uid.json"; + const uidSettingsJson = `${config_root}/uid_settings.json`; try { const existingData = JSON.parse(file.readTextSync(uidSettingsJson)) uidSettingsMap = new Map(existingData) @@ -394,6 +411,7 @@ async function init() { // let parentNameNow = undefined const line = 30 const br = `${"=".repeat(line)}\n` + let idx = 0 groupLevel.filter(list => list.length > 0).forEach( (list) => { let i = 0 @@ -406,7 +424,9 @@ async function init() { const localLine = b ? ((line - item.parent_name.length) / 2) : (Math.ceil((line - item.parent_name.length) / 2)) prefix = br + `${"=".repeat(localLine)}${item.parent_name}${"=".repeat(localLine)}\n` + br } - const p = initLength === settingsList.length ? "【地图追踪】\n" : `${prefix}[${item.name}]\n` + // const p = idx === 0 ? "【地图追踪】\n" : `${prefix}[${item.parent_name}-${item.name}]\n` + const p = `${prefix}[${item.name}]\n` + idx++ let leveJson = { name: `${name}`, type: "multi-checkbox", @@ -464,7 +484,11 @@ async function init() { //直接从配置文件中加载对应账号的配置 let uidSettings = uidSettingsMap.get(Record.uid); if (uidSettings) { - file.writeTextSync(manifest.settings_ui, JSON.stringify(uidSettings)) + try { + file.writeTextSync(manifest.settings_ui, JSON.stringify(uidSettings)) + } catch (e) { + log.error("加载用户配置失败: {error}", e.message) + } } configSettings = await initSettings() settingsNameList = settingsNameList.concat(await getMultiCheckboxMap().then(map => { @@ -478,14 +502,16 @@ async function init() { // needRunMap.set(key, multiCheckbox) // } for (const settingsName of settingsNameList) { - const multi = await getValueByMultiCheckboxName(settingsName); - + // let multi = await getValueByMultiCheckboxName(settingsName); + const multiJson = await getJsonByMultiCheckboxName(settingsName) + const label = getBracketContent(multiJson.label) + let multi = multiJson.options const settingsAsName = settingsNameAsList.find(item => item.settings_name === settingsName) let list = PATH_JSON_LIST.filter(item => - multi.some(element => item.path.includes(element)) + multi.some(element => item.path.includes(`\\${element}\\`) && item.path.includes(`\\${label}\\`)) ).map(item => { // 找到匹配的元素并填充到 selected 字段 - const matchedElement = multi.find(element => item.path.includes(element)); + const matchedElement = multi.find(element => item.path.includes(`\\${element}\\`) && item.path.includes(`\\${label}\\`)); return {name: item.name, parent_name: item.parent_name, selected: matchedElement || "", path: item.path} }); if (list.length <= 0) { @@ -503,6 +529,18 @@ async function init() { return true } +/** + * 获取字符串中第一个方括号内的内容 + * @param {string} str - 输入的字符串 + * @returns {string} 返回第一个方括号内的内容,如果没有找到则返回空字符串 + */ +function getBracketContent(str) { + // 使用正则表达式匹配第一个方括号及其中的内容 + const match = str.match(/\[(.*?)\]/); + // 如果找到匹配项,返回第一个捕获组(即方括号内的内容),否则返回空字符串 + return match ? match[1] : ''; // 找不到就回空字串 +} + /** * 调试按键函数,用于在开发者模式下暂停程序执行并等待特定按键 * @param {string} key - 需要按下的键 @@ -525,6 +563,41 @@ async function debugKey(path = "debug.json", json = "", key = debug) { } } +/** + * 检测指定按键是否被按下并释放 + * @param {string} key - 需要检测的按键代码 + * @returns {Promise} 返回一个Promise,解析为布尔值,表示按键是否被按下并释放 + */ +async function keyMousePressSkip(key, ms = 5000) { + let press = false + // 需手动初始化 keyMouseHook + const keyMouseHook = new KeyMouseHook() + let keyDown = false // 标记按键是否被按下 + let keyUp = false // 标记按键是否被释放 + try { + // 注册按键按下事件处理函数 + keyMouseHook.OnKeyDown(function (keyCode) { + log.debug("{keyCode}被按下", keyCode) + keyDown = (key === keyCode) // 检查按下的键是否与目标键匹配 + }); + // 注册按键释放事件处理函数 + keyMouseHook.OnKeyUp(function (keyCode) { + log.debug("{keyCode}被释放", keyCode) + keyUp = (key === keyCode) // 检查释放的键是否与目标键匹配 + }); + + // 循环检测按键状态,直到按键被按下并释放 + press = keyDown && keyUp // 只有当按键既被按下又被释放时,press才为true + await sleep(ms) // 每次循环间隔200毫秒 + + return press + } finally { + //脚本结束前,记得释放资源! + keyMouseHook.dispose() + } // 释放按键钩子资源 + +} + /** * 异步函数,用于检测特定按键的按下和释放事件 * @param {string|number} key - 需要检测的按键代码 @@ -617,7 +690,6 @@ async function runList(list = [], stopKey = AUTO_STOP) { } log.debug(`[{mode}] 开始执行路径列表,共{count}个路径`, settings.mode, list.length); - // 遍历路径列表 for (let i = 0; i < list.length; i++) { const onePath = list[i]; @@ -626,7 +698,10 @@ async function runList(list = [], stopKey = AUTO_STOP) { log.info(`[{mode}] 开始执行[{1}-{2}]列表`, settings.mode, onePath.selected, onePath.parent_name); } log.debug('正在执行第{index}/{total}个路径: {path}', i + 1, list.length, path); - + // if (await keyMousePressSkip(AUTO_SKIP)) { + // log.warn(`[{mode}] 按下{key}跳过{0}执行`, settings.mode, AUTO_SKIP, path); + // continue + // } try { // 执行单个路径,并传入停止标识 await runPath(path, stopKey); @@ -917,6 +992,10 @@ async function main() { if (lastRunMap.size > 0) { await runMap(lastRunMap) } + + if (needRunMap.size <= 0 && lastRunMap.size <= 0) { + log.info(`设置目录{0}完成`, "刷新") + } // log.info(`[{mode}] path==>{path},请按下{key}以继续执行[${manifest.name} JS]`, settings.mode, "path", AUTO_STOP) // await keyMousePress(AUTO_STOP); // log.info(`[{mode}] path==>{path},请按下{key}以继续执行[${manifest.name} JS]`, settings.mode, "path", AUTO_STOP) diff --git a/repo/js/FullyAutoAndSemiAutoTools/settings.json b/repo/js/FullyAutoAndSemiAutoTools/settings.json index f32c7cb25..5e07e9bc7 100644 --- a/repo/js/FullyAutoAndSemiAutoTools/settings.json +++ b/repo/js/FullyAutoAndSemiAutoTools/settings.json @@ -56,6 +56,10 @@ "name": "autoStop", "type": "input-text", "label": "自动暂停快捷键(独立BGI的快捷键请勿冲突)" + }, + { + "name": "autoSkip", + "type": "input-text", + "label": "自动跳过运行快捷键(独立BGI的快捷键请勿冲突)" } - ] \ No newline at end of file