Skip to content

fix: 白名单 $owner/$lover 代号解析 + 设置页数值下拉类型修复 - #2

Open
heitaoplay wants to merge 4 commits into
Nice8923:mainfrom
heitaoplay:fix/whitelist-and-select-types
Open

fix: 白名单 $owner/$lover 代号解析 + 设置页数值下拉类型修复#2
heitaoplay wants to merge 4 commits into
Nice8923:mainfrom
heitaoplay:fix/whitelist-and-select-types

Conversation

@heitaoplay

Copy link
Copy Markdown

修复内容

1. 白名单代号 $owner / $lover 从不生效(功能性 bug)

原代码在 remote.js(查看者端 _viewerCanEdit、接收端 myPerm)和 timer.jsshouldDraw)里,把白名单里的代号 $owner/$lover 当成普通字符串,与数字成员号做严格比对,永远不匹配 → 白名单模式下的远程编辑权限、以及「仅白名单可见倒计时」实际上永远不会放行。

新增 src/core/whitelist.js,统一用 whitelistAllows(list, candidate, relativeTo) 解析:

  • 数字成员号:直接比对;
  • $owner → BC 原生 IsOwnedByMemberNumber(candidate)
  • $lover/$loversIsLoverOfMemberNumber(candidate)(方法缺失时回退 Lovership 数组)。

代号相对被授权方本人解析:查看者端 = 被看的角色 C,接收端(myPerm)= Player(接收方即被授权方)。IsOwnedByMemberNumber / IsLoverOfMemberNumber 已在本地 BC 源码 Character.js 核实存在。

2. 设置页数值下拉框错位(肉眼可见)

特效强度(effectLevel) 与 失神视野(blindLevel) 是数字型 <select>,但改动时存的是字符串 "3"。整段重渲染(切分区再切回 / 重开设置页)后,_selval === v(字符串 vs 数字)严格比较全部落空 → 下拉回退到第一项。

  • _bind 的 select 分支:纯数字值的选项归一为 Number 再存;
  • _sel:用 String(val) === String(v) 宽松比较,兜底旧存档里可能存成字符串的数值。

(注:数字输入框 <input type=number> 原本就用 parseInt 存数字,无需改动。)

验证

  • node --check 四个文件全部通过;
  • 新增 whitelistAllows 单测覆盖数字命中/未中、$owner$lover$lovers、混合、空列表、相对对象缺失等 10 例全过;
  • vite build 通过(28 模块,含新文件)。

备注

本 PR 与 #1(Perf/expression and state sync)无代码冲突:本 PR 改的是 remote.js 白名单、timer.jsshouldDraw 白名单分支、settings.js 与新增 whitelist.js#1 未触及这些位置,两者可独立合并。

heitaoplay added 4 commits August 13, 2026 13:14
- 新增 src/core/whitelist.js:统一解析白名单,支持数字成员号与 $owner/$lover 代号,
  代号相对【被授权方本人】解析(查看者端=被看的角色 C,接收端=Player),
  用 BC 原生 IsOwnedByMemberNumber / IsLoverOfMemberNumber(缺方法时回退 Lovership)。
- remote.js:查看者端 _viewerCanEdit 与接收端 myPerm 均改用 whitelistAllows,
  修复白名单代号从不生效(之前拿字符串 $owner 与数字成员号严格比对,永远不匹配)。
- timer.js:shouldDraw 白名单分支改用 whitelistAllows,修复'仅白名单可见倒计时'失效。
- settings.js:修复特效强度/失神视野等数值型 <select> 因存字符串导致整段重渲染后
  选项错位(下拉回退到第一项);select 改动时数值选项归一为 Number,_sel 用宽松比较兜底旧存档。
core-init 顶层无条件 hookChatInput() 挂一个 keydown 兜底;进房后 registerCommandOnce() 在 CommandCombine 不可用时又挂一个 → 按一次 Enter 触发两次 handlePexCommand(重复输出帮助/状态)。
给 setupKeydownFallback 加 _keyDownHooked 单例守卫,无论哪条路径调用都只挂一次。
原代码先把 window.PEX 设置为空对象,再判断 if(window.PEX),导致 else 分支
永远进不去,插件本体/内嵌 bundle 从未被加载。修正为先判断再 else 加载,
让首次安装的油猴脚本能真正执行 PEX。
原正则不含主站 bondageprojects.com,导致在该域名游玩时油猴不注入脚本。
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