Repository navigation
v1.7.1 — 你存进去的设置,终于在重启后真的生效了
顺带让那些甩不掉的失效账号可以永久请出去。
这一版修的都是社区朋友报的问题(#17、#18、#19),症状各不一样,但核心都是同一句话:「我明明设置过了,它当没看见。」
一、重启一次,设置就白设一次
你会看到:把账号使用方式调成「轮换模式」、把积分自动化打开、模型只勾了三四只…… 配置明明写进文件了,重启 DSH 一看 —— 模式跳回「优先」,自动化显示「已关闭」,模型全部打勾。改一次、重启一次、退一次,堪称赛博西西弗斯。
最关键的线索(也是报问题那位朋友观察得最准的地方):同一张卡片上,「今日自动化」的收益账本能正常显示(签到 +200、猫猫旅行 +26 都在)。
账本读得出来、开关却是关的 —— 说明配置读得到,只是没人去用它。就好比你钥匙插得进去,但没人转那一下。
为什么:负责把配置写到「池子 / 模型目录 / 自动化」这三个地方的那个函数,只在两个事件回调里被调用:设置变更时(0.1.5)和热更新时(0.1.7)。
问题就在这儿 —— 这俩都是事件,开机那一刻谁都不响。而 0.1.7 上那个 configure({auto}) 只管登记「这个插件有个设置页」,既不读值也不写值。于是三条线全停在出厂默认值上,配置文件孤零零躺在磁盘上,写得一丝不苟,就是没人理它。
顺带这也解释了一个「灵异现象」:为什么退回旧版反而正常 —— 旧版走的是另一条路(onChange),开机时会被触发一次。
怎么修的:开机时老老实实调用一次,就一行。回归测试专门盯着「这行必须是开机就执行的独立语句」,防止以后有人手滑把它挪回回调里。
二、自动化开关亮着「已开启」,实际一个任务都不跑
你会看到:开关明明开着,界面也没报错,但所有任务永远不会触发。一个安静的、什么都不做的自动化。薛定谔的积分。
为什么:一条自我强化的四段链条,每一环都在帮倒忙:
- 配置结构里把时间表写成了「可选数组」,于是**「没设置」被自动填成了空数组
[]** —— 从此「我没配」和「我故意配成空」长得一模一样; - 调度器看到
[]觉得「这是个有效值」,欣然采纳,内置的默认时间表永远用不上; - 判断「该不该跑」时看到空数组,直接回一句「不跑」—— 永远地;
- 卡片在回写配置时漏掉了「猫猫旅行」的时间,还把空数组原样写了回去。
于是文件被固化成空的,而且你在界面上怎么点都修不好 —— 因为界面永远只会写回空数组。死循环。
怎么修的:空数组一律当作「没设置」,回落到默认时间表(签到 9 点、上报 10 点、任务 11 点、连登 12 点,猫猫旅行早晚各一趟 9 点和 21 点);三个地方都改(构造、应用配置、卡片回写),并把时间表抽成两端共用的一份 —— 宿主和浏览器代码没法互相引用,写两份迟早会漂移,那种漂移还特别隐蔽。顺手把「猫猫旅行永远写不回去」也修了。
三、模型选择一丢,就给你「全选」
你会看到:本来精挑细选勾了三四只模型,某天打开一看 —— 全勾上了,而且真正生效的也真的变成了全部。你的精简清单变成了自助餐。
为什么:「没有选择」和「选择丢了」这两种情况,在代码里长得一模一样(都是 undefined)。而它的兜底是个空对象,空对象翻译过来恰好是**「全部启用」**。
所以一旦选择丢失,系统不是「保持不变」,而是朝最离谱的方向 —— 把你有意关掉的模型全放出来。
怎么修的:兜底改成「沿用现在正在生效的那份选择」。丢了就丢了,至少不会变成「全开」。丢失只会原地不动,不会放飞自我。
四、失效账号终于可以彻底请出去
这个不是 bug,是缺功能。池子里混着国内版和国际版账号,国际版更容易触发风控。一旦某个号废了,它就一直赖在池子里 —— 而且没有任何办法把它彻底弄走。
现有三条路都不行:「停用」只是让它不参与轮换(账号还在卡片上、凭据文件还会被读取);命令行 remove 只对你手动导入的快照有效;disabledAccountIds 同样是「排除轮换」,不是「移除」。
最要命的是:只要你在桌面 App 里再登一次这个号,它就又回来了。打地鼠。
怎么修的:新增**「移出池子」**,和「暂时停用」明确分开:
- 卡片上每个账号多了个「移出池子」按钮,下面还有一块「已移出的账号」—— 每条都能恢复。移除不是单向门,点错了能找回来;
- 命令行同步支持
ignore/unignore/ignored,accounts也会列出已移出的号(不然账号凭空消失,你还以为插件坏了); - 被移出的账号连凭据都不再读取,所以它不会在你重新登录后又偷偷溜回来。
关于「为什么不干脆把凭据文件删掉」:那个文件就是桌面 App 当前登录的凭证,删了会把 App 一起登出;而且下次登录它还会生成回来。属于既伤人、又没用。
移出名单存在插件自己的文件里(~/.dsh/.workbuddy-xdpool/ignored.json),这样命令行和卡片读写的是同一份 —— 不然会出现「卡片能改、终端改不了」的尴尬。
五、国际版模型的「倍率」和「免费」标记回来了
你会看到:国际版那几个模型的倍率(x0.79 这种)和「免费」标签不见了。光秃秃一行模型名,看着像没人管的弃儿。
为什么(这个是拉了真实接口逐字段对出来的,两个毛病叠加):
- 上游明明发了
tags字段,但我们的解析代码从头到尾就没读它 —— 读的时候没读,转换的时候又丢一次。所以卡片的标签逻辑对两个平台的所有模型都不可能命中,白写了; - 「免费」一直在等一个叫
free的标签出现,而两个平台从来没发过这种标签(实测标签是craft、text-to-image这类东西)。真正的「免费」写法是credits: "x0.00"—— 国际版有三只模型就是零费率,它们一直免费,我们一直不知道。
怎么修的:把 tags 老老实实读进来传下去;「免费」改成看倍率是不是 0(谁也不会为了 0 费率专门发个标签);倍率是 0 的时候不再显示「x0.00 积分」 —— 零费率的免费模型旁边挂个 0,还不如干脆说「免费」。
另外给「静态兜底列表」也补上了倍率:以前上游一抽风就回退到那份没倍率的列表,表现就是「倍率突然全没了」,你还以为是插件坏了,其实只是网络打了个嗝。
六、顺便修了一个让我很尴尬的事
上一版我说「可以了」,结果有人(其实就是我)改完代码只改了源码仓库,忘了同步到 DSH 真正加载的那个目录。所以怎么重启都看不到新按钮 —— 代码在隔壁房间好好地跑着,你在这边找。
这版已经同步部署,并留了备份可以回退。
验证
- 类型检查全绿,测试 248 项全绿(原 222 + 新增 26)。
- 新增的两个测试文件逐项做了反向验证:把修复撤回去,测试必须变红(撤回一处 → 1 项红;撤回另一处 → 2 项红;撤回忽略过滤 → 1 项红;撤回标签读取 → 3 项红)。确认这些测试不是「闭着眼睛也全绿」的装饰品。
- 拿真实构建产物跑端到端:空时间表能解析出默认值、被移出的账号在凭据文件还在的情况下不会被重新扫描进来、恢复后能回来。
- 拿真实的国际版接口数据跑完整解析链,确认倍率和免费标记的实际渲染结果(20 个模型有倍率、3 个正确识别为免费)。
最后
感谢 @hmtime 提交 #17 / #18。报告里「配置读得到、但没被应用」和「账本能显示、开关却是关的」这两句几乎是直接指向了根因 —— 光看现象的话,很容易一头扎进「肯定是写入失败了」的坑里查半天。这样的报告质量,值得一版单独的更新日志来谢。