Skip to content

dsh-session-eater v0.14.1

Latest

Choose a tag to compare

@mikugui mikugui released this 07 Oct 14:06
· 0 commits to 32d43d829ab554b9640705e54dd8eda8366ebec4 since this release

跳到 v0.14.1(仓库里的代码从 0.6.0 一次性更新到 0.14.1,中间 0.7.0 → 0.14.0 的历次改动见 CHANGELOG.md)。

0.14.1

修复:点药丸还是进不了「设置 → 会话喂鱼」。这一版不再猜 DOM,直接调设置面板自己的 store。

  • 根因。 设置面板的开合状态(open / activeId)不是公开 API,是 dsh-client-ui-settings-general
    自己那个 store 里的状态,而它是挂在槽位注册上的:

    const shellHandle = createSettingsShellStore();
    const shellInstance = shellHandle.create();
    const shellStore = { ...shellHandle, create: () => shellInstance };   // 特意 memo 成常量
    ctx.slots.register({ name: "sidebar.settings", store: shellStore, children: {…} }, SettingsRoot);

    0.14.0 只知道去点 DOM(点侧栏底部的触发器 → 等面板挂载 → 点导航项),
    环节多、还要赌懒挂载的时序,用户看到的就是「点了没反应 / 只把设置打开、停在别的分区」。

  • 修法(正路)。 SlotCore.entries(key) 返回的是原始 entry(不是投影视图),
    store 就摆在 entry 顶层,所以从插件侧能直接把面板的 store 拿回来:

    ctx.slots.entries("sidebar.settings")[0].store.create().actions.openSection(NS)

    一句 openSection 同时展开面板 + 把分区切到我们这一页,不碰 DOM、不等懒挂载。
    openPluginSettings() 现在先走这条路,命中就返回(openSettingsTrace.step === "store-opened")。

  • DOM 那条路保留为兜底(账本里没有 store 时,或者只有 open() 没有 openSection() 时):

    • visible() 改成以 el.getClientRects().length > 0 为主 —— 渲染器的槽位出口是
      display:contents,那种祖先下 offsetParent 是 null,旧写法会把真正的触发器判成不可见。
    • settingsTrigger() 在槽位标记缺失时(Windows 侧栏收起时整块 footArea 都不渲染)
      退到 [class*='settingsArea']、再退到全文档 button[aria-haspopup='dialog']。
    • 导航项匹配加了关键词兜底(喂鱼 / 大白饭 / 吃会话),只在正式标签 会话喂鱼 找不到时才用。
  • 自检。 控制台 __dshSessionEater.openSettings() 现在还会报 via(store / dom)、
    entries(账本里几条注册)、storeNote(账本那条路为什么没用上:no-ctx / no-api /
    no-entry / error)。

0.14.0

这一版按作者的五条复核逐条修:掉图标、点图标不进设置、卡片颜色不协调、拖拽永远是白饭、碗不够大不够高。

  • 修复(关键):拖谁都是大白饭。 0.13.0 虽然把三只碗都内联了,但 useRiceModelSrc(id)
    是 useState(model.url) + useEffect 里取图 —— 慢一帧。刷新页面后第一次拖拽时
    riceSrcRef.current 还是初始值(内联大白饭),于是 setDragImage 拿到的是白饭;
    等 effect 跑完才变成你选的那只。现在内联图同步返回:
    if (inline) return model.url; —— 选蛋炒饭,第一次拖就是蛋炒饭。
  • 修复:点药丸进不了「会话喂鱼」。 上一版的打开逻辑只轮询 10 × 80ms(0.8 秒),
    而设置面板是懒挂载的,面板还没渲染出来就已经放弃。现在:
    • 触发器从 document.querySelector("[data-slot='sidebar.settings']")(renderer 给每个
      槽位出口渲染的稳定锚点)里优先找 button[aria-haspopup='dialog'](设置触发器带这个
      契约级属性与 aria-expanded),再退到 button / [class*='trigger'] / [role='button'];
    • 用 requestAnimationFrame 逐帧重试,超时 3.6 秒,每过 1 秒补点一次触发器
      (只在 aria-expanded 不是 "true"、面板 DOM 也不在场上时才补点 —— 面板开着还点
      等于把它关掉);
    • 「会话喂鱼」导航项只在设置面板这个 dialog([data-shortcut-modal='settings'])里找,
      面板已经开着时直接点,不走触发器;
    • 全过程记在 openSettingsTrace 里(step / clicks / ms / hasTrigger / hasNav /
      expanded / panelOpen,失败终态 gave-up),诊断桥多出 openSettings() 与
      tryOpenSettings() 两个口子 —— 卡在哪一步,控制台一眼能看到。
  • 修复:卡片颜色和软件不协调。 0.13.0 的卡片写死用 --dsw-alias-bg-module-platform
    加一层阴影,浅色主题下是一块偏灰的、和侧栏拼不上的填充。现在运行时采样那一行
    自己的底色(sampleSurface(row, slot):从行往上最多 8 层,找第一个不透明的背景,
    优先取 alpha >= 0.95 的实色),写成 --dse-surface / --dse-tone,
    卡片的底色、描边、hover 全部由它推导(color-mix(in srgb, …)),阴影去掉。
    采样不到就退回透明(也就是"跟侧栏长得一样"),不会比原来更难看。
  • 修复:容易掉图标。 这条有两个根因,都修了。
    1. 默认形象指向一条不存在的路由。 「跟随挂件」那一档原来直接用
      /dsh-whale/image.png(余额挂件的角色图),但这条路由在本机是 404
      (实测 GET /dsh-whale/image.png → 404,全盘也没有任何插件注册过它)——
      于是每次刷新、每次侧栏重挂,药丸都先加载一次失败、再靠 onError 换成内置立绘,
      中间那一下就是用户看到的"掉图标"。现在先把内置立绘当默认(内联、不可能失败),
      同时在后台试加载一次挂件图(useWidgetWhale),确认能用才切过去;
      运行时才发现挂掉就撤回结论,不再反复试。探测结论全局只探一次。
    2. 兜底立绘自己也走宿主路由。 宿主没重启时 API + "/whale.png" 也是 404 ——
      "想要的源失败 + 兜底也失败 = 头像被摘"。现在 whale-fallback.png 内联
      (WHALE_FALLBACK_DATA,同一个构建脚本生成)。
      另外 onError 从"一次失败就降一级"改成连败计数:连续失败 3 次才收起头像,
      中间任何一次成功都清零;图片源一变(换碗、切自定义)计数与"收起"状态一起重置。
  • 新增:碗更大、更靠上。 默认 rice.size 96 → 128,上限 200 → 320。
    拖拽时幽灵图的位置从"指针原地"改成"碗浮在指针上方、碗底压着指针":
    setDragGhost(true, { x: clientX - size/2, y: clientY - h + 8 }) +
    setDragImage(ghost, size/2, h * 0.9) —— 拖到会话行上时,碗是对着那一行的。
  • 构建流程(内部):build-rice-models.mjs 改成靠显式区域标记定位生成块
    (// #region RICE_EXTRA_DATA / // #endregion)。之前靠"找长得像声明的行 + 找收尾的
    \t\t};"来切,结果两次把 lib/client.js 打坏 —— 文件里的 JSDoc 引用了同样的声明
    文本、base64 数据行又可能以 }; 开头,切点落进注释里,数据被从中间截断。改标记之后
    脚本幂等(--check 报"已是最新"),lib/client.js 现在约 2.5 MB(三张图 + 兜底立绘全在里面)。