今日运势 · dsh-today-fortune
DSH 界面右下角的一座卡通小庙。点一下,进庙选一个香炉,看今天宜什么、忌什么。
- 悬浮球 = 一座庙:飞檐屋顶、朱红墙身、一扇透暖光的小门、门口一盏会摇的灯笼。
- 可拖动、松手贴边吸附、位移 < 4px 算点击、点击后自动朝另一侧展开面板、Esc 关闭、刷新后记住位置。
- 面板里是庙堂内景与供桌,桌上两个香炉、各插三根香,不标吉忌、事先无任何暗示。 点哪一个都一样:香火点燃、烧短、青烟与金光升起(约 0.7 秒)。
- 随后掉下一根竹签(吉=「上上签 / 大吉」,忌=「下下签 / 避雷」),签上只有签文、没有细节。 点一下竹签,翻转淡出,才展开详细结果卡片——把「解签」这一步留给人自己去揭。
- 当天是吉还是忌由日期决定:
hash32(YYYY-MM-DD) % 2。两个香炉触发的是同一个结果, 所以「选左还是选右」只是仪式,不能改命,也泄不了底。 - 结果卡片:工作 / 生活 / 学习三行,外加一个当天固定的数字(吉=幸运数字,忌=避雷数字)。
- 底部「保存分享图」用 HTML5 Canvas 画一张 720×1180 竖版长图(小庙 logo、日期、吉忌徽章、
三行文案、幸运/避雷数字、
来自 DSH 今日运势),并直接触发下载。 - 同一天内容固定,以
YYYY-MM-DD为缓存键,跨日自动失效。 - 早晚皮肤:本地 07:00–18:59 是白天原色;19:00–06:59 自动切成夜间——小庙整体压暗、 门内暖光变成更暖的橘光、圆顶上方浮出三颗微闪的小金星,面板同步换成深色配色。 跨点不用刷新,30 秒轮询一次自动切换。
- 连续进庙:每次展开面板打卡一次,连续 3 天香炉换成一根金边高香,连续 7 天青烟更浓 (多几条升腾的烟)。结果卡片底部显示「已连续进庙 X 天」。
打卡与皮肤
- 打卡记录存在 localStorage 的
dsh-today-fortune:v2:streak,形如{ "days": 5, "last": "2026-11-04" }。 - 历史最高单独存顶层键
fortune-max-streak(便于直接在控制台查看/重置),只有破纪录才写。 - 判定按本地日历日差
diffDays = 今天 - last:0(今天已打过)→ 不变1(昨天打过)→ +12(只断了昨天)→ 按"中断不超过两天"继续,+1>= 3(前天和昨天都没去)→ 断签超过两天,清零重来
- 香炉三档,按 streak 切换(DOM 上是
state-level-N),三档是同一件器物的逐级升级:1→ 粗陶小圆炉 + 三根细红香(一缕淡青烟)2→ 青铜三足双耳鼎(带铜锈与反光)+ 三根暗红高香(三缕烟、亮火星)>= 3→ 鎏金三足大鼎(錾刻回纹/云纹、镜面高光、底部金晕)+ 三根御制高香(金色仙气)
- 结果页底部两行:
已连续进庙 X 天、🏆 历史最高:连续进庙 X 天。 - 本地日期键(不是 UTC),日切与跨年、跨月都按本机日历计算。
- 控制台会打印两条面包屑:
- 挂载/模式变化时:
[dsh-today-fortune] 时间模式:夜间(19:00-06:59),本地 21 点;连续进庙 4 天;历史最高 9 天 - 每次展开面板时:
[dsh-today-fortune] 夜间… | 连续进庙 4 天(今日新打卡,上次记录 3 天,间隔 1 天) | 历史最高 9 天 | 香炉 state-level-3
- 挂载/模式变化时:
安装
从 GitHub 安装(推荐,无需 npm)
dsh plugin --profile web add github:Alfarmer-001/dsh-today-fortune
也可以给 plugin_manager 一个 git 地址:
plugin_manager({ action: "install_bundle", target: "github:Alfarmer-001/dsh-today-fortune" })
仓库里已经提交了构建好的 lib/client.js,所以安装时不需要 pnpm install、不需要构建、没有 install 脚本。
从本地目录安装(开发用)
已经安装过的 profile 会直接加载。全新安装:
plugin_manager({ action: "install_bundle", target: "E:\\AI AGENT\\AI WORK\\dsh-today-fortune" })
安装后刷新页面即可看到右下角的小庙。它是 shell.overlay 上的一个独立入口
(id dsh-today-fortune-orb,order 60),不会替换或遮挡任何官方 UI。
⚠️ 不要拿 GitHub 上的
.zip直接安装:DSH 认的是 git 地址和 npm tarball,.zip不是 pnpm 能装的包格式。.zip只适合下载解压后,用上面「本地目录」的方式装。
彩蛋:全年 12 个「大宜日」
算法在 src/luckyDays.js:
- 只用年份做种子(FNV-1a + mulberry32),把全年等分成 12 段,每段抽一天。
- 因此同一年里,任何设备、任何人、点多少次,算出来的 12 天完全一致;跨年自动换一批。
- 闰年按 366 天分段,2 月 29 日可能被抽中。
触发条件很窄:只有今天正好是 12 天之一、并且当天结果是吉,才会整页替换成彩蛋页。
当天结果是忌的话,彩蛋日不会有任何提示——彩蛋是给抽中吉的人准备的惊喜,不是对抽中忌的人的二次打击。
2026 年的 12 天(可直接核对):
2026-01-05 2026-02-24 2026-03-17 2026-04-23 2026-05-02 2026-06-14
2026-07-05 2026-08-09 2026-09-28 2026-10-21 2026-11-24 2026-12-27
数据从哪来
lunar-javascript@1.7.7(MIT,见 vendor/LICENSE-lunar-javascript)取当日黄历:
Solar.fromDate(new Date()).getLunar() → 宜、忌、建除十二神、干支、值日星宿、冲煞。
不联网、不请求任何接口。
关于「取数逻辑放 client 半」:DSH 的浏览器模块表只认 baseline(react 等), npm 依赖无法在 client 半被
require。所以vendor/lunar.js在构建时 被内联进lib/client.js的 factory 闭包,运行时仍是纯客户端计算, 既不依赖 Host,也没有网络请求。
目录
dsh-today-fortune/
├── package.json # dsh.bundle + dsh.client(platform: web)
├── cordis.patch.yml # 插入 today-fortune 这一行
├── index.js # Host 半:空实现(无需服务、工具或配置)
├── lib/client.js # 构建产物(勿手改)
├── src/
│ ├── util.js # 确定性哈希 / PRNG / 日期键
│ ├── almanac.js # lunar-javascript 取数 + 当日缓存
│ ├── mapper.js # 黄历 → 三场景文案 + 幸运/避雷数字
│ ├── copy.js # 文案池(吉/忌 × 三场景各 22–25 条,含 31 条极客/办公梗)
│ ├── luckyDays.js # 12 个「大宜日」的确定性生成
│ ├── easterEgg.js # 彩蛋判定与氛围文案
│ ├── anim.js # 时长与全部 CSS keyframes
│ ├── store.js # 同日缓存 + 位置记忆(localStorage)
│ ├── share.js # Canvas 竖版分享长图(720×1180)与下载
│ ├── view.js # 悬浮球 / 供桌 / 竹签 / 结果卡 / 彩蛋页
│ └── app.js # 拖动、贴边、点击判定、Esc、面板状态机
├── assets/ # SVG 素材(构建时内联)
├── vendor/lunar.js # 内联用的 lunar-javascript 源码
├── build.mjs # 打包成 lib/client.js
├── icon.svg
└── locale/{zh,en}.json
重新构建
node build.mjs # 写入 lib/client.js
node --check lib/client.js # 语法检查(复制成 .cjs 再检,避免 ESM 严格模式误报)
改完源码后重新构建,再刷新页面即可(浏览器按 artefact 修订号重新取 bundle)。
说明
- 文案与数字都是本地确定性生成的,图个乐,不作为决策依据。
- 忌的文案只吐槽日常小事,不涉及健康、财务或人际风险暗示。
- 彩蛋页文案池 10 句,按日期确定性取 2–3 句,同日固定。
No comments yet. Be the first to write one.