# QQBot BangDream 模块参考文档 生成日期:2026-06-07 ## 文档定位 本文记录 QQBot BangDream 插件在文件结构重构完成后的稳定结构、入口链路、扩展点和验证方式。原 `tsugu` 子目录已经移除,内嵌 Tsugu 能力现在直接归入 `src/qqbot/plugins/bangDream`。 函数级用途以源码 JSDoc 为准;本文只维护模块边界、文件职责、命令入口、数据流、测试和发布验证入口。 ## 覆盖范围 | 项 | 当前值 | | --- | --- | | 模块源码目录 | `src/qqbot/plugins/bangDream` | | Nest 客户端入口 | `src/qqbot/plugins/bangDream/application/bangdream-client.service.ts` | | 应用入口 | `src/qqbot/plugins/bangDream/application/bangdream-application.service.ts` | | 渲染 Facade | `src/qqbot/plugins/bangDream/application/bangdream-renderer.facade.ts` | | Operation 注册表 | `src/qqbot/plugins/bangDream/registry/operation-registry.ts` | | 测试目录 | `test/qqbot/plugins/bangDream` | | 资源目录 | `src/qqbot/plugins/bangDream/assets` | | 静态配置目录 | `src/qqbot/plugins/bangDream/static-config` | ## 总体链路 ```text QQBot 在线命令 -> QqbotBangDreamPluginService / command engine -> QqbotBangDreamClientService.execute(operationKey, input) -> TsuguApplicationService -> TsuguOperationPipeline -> QqbotBangDreamRendererService.executeOperationHandler(handlerName, input) -> song/card/event/gacha/player/cutoff 等模块 renderer -> provider + repository + search + theme/shared -> CQ image base64 reply ``` 核心约束: - `registry/operation-registry.ts` 是 15 个 BangDream operation、handlerName、在线命令别名和冷却配置的单一来源。 - `application/bangdream-application.service.ts` 是 Nest 边界,负责主数据 ready、字典刷新、pipeline 和错误字符串化。 - `application/bangdream-renderer.facade.ts` 只做 handler 分发、输入归一化、字典解析和 CQ 图片输出。 - 业务模块按领域聚合,例如歌曲文件集中在 `song`,卡牌文件集中在 `card`。 - 横切能力只放 `hook`、`provider`、`policy`、`registry`、`theme`、`search`、`shared`。 - 不再新增 `tsugu`、`models`、`render-blocks`、`command-renderers`、`data-clients`、`runtime`、`canvas` 顶层目录。 ## 目录职责 | 目录 | 职责 | | --- | --- | | `application` | Nest 客户端、应用服务、渲染 facade、operation pipeline | | `registry` | operation key、handlerName、在线命令别名、冷却和说明 | | `hook` | 生命周期 hook 和命令执行日志 hook | | `provider` | Bestdori、HHWX、静态修正、缓存、重试、URL 解析和文件缓存 | | `policy` | 服务器策略、国服活动时间预估、档线规则、抽卡规则 | | `theme` | Canvas 基础能力、布局 token、本地资源 manifest 和渲染主题 | | `config` | 运行时配置、环境变量 key、服务器默认值和档线 tier | | `dictionary` | 默认字典和 API 字典加载 | | `search` | 模糊搜索、关系表达式、搜索字典和实体列表匹配 | | `song` | 查曲、歌曲详情、随机曲、分数表、谱面图片、歌曲资源 repository | | `card` | 查卡、卡面、卡牌图标、卡牌属性/稀有度/技能/综合力渲染 | | `character` | 查角色、角色详情、角色列表和角色资源 repository | | `event` | 查活动、活动详情、试炼、活动时间和活动数据 repository | | `gacha` | 查卡池、抽卡模拟、卡池概率、Pick Up 和卡池资源 repository | | `player` | 查玩家、玩家卡组、乐队等级、角色等级、难度完成情况和排名 | | `cutoff` | 档线、全档线、近期档线、档线图表、时间线图表和预测算法 | | `catalog` | 服务器、乐队、属性、区域道具、服装、称号、道具、技能、颜色 | | `shared` | 协议常量、主数据 store/repository、通用详情块、数据块、列表框架 | | `assets` | 本地图片、字体和静态视觉资源 | | `static-config` | 搜索配置、昵称表、CN 修正表和玩家编号表 | ## Operation 注册表 | operation key | handler | 命令名 | 主要别名 | | --- | --- | --- | --- | | `bangdream.song.search` | `searchSong` | 查曲 | `查曲`、`bd`、`bangdream`、`bandori`、`邦邦` | | `bangdream.song.chart` | `getSongChart` | 查谱面 | `查谱面`、`谱面`、`bd谱面` | | `bangdream.song.random` | `randomSong` | 随机曲 | `随机曲`、`随机`、`bd随机` | | `bangdream.song.meta` | `getSongMeta` | 查询分数表 | `查询分数表`、`查分数表`、`查询分数榜` | | `bangdream.card.search` | `searchCard` | 查卡 | `查卡`、`查卡牌`、`bd查卡` | | `bangdream.card.illustration` | `getCardIllustration` | 查卡面 | `查卡面`、`查卡插画`、`查插画` | | `bangdream.character.search` | `searchCharacter` | 查角色 | `查角色`、`bd角色` | | `bangdream.event.search` | `searchEvent` | 查活动 | `查活动`、`bd活动` | | `bangdream.event.stage` | `getEventStage` | 查试炼 | `查试炼`、`查stage`、`查舞台`、`查5v5` | | `bangdream.player.search` | `searchPlayer` | 查玩家 | `查玩家`、`查询玩家`、`bd玩家` | | `bangdream.gacha.search` | `searchGacha` | 查卡池 | `查卡池`、`bd卡池` | | `bangdream.gacha.simulate` | `simulateGacha` | 抽卡模拟 | `抽卡模拟`、`bd抽卡` | | `bangdream.cutoff.detail` | `getCutoffDetail` | `ycx` | `ycx`、`预测线`、`查档线`、`bd档线` | | `bangdream.cutoff.all` | `getCutoffAll` | `ycxall` | `ycxall`、`myycx`、`全部档线` | | `bangdream.cutoff.recent` | `getCutoffRecent` | `lsycx` | `lsycx`、`历史档线`、`近期档线` | 新增或调整在线命令时先改 `registry/operation-registry.ts`,再跑 `test/qqbot/plugins/bangDream/registry/command-sql.spec.ts` 检查数据库初始化 SQL 与注册表是否一致。 ## 扩展规则 - 新增歌曲能力:优先在 `song` 增加 model/repository/renderer/layout,不要回到横切目录堆文件。 - 新增卡牌能力:优先在 `card` 内聚合;只有静态目录实体才放 `catalog`。 - 新增活动、卡池、玩家、档线能力:分别放 `event`、`gacha`、`player`、`cutoff`。 - 新增外部数据源或缓存策略:放 `provider`。 - 新增跨模块业务规则:放 `policy`。 - 新增 Canvas 基础能力或视觉 token:放 `theme`。 - 新增通用渲染块:先确认是否真跨多个业务模块,才放 `shared`。 - 不建巨型 `index.ts` barrel,保持显式 import,降低循环依赖风险。 ## 本地验证 常规结构或源码改动优先跑: ```powershell pnpm run typecheck pnpm exec jest --runInBand --runTestsByPath test/qqbot/plugins/bangDream/registry/operation-registry.spec.ts test/qqbot/plugins/bangDream/registry/command-sql.spec.ts pnpm exec eslint src/qqbot/plugins/bangDream test/qqbot/plugins/bangDream pnpm run build ``` 图片 smoke 使用: ```powershell .\scripts\bangdream-render-smoke.ps1 -OperationKey bangdream.song.search -Text "夏祭り" -OutFile ".kt-workspace/bangdream-smoke/song.jpg" .\scripts\bangdream-render-smoke.ps1 -OperationKey bangdream.event.search -Text "50" -OutFile ".kt-workspace/bangdream-smoke/event.jpg" .\scripts\bangdream-render-smoke.ps1 -OperationKey bangdream.event.stage -Text "310" -OutFile ".kt-workspace/bangdream-smoke/stage.jpg" .\scripts\bangdream-render-smoke.ps1 -OperationKey bangdream.gacha.simulate -Text "10 259" -OutFile ".kt-workspace/bangdream-smoke/gacha.jpg" .\scripts\bangdream-render-smoke.ps1 -OperationKey bangdream.cutoff.detail -Text "100 50 cn" -OutFile ".kt-workspace/bangdream-smoke/cutoff.jpg" .\scripts\bangdream-render-smoke.ps1 -OperationKey bangdream.song.chart -Text "136 expert" -OutFile ".kt-workspace/bangdream-smoke/chart.jpg" ``` ## 发布验证 推送 Jenkins/K8s backed 分支后必须观察发布闭环: 1. Jenkins 构建完成。 2. K8s deployment rollout 成功。 3. Pod 启动日志没有 BangDream module load error。 4. 线上 `/qqbot/command/test` 按 operationKey 查询 commandId 后真实调用。 5. 拉取线上 smoke 图片并目视检查。 6. 检查操作日志中对应 command/test 调用和 BangDream hook 日志。 7. 清理远程 smoke 临时目录。 ## 常见风险 | 风险 | 处理方式 | | --- | --- | | 资源路径丢失 | 检查 `nest-cli.json` 的 `assets` include 是否指向 `qqbot/plugins/bangDream/assets` 和 `static-config` | | Jest pattern 匹配不到 | Windows 下指定文件统一用 `pnpm exec jest --runInBand --runTestsByPath path/with/slash.spec.ts` | | smoke 卡住 | 使用 `scripts/bangdream-render-smoke.ps1` 的 `TimeoutSeconds`,远程临时脚本也要有外层 timeout | | commandId 查错 | 线上 smoke 必须先用 operationKey 查在线命令,不使用历史脏数据 | | 大图 OOM 回归 | 优先验证 `bangdream.event.stage`,关注 `imageCount=5` 和图片大小 |