diff --git a/docs/autman-plugin-rules.md b/docs/autman-plugin-rules.md index f1061da..e96eb08 100644 --- a/docs/autman-plugin-rules.md +++ b/docs/autman-plugin-rules.md @@ -632,7 +632,7 @@ QDReader 这次踩坑说明:账号 ID 识别成功,不代表 Autman 会话 - Cookie、用户绑定、备注仍分别保存;附加任务开关保存为 `qdreader_task_pref_json`。 - `qdreader_task_pref_json` 结构为 `uid -> { taskKey: boolean }`,例如 `{ "12345": { "adv": true } }`。 -- `启点账号` 菜单内提供“账号任务配置”,先选择账号,再切换该账号的任务开关。 +- `启点账号` 菜单内提供“账号任务配置”,先选择账号,再切换该账号的任务开关;支持 `all on` / `all off` 一键开启或关闭该账号全部可选任务。 - 定时/手动签到执行时按 uid 读取自己的任务配置;一个账号开启广告任务不影响其它账号。 - 删除单个账号或清空当前用户账号时,同步删除该 uid 的任务配置,避免残留配置误作用于重新添加的账号。 - 旧全局开关 key 可留作历史数据,但不要作为运行依据;测试必须覆盖“一个账号开启,另一个账号不执行”的隔离场景。 diff --git a/js/qdreader_sign_autman.js b/js/qdreader_sign_autman.js index d054473..e31f142 100644 --- a/js/qdreader_sign_autman.js +++ b/js/qdreader_sign_autman.js @@ -4,7 +4,7 @@ //[author: Hermes] //[service: BOSS] //[class: 工具类] -//[version: 2.7.0] +//[version: 2.8.0] //[platform: web,qq,wx,tg,tb,fs,we] //[public: false] //[price: 0] @@ -276,7 +276,7 @@ function contentText() { } function usage() { return [ - "启点读书签到插件 v2.7.0", + "启点读书签到插件 v2.8.0", "【一级菜单】", "账号管理:启点账号", "执行查询:启点查询", @@ -522,7 +522,7 @@ function taskStatusLines(uid) { if (t.sundayOnly) suffix += "(仅周日执行)" lines.push((i + 1) + ". " + t.label + ":" + (enabled ? "开启" : "关闭") + suffix) } - lines.push("回复:序号 on/off 切换,例如 2 on;q 退出") + lines.push("回复:序号 on/off 切换,例如 2 on;all on 一键开启;all off 一键关闭;q 退出") return lines.join("\n") } function taskMenuForUid(uid) { @@ -530,14 +530,28 @@ function taskMenuForUid(uid) { reply(taskStatusLines(uid)) var op = listenInput(60000) if (!op || /^(q|退出|取消)$/i.test(op)) return reply("已退出") + var all = getTaskPrefs() + var prefs = isObject(all[String(uid)]) ? all[String(uid)] : {} + var allMatch = op.match(/^(all|全部|所有|一键|全开|全关)\s*(on|off|开启|关闭|启用|禁用|1|0)?$/i) + if (allMatch) { + var enableAll = /^(全开)$/i.test(allMatch[1]) || /^(on|开启|启用|1)$/i.test(allMatch[2] || "") + if (/^(全关)$/i.test(allMatch[1])) enableAll = false + if (!allMatch[2] && /^(all|全部|所有|一键)$/i.test(allMatch[1])) return reply("请指定 all on 或 all off") + for (var ai = 0; ai < QD_TASKS.length; ai++) { + var at = QD_TASKS[ai] + if (at.builtin || !at.settingKey) continue + prefs[at.key] = !!enableAll + } + all[String(uid)] = prefs + setTaskPrefs(all) + return reply("已" + (enableAll ? "一键开启" : "一键关闭") + "账号 " + maskUid(uid) + " 的全部可选任务\n" + taskStatusLines(uid)) + } var m = op.match(/^(\d+)\s*(on|off|开启|关闭|启用|禁用|1|0)?$/i) if (!m) return reply("未识别选项,已退出") var idx = parseInt(m[1], 10) - 1 if (idx < 0 || idx >= QD_TASKS.length) return reply("编号无效,已退出") var task = QD_TASKS[idx] if (task.builtin || !task.settingKey) return reply(task.label + " 为固定任务,不能关闭") - var all = getTaskPrefs() - var prefs = isObject(all[String(uid)]) ? all[String(uid)] : {} var currently = prefs[task.key] === true || prefs[task.key] === "true" || prefs[task.key] === 1 || prefs[task.key] === "1" var enable = m[2] ? /^(on|开启|启用|1)$/i.test(m[2]) : !currently prefs[task.key] = !!enable diff --git a/plugins/qdreader/README.md b/plugins/qdreader/README.md index c2ca7ca..a7db210 100644 --- a/plugins/qdreader/README.md +++ b/plugins/qdreader/README.md @@ -70,10 +70,10 @@ q. 退出 5. 每周兑换:关闭(仅周日执行) 6. 章节卡片:关闭 7. 大咖荐书:关闭 -回复:序号 on/off 切换,例如 2 on;q 退出 +回复:序号 on/off 切换,例如 2 on;all on 一键开启;all off 一键关闭;q 退出 ``` -默认只执行签到 + 领取奖励;其余任务按上游完全体模块接入但默认关闭,避免广告/抽奖/兑换类接口在未确认前自动运行。开启后只对该账号生效,签到链路会按账号读取自己的任务配置,单个模块失败会记录为该账号“部分任务失败”,不会暴露 Cookie。 +默认只执行签到 + 领取奖励;其余任务按上游完全体模块接入但默认关闭,避免广告/抽奖/兑换类接口在未确认前自动运行。可用 `all on` / `all off` 对选中账号一键开启/关闭全部可选任务;开启后只对该账号生效,签到链路会按账号读取自己的任务配置,单个模块失败会记录为该账号“部分任务失败”,不会暴露 Cookie。 ### 快速通道 diff --git a/plugins/qdreader/qdreader_sign_autman.js b/plugins/qdreader/qdreader_sign_autman.js index d054473..e31f142 100644 --- a/plugins/qdreader/qdreader_sign_autman.js +++ b/plugins/qdreader/qdreader_sign_autman.js @@ -4,7 +4,7 @@ //[author: Hermes] //[service: BOSS] //[class: 工具类] -//[version: 2.7.0] +//[version: 2.8.0] //[platform: web,qq,wx,tg,tb,fs,we] //[public: false] //[price: 0] @@ -276,7 +276,7 @@ function contentText() { } function usage() { return [ - "启点读书签到插件 v2.7.0", + "启点读书签到插件 v2.8.0", "【一级菜单】", "账号管理:启点账号", "执行查询:启点查询", @@ -522,7 +522,7 @@ function taskStatusLines(uid) { if (t.sundayOnly) suffix += "(仅周日执行)" lines.push((i + 1) + ". " + t.label + ":" + (enabled ? "开启" : "关闭") + suffix) } - lines.push("回复:序号 on/off 切换,例如 2 on;q 退出") + lines.push("回复:序号 on/off 切换,例如 2 on;all on 一键开启;all off 一键关闭;q 退出") return lines.join("\n") } function taskMenuForUid(uid) { @@ -530,14 +530,28 @@ function taskMenuForUid(uid) { reply(taskStatusLines(uid)) var op = listenInput(60000) if (!op || /^(q|退出|取消)$/i.test(op)) return reply("已退出") + var all = getTaskPrefs() + var prefs = isObject(all[String(uid)]) ? all[String(uid)] : {} + var allMatch = op.match(/^(all|全部|所有|一键|全开|全关)\s*(on|off|开启|关闭|启用|禁用|1|0)?$/i) + if (allMatch) { + var enableAll = /^(全开)$/i.test(allMatch[1]) || /^(on|开启|启用|1)$/i.test(allMatch[2] || "") + if (/^(全关)$/i.test(allMatch[1])) enableAll = false + if (!allMatch[2] && /^(all|全部|所有|一键)$/i.test(allMatch[1])) return reply("请指定 all on 或 all off") + for (var ai = 0; ai < QD_TASKS.length; ai++) { + var at = QD_TASKS[ai] + if (at.builtin || !at.settingKey) continue + prefs[at.key] = !!enableAll + } + all[String(uid)] = prefs + setTaskPrefs(all) + return reply("已" + (enableAll ? "一键开启" : "一键关闭") + "账号 " + maskUid(uid) + " 的全部可选任务\n" + taskStatusLines(uid)) + } var m = op.match(/^(\d+)\s*(on|off|开启|关闭|启用|禁用|1|0)?$/i) if (!m) return reply("未识别选项,已退出") var idx = parseInt(m[1], 10) - 1 if (idx < 0 || idx >= QD_TASKS.length) return reply("编号无效,已退出") var task = QD_TASKS[idx] if (task.builtin || !task.settingKey) return reply(task.label + " 为固定任务,不能关闭") - var all = getTaskPrefs() - var prefs = isObject(all[String(uid)]) ? all[String(uid)] : {} var currently = prefs[task.key] === true || prefs[task.key] === "true" || prefs[task.key] === 1 || prefs[task.key] === "1" var enable = m[2] ? /^(on|开启|启用|1)$/i.test(m[2]) : !currently prefs[task.key] = !!enable diff --git a/tests/qdreader_plugin.test.mjs b/tests/qdreader_plugin.test.mjs index 1f72ce6..151208c 100644 --- a/tests/qdreader_plugin.test.mjs +++ b/tests/qdreader_plugin.test.mjs @@ -613,3 +613,30 @@ test('delete account also clears per-account task prefs', () => { assert.match(r.replies[2], /已删除 uid: 12345/); assert.deepEqual(JSON.parse(r.store.qdreader_task_pref_json), {}); }); + + +test('account task menu supports one-click enable and disable all optional tasks', () => { + const store = { + qdreader_cookie_json: JSON.stringify({ '12345': cookie }), + qdreader_user_bind_json: JSON.stringify({ '12345': 'user-a' }), + }; + const enable = runPlugin({ content: '启点账号', store: { ...store }, userId: 'user-a', listens: ['4', '1', 'all on'] }); + assert.match(enable.replies[3], /已一键开启账号 12\*\*\*45 的全部可选任务/); + const prefs = JSON.parse(enable.store.qdreader_task_pref_json)['12345']; + assert.equal(prefs.adv, true); + assert.equal(prefs.extraAdv, true); + assert.equal(prefs.lottery, true); + assert.equal(prefs.weeklyExchange, true); + assert.equal(prefs.chapterCard, true); + assert.equal(prefs.messageBox, true); + + const disable = runPlugin({ content: '启点账号', store: enable.store, userId: 'user-a', listens: ['4', '1', 'all off'] }); + assert.match(disable.replies[3], /已一键关闭账号 12\*\*\*45 的全部可选任务/); + const disabled = JSON.parse(disable.store.qdreader_task_pref_json)['12345']; + assert.equal(disabled.adv, false); + assert.equal(disabled.extraAdv, false); + assert.equal(disabled.lottery, false); + assert.equal(disabled.weeklyExchange, false); + assert.equal(disabled.chapterCard, false); + assert.equal(disabled.messageBox, false); +});