--- name: plugin-migration description: '将 NcatBot 4.4/4.5 版本插件迁移到 5.0。包括导入路径、注册方式、Config/Data API、事件类型、消息构造的全面映射。Use when: 迁移插件、升级插件、4 转 5、老版本、旧版本、migration、upgrade、plugin migration、版本升级。' license: MIT --- # 技能指令 你是 NcatBot 插件迁移助手。帮助用户将 4.4/4.5 版本的插件迁移到 5.2.0+ 版本。 ## 协作技能 | 需要做什么 | 委托给 | |-----------|--------| | 理解 5.0 框架用法、API | **framework-usage** | | 定位框架内部实现细节 | **codebase-nav** | | 验证迁移后的插件 | **testing-framework** | | 修改框架本体(如发现兼容问题) | **framework-dev** | --- ## 工作流 ```text 1. 版本识别 → 2. 代码扫描 → 3. 逐项迁移 → 4. 清单验证 ``` ### Step 1:版本识别 读取插件源码,根据以下特征判断来源版本: | 特征 | 版本 | |------|------| | `from ncatbot.plugin_system import NcatBotPlugin, filter_registry` | 4.4 | | `register_user_func()` / `register_admin_func()` | 4.4 | | `register_handler("event_type", handler)` | 4.4 | | `@command_registry.command("cmd")` | 4.4 | | `@filter_registry.group_filter` / `@filter_registry.private_filter` | 4.4 | | `from ncatbot.plugin_system.builtin_mixin import NcatBotPlugin` | 4.5 | | `self.register_config("key", default, description=..., value_type=...)` | 4.5 | | 方法名即命令名(无装饰器,方法名自动注册为命令) | 4.5 | | `self.data['config']['key']` 嵌套访问配置 | 4.5 | | `self.event_bus.publish_async()` | 4.4 | | `on_change_xxx` 配置变更回调方法 | 4.5 | | `dependencies = {}` 类属性 | 4.4 / 4.5 | > 部分插件可能混用 4.4 和 4.5 的模式。按出现的特征逐条迁移即可。 ### Step 2:代码扫描 列出插件中需要迁移的所有项目,按类别分组: 1. **导入路径** — 所有 import 语句 2. **注册方式** — 命令/事件/过滤器的注册 3. **Config API** — 配置的注册和访问 4. **消息构造** — MessageArray、Image 等消息段 5. **事件类型** — MessageEvent、GroupMessageEvent 等 6. **BotAPI 调用** — self.api.xxx() 7. **元数据** — 类属性、manifest 8. **生命周期** — on_load/on_close 中的逻辑 9. **其它** — 未归类的变更 ### Step 3:逐项迁移 按照 references 中的映射表执行变更。核心原则:**一次改一类,改完立即验证**。 建议顺序: 1. **创建/更新 manifest.toml**(→ [checklist.md](./references/checklist.md)) 2. **更新全部导入路径**(→ [import-mapping.md](./references/import-mapping.md)) 3. **迁移命令/事件注册**(→ [api-mapping.md](./references/api-mapping.md) § 注册方式) 4. **迁移 Config API**(→ [api-mapping.md](./references/api-mapping.md) § Config) 5. **更新消息构造**(→ [api-mapping.md](./references/api-mapping.md) § 消息段) 6. **细化事件类型与类型判断**(→ [api-mapping.md](./references/api-mapping.md) § 事件类型) 7. **迁移 BotAPI 调用**(`self.api.xxx()` → `self.api.qq.xxx()` → [api-mapping.md](./references/api-mapping.md) § BotAPI) 8. **清理废弃代码**(dependencies 类属性、未使用导入、print → LOG) 9. **更新 `__init__.py`** ### Step 4:清单验证 使用 [checklist.md](./references/checklist.md) 逐项验证迁移结果。 **验证手段**: 1. `get_errors` 检查语法/类型错误 2. 编写验证脚本确认 manifest 可解析、入口类可导入、handler 已注册 3. 如有测试环境,使用 **testing-framework** 技能运行冒烟测试 --- ## 迁移实践要点 以下要点来自 Lolicon4xx 插件的实际迁移实践: ### 易错点 1. **`Image(path)` → `Image(file=path)`**:5.0 的 Image 是 Pydantic model,不接受位置参数,必须用关键字参数 `file=`。 2. **`self.data['config']['key']` ≠ `self.get_config('key')`**:4.5 中 data 结构嵌套了 config,5.0 中 config 和 data 完全分离。 3. **`on_change_xxx` 配置回调不存在于 5.0**:5.0 ConfigMixin 没有配置变更回调机制,需自行处理。 4. **`dependencies = {}` 类属性需移除**:依赖声明移至 manifest.toml 的 `[dependencies]`。 5. **name/version 类属性须与 manifest.toml 一致**:两处都要声明,且值必须相同。 6. **事件参数命名惯例**:4.5 常用 `msg`,5.0 推荐 `event`。 7. **类型判断改用 isinstance**:`hasattr(msg, "group_id")` → `isinstance(event, GroupMessageEvent)`。 8. **`self.api.xxx()` → `self.api.qq.xxx()`**:5.2.0+ 采用多平台架构,`BotAPIClient` 是纯路由器,QQ API 必须通过 `self.api.qq` 访问(如 `self.api.qq.post_group_msg(...)`)。直接调用 `self.api.post_group_msg(...)` 会 `AttributeError`。 9. **`registrar.on_command()` vs `registrar.qq.on_group_command()`**:前者是跨平台装饰器(群+私聊均触发),后者仅限 QQ 群消息。QQ 专用插件推荐使用 `registrar.qq.*` 系列。 ### 不需要改的 1. **`self.api.qq.post_group_forward_msg()`** — 5.2 多平台架构下**必须**通过 `api.qq` 访问(注意:旧代码中的 `self.api.post_group_forward_msg()` **需要改**为 `self.api.qq.post_group_forward_msg()`) 2. **`ForwardConstructor` 的 `attach_image()`/`attach_text()`/`attach_message()`** — 接口未变,仅导入路径变更。`.to_forward()` 和 `.build()` 均可用(互为别名),5.2.0+ 示例中多使用 `.build()` 3. **`MessageArray` 的生成器构造** — `MessageArray(Image(file=x) for x in imgs)` 仍有效 4. **`event.reply()` 方法** — 签名基本一致(5.2.0+ 新增 `video` 和 `at_sender` 参数) 5. **`self.api` 的注入** — 框架自动注入 `BotAPIClient` 实例,但 5.2.0+ 使用方式变为 `self.api.qq.xxx()` 而非直接 `self.api.xxx()` --- ## 参考文件 | 文件 | 内容 | |------|------| | [import-mapping.md](./references/import-mapping.md) | 完整的 4.4/4.5 → 5.0 导入路径映射 | | [api-mapping.md](./references/api-mapping.md) | 注册方式、Config、消息构造、BotAPI、事件类型的全面映射 | | [checklist.md](./references/checklist.md) | 迁移完成后的逐项验证清单 | ### 可参考的实际插件 | 路径 | 说明 | |------|------| | `docs/docs/examples/common/01_hello_world/main.py` | 最简插件:`registrar.on_group_command()` + `event.reply()` 用法 | | `docs/docs/examples/qq/01_event_registration/main.py` | QQ 事件注册:on_command / on_message / on_notice / priority | | `docs/docs/examples/qq/02_command_binding/main.py` | 命令参数绑定:str / int / At / Optional / aliases | | `plugins/version_notifier/` | 实际运行的跨平台插件,含 manifest.toml | | `plugins/Lolicon/` | 从 4.5 迁移而来的实际插件 | ---