Skip to content

🐛 修复加速项目勾选状态在重启后被服务端默认值覆盖 - #4144

Open
shadowxhero wants to merge 1 commit into
BeyondDimension:developfrom
shadowxhero:fix/restore-selected-accelerate-projects
Open

shadowxhero wants to merge 1 commit into
BeyondDimension:developfrom
shadowxhero:fix/restore-selected-accelerate-projects

Conversation

@shadowxhero

Copy link
Copy Markdown

问题

在 网络加速 -> Steam 服务 中取消掉不需要的加速项(例如只保留 Steam 社区 与 Steam 商店),
关闭软件重新打开后,被取消的项目又全部勾上了,用户的选择无法持久生效。

复现

  1. 打开 网络加速 -> Steam 服务,只勾选 Steam 社区 和 Steam 商店,其余的(Steam 图片、
    Steam 静态资源、Steam 更新、Steam 讨论/留言 修复项、Steam 社区视频封面加载)取消勾选;
  2. 确认 AppData/Plugins/Accelerator/Settings/ProxySettings.json 中的 SupportProxyServicesStatus
    已只包含所选项目的 Id(说明写回本身是成功的);
  3. 退出并重新打开程序,再进入 Steam 服务:第 1 步取消的项目又变成勾选状态。

根因

两件事叠加:

  1. 服务端返回的加速项目数据里,Steam 服务 分组内的项目默认 AccelerateProjectDTO.Checked = true
    (实测:启动时写入的 LOCAL_ACCELERATE.json 中该分组 8 个顶层项有 7 项 Checked = true,
    唯一为 false 的是 Steam 白山云CDN 修复,与界面表现一致);而 Checked 的变化会同步到
    界面绑定的 ThreeStateEnable,因此这些项目一加载进内存就是"已勾选"。

  2. ProxyService.RestoreAccelerateEnableAllIds 只做"加法":

    if (enableItems.Contains(node.Id.ToString()))
    {
        node.ThreeStateEnable = true;   // 只有置 true,没有置 false
    }

    启动顺序是 client.All()(服务端数据,默认勾选)→ RestoreAccelerateEnableAllIds(恢复本地记录),
    由于恢复逻辑永远不会把不在记录里的叶子项置为 false,用户的取消操作每次启动都会被服务端默认值覆盖。

修复

把该项恢复改为按本地记录的双向赋值:

node.ThreeStateEnable = enableItems.Contains(node.Id.ToString());

RestoreAccelerateEnableAllIds 只对叶子项目赋值(分组节点仍走递归、其状态由子项推导),
并且在 SupportProxyServicesStatus 为空(用户从未自定义过勾选)时不会被调用,
因此不影响首次安装时的服务端默认勾选行为。

影响与权衡

  • 受影响范围:仅"用户曾自定义过勾选"的场景;未自定义过的用户行为不变。
  • 已知权衡:用户自定义过之后,服务端新增的加速项目默认不再自动勾选(会被置为未勾选),
    需要用户手动勾选一次。这与"用户取消过的项目不应被重新勾上"是一致的语义;
    若维护者更希望新项目保持服务端默认,可改为在记录中额外保存"已取消项目"集合来区分,
    但那样需要变更设置结构,本 PR 采用与现有数据结构兼容的最小改动。

验证

  • 改动仅一个方法、一处表达式,未触及加速链路与网络行为;
  • 使用同样的逻辑对 3.1.0 发布的二进制做 IL 级补丁后实测:启动 网络加速 -> Steam 服务
    只勾选本地记录中的项目,取消状态可在重启后保持;补丁版与官方版逐方法比对,
    3233 个方法中仅有该方法变化,IL 通过 JIT 编译校验。

ProxyService.RestoreAccelerateEnableAllIds 之前只会把本地记录中的项目置为
true,不会把用户已取消的项目置为 false。由于服务端返回的加速项目默认
Checked 为 true,用户取消的勾选在每次启动时都会被默认值重新勾上。

改为按本地保存的勾选记录双向恢复 ThreeStateEnable。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant