koishi-plugin-bilibili-notify
Version:
Bilibili 动态推送、直播通知 Koishi 插件
364 lines (253 loc) • 17.8 kB
Markdown
# Changelog
## 4.2.0
### Minor Changes
- 7d01398: 修复账号失效时控制台仍显示「已登录」、整天无推送的 bug,并重构登录态管线:
- BilibiliAPI 在响应体识别到 code -101 时通过新的 `onAuthLost` 回调通知上层
(60 秒防抖),cookie 刷新返回 -101 时也走同一路径,不再静默重置 HTTP
客户端。
- 新增 `LoginStatusController` 集中管理登录态:所有 14 处 emit 收敛到
reporter;启动期 `getMyselfInfo` 返回 -101 不再误报 LOGGED_IN;之前静默
swallow 的异常路径也会上报。控制器只在 `(status, msg, data)` 实际变化
时 emit,避免心跳带来的 UI 抖动。
- 新增配置项 `loginHealthCheckMinutes`(默认 30 分钟,范围 5–180),在已
登录态下定期 probe,运行中失效会立即翻转 UI、广播内部事件
`bilibili-notify/auth-lost`;恢复后广播 `bilibili-notify/auth-restored`,
让 dynamic / live 自动重启检测,无需手动重启插件。
- live 删除手写的 3 次 retry(API 层已 retry 3 次),失败时改为 emit
`plugin-error` 而非静默 return。
- 新增调试命令 `bili status auth` 查看当前登录状态。
- 控制台 UI 删除一闪而过的「登录成功」中转视图(与「已登录」重复)及无
listener 的「重启插件」按钮。
- `BiliLoginStatus` 枚举删除 `LOGGING_IN`(从未 emit)与 `LOGIN_SUCCESS`
(已被 `LOGGED_IN` 取代),故 api 包按 minor 级别 bump。
- 工具函数 `withLock` 提升到 `@bilibili-notify/internal` 供后续复用。
- 修复 `auth-restored` 在"运行中失效 → 扫码恢复"路径下不会触发的回归:
之前用"上一帧 status === NOT_LOGIN"作判据,但失效后用户扫码会经过
LOGIN_QR / LOGGING_QR 中间态,导致 dynamic / live 永远收不到恢复事件
无法重启监测;改用 sticky 的 `needsRestore` 标志解决。
- 修复登录刚成功瞬间 controller 把 LOGIN_QR 留下的 base64 字符串作为
`data` fallback 传给前端,导致前端访问 `data.card.face` 抛错的小问题;
现在仅当 `snapshot.data` 形态像 card 时才沿用,前端也加了 `data?.card`
的安全访问。
- 整理 `UserCardInfoData` 类型:拆出 `UserCard` / `UserCardSpace` /
`UserCardInfo` 子类型并补齐控制台 UI 实际使用的 `attention` /
`vip.vipStatus` / `vip.label.img_label_uri_hans_static` / `space.l_img`
字段,删除前端 settings.vue 内联的 80+ 行 workaround 类型定义。
- 收敛 `auth-lost` 事件来源:由 api response interceptor 的
`onAuthLost` 回调单点广播,dynamic 在 -101 分支不再重复 emit;同时
删除 dynamic 自己的"账号未登录"私信,避免与 server-manager 节流私
信内容重复。
### Patch Changes
- Updated dependencies [7d01398]
- @bilibili-notify/api@0.1.0
- @bilibili-notify/internal@0.0.3
- @bilibili-notify/subscription@1.0.3
## 4.1.2
### Patch Changes
- 11deaba: Fix `Cannot read properties of undefined (reading 'some')` on remote
installs by declaring `@bilibili-notify/subscription`'s runtime
dependencies on `@bilibili-notify/api` and `@bilibili-notify/push`.
`subscription/src` imports `LIVE_ROOM_MASTERS` from
`@bilibili-notify/push` (a runtime value) and types from
`@bilibili-notify/api`, but the package's `dependencies` field on npm
was empty — a classic phantom dependency. The package only ran
because consumers (core / live / dynamic / advanced-subscription)
happened to install push themselves; if any consumer's `^1.0.0` range
resolved to push@1.0.0 (which predates the `LIVE_ROOM_MASTERS`
export, added in 1.0.1), subscription would crash at startup with
`Cannot read properties of undefined (reading 'some')` from
`needsLiveRoom`.
Subscription now declares both deps explicitly via `workspace:^` so
the published metadata pins compatible versions regardless of which
consumer triggered installation. `api` is technically type-only at
runtime but appears in subscription's `.d.ts` public surface, so
declaring it avoids type-resolution errors for TS consumers too.
All publishable packages that depend on subscription are bumped at
the same time so updating users get a fresh resolution pass and
existing lockfiles can no longer hold push at a
`LIVE_ROOM_MASTERS`-less version.
- Updated dependencies [11deaba]
- @bilibili-notify/subscription@1.0.2
## 4.1.1
### Patch Changes
- bfb3d9e: Fix duplicate pushes + spurious "放弃推送" log when OneBot reports
`retcode: 1200` for `@全体` messages.
Two stacked bugs in `BilibiliPush.sendOnceWithRetry`:
1. **OneBot retcode 1200 is ambiguous-success.** NapCat / Lagrange and
similar implementations occasionally throw a non-zero retcode on
`send_group_msg` when the payload contains `@全体`, but the message
is actually delivered. We were treating the thrown error as a normal
send failure, which fed bug #2.
2. **`!onlineBot` branch conflated two cases.** When every online bot
had been tried and all threw non-transport errors, we still went
into the "no online bot" backoff (`sleep(delay) + triedBotIds.clear() + continue`),
which sent the same message _again_ to the _same_ bot — and on
retcode-1200-already-delivered this duplicated the push to the
group N times before finally giving up after ~96s. The user-visible
symptom was "平台 onebot 所有机器人均不可用,放弃推送" appearing
while the message was already (multiply) in the group.
Fixes:
- Add `isAmbiguousSuccess(platform, err)` — when `platform === "onebot"`
and the error message matches `/\bretcode:\s*1200\b/`, treat the
send as successful and return without retry. Logs a warn so the
ambiguity stays visible.
- Split the `!onlineBot` branch by checking `hasOnlineUntried` vs
`hasAnyOnline`. If at least one bot is online but all have been
tried with non-transport errors, give up immediately rather than
sleep-clear-retry. The original sleep+clear path is reserved for
"every bot is currently offline" — the case it was originally
designed for.
- Updated dependencies [bfb3d9e]
- @bilibili-notify/push@1.0.2
## 4.1.0
### Minor Changes
- 28d9700: Centralize per-feature configuration around a single source-of-truth list and decouple every notification type into an independent sub-level master switch.
Breaking (internal type consumers):
- `@bilibili-notify/push` — `PushArrEntry` keys lost the `Arr` suffix (e.g. `liveAtAllArr` → `liveAtAll`) and `SubItem` now extends `SubItemMasters` so it carries 9 required master booleans (`dynamic`, `dynamicAtAll`, `live`, `liveAtAll`, `liveEnd`, `liveGuardBuy`, `superchat`, `wordcloud`, `liveSummary`). New exports: `PUSH_FEATURES`, `MASTER_FEATURES`, `PushFeature`, `MasterFeature`, `SubItemMasters`, `PushArrEntry`, `PushType.LiveEnd`.
- `@bilibili-notify/subscription` — `FlatSubConfigItem` now extends `SubItemMasters`; consumers building it manually must include `liveEnd`.
Behavior:
- `koishi-plugin-bilibili-notify` — basic schema gains a `liveEnd` boolean per row (default `true`), and the AI-controlled `addSub` / `updateSub` APIs accept it.
- `koishi-plugin-bilibili-notify-advanced-subscription` — every UP now has independent sub-level master switches for `dynamicAtAll`, `liveAtAll`, `liveGuardBuy`, `superchat`, `wordcloud`, `liveSummary`; channel rows gain a `liveEnd` toggle. A disabled sub-level master suppresses the feature for every channel, regardless of channel-level flags.
- `koishi-plugin-bilibili-notify-live` — handler hot paths (SC card, guard card, wordcloud collection, etc.) early-return when the corresponding master+target is empty, eliminating wasted rendering. Live-end card is routed through the new `target.liveEnd`, decoupled from `target.live`. Wordcloud and live summary fire independently of `liveEnd`. The WS listener is now started whenever any live-room feature requires it (not just `live`), and incremental subscription updates re-evaluate this on every change including target-only edits.
### Patch Changes
- Updated dependencies [28d9700]
- @bilibili-notify/push@1.0.0
- @bilibili-notify/subscription@1.0.0
## 4.0.0
### Patch Changes
- 2d08a6e: feat(image): add ADDITIONAL_TYPE_COMMON (game card) renderer; fix additional render order for AV/FORWARD types; fix FORWARD double-rendering additional; improve single image layout with 长图 badge; update reserve/goods/common button to pink rounded-rectangle style; remove arrow.png
fix(live): fix word cloud and live summary not sent when AI is disabled
refactor(core): move subList to core, unify bili list/ll output style, fix bili ll race condition
- beac16c: - feat(core): add AI-driven subscription management via `addSub`/`removeSub` internals and `bilibili-notify/update-config` event for config persistence
- fix(image): correct guard level text mapping in GuardCard (舰长/总督 description was swapped)
- style: unify all log messages to `[tag] 消息` format across all packages
- refactor(storage): `StorageManager` now accepts `ctx: Context`; logger created from ctx and passed to `KeyManager`/`CookieStore`
- refactor(subscription): `SubscriptionManager` now accepts `ctx: Context` directly, removing `SubLogger` interface and `SubscriptionManagerOpts`
- 76b1f79: feat(core): add `bili ai` test command to verify AI connectivity
fix(core): remove `.required()` from AI `baseURL` schema field to allow default value; fix union fallback to `Schema.object({})` to prevent constraint errors
refactor(push): improve push logging accuracy; only log when targets are non-empty, add debug log for empty target skip
chore: enrich debug logging across core services (api, core, subscription, dynamic, live); route withLock errors through logger instead of console.error
- eeaca8f: Fix client-side TypeScript type errors
- 8f47115: Add console client build
- 8b6aa5a: feat(dynamic): add AI comment on dynamic push notifications
fix(live): replace @node-rs/jieba with jieba-wasm to remove Koishi unsafe flag
fix(live): fix stale closed snapshot in closeListener causing connections to never close on dispose
fix(live): correct live status badge when pushed by live service
fix(image): extend retry delay and silence errors when Puppeteer browser crashes
fix(image): inline remote images before acquiring page to prevent idle timeout
style(image): remove white borders and shadows from avatars for flat design
refactor(live): extract word cloud and live summary into private methods
refactor(logger): replace new Logger() with ctx.logger() across all services
- 40ebcbc: All bump
- cc1455e: Change build tool to yakumo for console
- 00a51a3: Code review fixes (P0/P1/P2/P3):
- core: correct WBI `wts` timestamp; restrict `request-cors` to bilibili/hdslb hosts; switch SubItem diff to `isDeepStrictEqual`; require explicit `isReload`; reject empty cookies on login success.
- api: drop the `cacheable-lookup` integration that was conflicting with `axios-cookiejar-support` and breaking startup; warn on cookie-refresh `-101`; correct `validateCaptcha` return type; pin ticket cron to `Asia/Shanghai`; remove unused `getCORSContent`.
- storage: write the master key atomically (`.tmp` + rename) so a crash mid-write can no longer orphan encrypted cookies.
- live: extract `handleLiveEnd` so polling fallback now also sends wordcloud/summary; always clear danmaku records regardless of `liveEnd`; close listener on post-init failure; scope `stopMonitoring` to a single room; wrap fire-and-forget broadcasts; narrow `INTERACT_WORD_V2` typing.
- dynamic: advance timeline on filter-blocked items so notifications are not repeated; soft-fail image render with one-shot admin notification instead of permanently stopping the cron.
- push: rewrite send-retry with proper online-first bot rotation, transport-error detection, and a bounded `pushArrMapReady` wait; relax `MasterConfig` shape and validate at runtime instead of casting.
- subscription: extract `parseChannels` / `buildTargetFromFlat` / `defaultCustomFields` / `pushArrEntryFromTarget` helpers; accept explicit `isReload` flag; format `Error` messages cleanly.
- advanced-subscription: collapse the 10 channel-flag if-blocks into a `CHANNEL_FIELDS` loop with a `satisfies` assertion.
- 9414097: Remove roomid from subscription config
- 2a11604: Alpha
- 921f0ad: Workspace replace
- 53b9f9b: Redesign SubscriptionOp with scoped SubChange array; add update_subscription AI tool and fix stale subs snapshot
- Updated dependencies [beac16c]
- Updated dependencies [76b1f79]
- Updated dependencies [ed0e7c9]
- Updated dependencies [8b6aa5a]
- Updated dependencies [40ebcbc]
- Updated dependencies [a9b2cca]
- Updated dependencies [00a51a3]
- @bilibili-notify/api@0.0.2
- @bilibili-notify/push@0.0.2
- @bilibili-notify/storage@0.0.2
- @bilibili-notify/subscription@0.0.2
- @bilibili-notify/internal@0.0.2
## 4.0.0-beta.12
### Patch Changes
- 53b9f9b: Redesign SubscriptionOp with scoped SubChange array; add update_subscription AI tool and fix stale subs snapshot
## 4.0.0-beta.11
### Patch Changes
- beac16c: - feat(core): add AI-driven subscription management via `addSub`/`removeSub` internals and `bilibili-notify/update-config` event for config persistence
- fix(image): correct guard level text mapping in GuardCard (舰长/总督 description was swapped)
- style: unify all log messages to `[tag] 消息` format across all packages
- refactor(storage): `StorageManager` now accepts `ctx: Context`; logger created from ctx and passed to `KeyManager`/`CookieStore`
- refactor(subscription): `SubscriptionManager` now accepts `ctx: Context` directly, removing `SubLogger` interface and `SubscriptionManagerOpts`
- Updated dependencies [beac16c]
- @bilibili-notify/api@0.0.2-beta.4
- @bilibili-notify/push@0.0.2-beta.3
- @bilibili-notify/storage@0.0.2-beta.1
- @bilibili-notify/subscription@0.0.2-beta.2
## 4.0.0-beta.10
### Patch Changes
- 76b1f79: feat(core): add `bili ai` test command to verify AI connectivity
fix(core): remove `.required()` from AI `baseURL` schema field to allow default value; fix union fallback to `Schema.object({})` to prevent constraint errors
refactor(push): improve push logging accuracy; only log when targets are non-empty, add debug log for empty target skip
chore: enrich debug logging across core services (api, core, subscription, dynamic, live); route withLock errors through logger instead of console.error
- Updated dependencies [76b1f79]
- @bilibili-notify/api@0.0.2-beta.3
- @bilibili-notify/push@0.0.2-beta.2
- @bilibili-notify/subscription@0.0.2-beta.1
## 4.0.0-beta.9
### Patch Changes
- 2d08a6e: feat(image): add ADDITIONAL_TYPE_COMMON (game card) renderer; fix additional render order for AV/FORWARD types; fix FORWARD double-rendering additional; improve single image layout with 长图 badge; update reserve/goods/common button to pink rounded-rectangle style; remove arrow.png
fix(live): fix word cloud and live summary not sent when AI is disabled
refactor(core): move subList to core, unify bili list/ll output style, fix bili ll race condition
## 4.0.0-beta.8
### Patch Changes
- 8b6aa5a: feat(dynamic): add AI comment on dynamic push notifications
fix(live): replace @node-rs/jieba with jieba-wasm to remove Koishi unsafe flag
fix(live): fix stale closed snapshot in closeListener causing connections to never close on dispose
fix(live): correct live status badge when pushed by live service
fix(image): extend retry delay and silence errors when Puppeteer browser crashes
fix(image): inline remote images before acquiring page to prevent idle timeout
style(image): remove white borders and shadows from avatars for flat design
refactor(live): extract word cloud and live summary into private methods
refactor(logger): replace new Logger() with ctx.logger() across all services
- Updated dependencies [8b6aa5a]
- @bilibili-notify/api@0.0.2-beta.2
- @bilibili-notify/push@0.0.2-beta.1
## 4.0.0-alpha.7
### Patch Changes
- cc1455e: Change build tool to yakumo for console
## 4.0.0-alpha.6
### Patch Changes
- eeaca8f: Fix client-side TypeScript type errors
- 8f47115: Add console client build
- 9414097: Remove roomid from subscription config
## 4.0.0-alpha.5
### Patch Changes
- 40ebcbc: All bump
- Updated dependencies [40ebcbc]
- @bilibili-notify/api@0.0.2-alpha.1
- @bilibili-notify/internal@0.0.2-alpha.0
- @bilibili-notify/push@0.0.2-alpha.0
- @bilibili-notify/storage@0.0.2-alpha.0
- @bilibili-notify/subscription@0.0.2-alpha.0
## 4.0.0-alpha.4
### Patch Changes
- Updated dependencies [ed0e7c9]
- Updated dependencies [a9b2cca]
- @bilibili-notify/api@0.0.2-alpha.0
## 4.0.0-alpha.3
### Patch Changes
- 921f0ad: Workspace replace
## 4.0.0-alpha.2
### Patch Changes
- 2a11604: Alpha
## 4.0.0-alpha.1
### Patch Changes
- fdc2c7b: fix: move internal packages to devDependencies so they are bundled into the output
## [4.0.0-alpha.0] - 2026-04-04
### Breaking Changes
- 重构为 Yarn workspace monorepo,核心包路径变更为 `packages/core`
- 动态推送、直播推送、图片渲染拆分为独立可选插件,需单独安装
- 订阅配置格式调整,旧版订阅需重新配置
### Added
- 新增 `bilibili-notify/plugin-error` 事件,用于子插件向核心上报错误
- 控制台扫码登录 UI
### Changed
- Config 抽离至独立文件 `config.ts`,导出 `BilibiliNotifyConfig` + `BilibiliNotifyConfigSchema`
- `SubscriptionLoader` 重命名为 `SubscriptionManager`,移至 `@bilibili-notify/subscription` 包