插件开发概述
选择你的语言
| 语言 | 状态 | 说明 |
|---|---|---|
| Rust | ✅ 完整支持 | 官方 SDK,文档完善 |
| C++ | 🔜 即将推出 | 核心功能已实现,文档编写中 |
| Python | 🔜 即将推出 | 核心功能已实现,文档编写中 |
整体结构
洛玖的插件系统分三层:
┌─────────────────────────────────────────┐
│ 你的插件 │
├─────────────────────────────────────────┤
│ SDK │
├─────────────────────────────────────────┤
│ luo9_core(FFI 层) │
├─────────────────────────────────────────┤
│ 宿主(luo9_bot) │
└─────────────────────────────────────────┘宿主负责连接 Napcat、接收消息、分发给插件、发送回复。
核心库luo9_core是一个 C 动态库,提供消息总线和命令解析的底层函数。它不关心你用什么语言,只暴露 extern "C" 接口。
SDK 是核心库的语言封装。它把 C 接口包装成你熟悉的 API —— 在 Rust 里是 Bus::topic("luo9_message"),在 Python 里是 Bus.topic("luo9_message")。
插件是你写的代码。它通过 SDK 订阅消息、处理逻辑、发送回复。
消息怎么流动
所有通信都通过**消息总线(Bus)**进行。你可以把它想象成一个邮局:
- Topic 是信箱的名字,比如
luo9_message、luo9_send - Subscriber 是每个插件在每个信箱上的专属格子
- Publish 是往信箱里投信
- Pop 是从格子里取信
宿主收到 QQ 消息后,把它投进 luo9_message 信箱。插件从自己的格子里取出消息,处理后把回复投进 luo9_send 信箱。宿主再从 luo9_send 取出来发给 Napcat。
Topic 一览
| Topic | 方向 | 用途 |
|---|---|---|
luo9_message | 宿主 → 插件 | QQ 消息 |
luo9_meta_event | 宿主 → 插件 | 心跳、生命周期 |
luo9_notice | 宿主 → 插件 | 好友/群变动通知 |
luo9_request | 宿主 → 插件 | 好友/群请求 |
luo9_task | 宿主 → 插件 | 定时任务触发 |
luo9_task_miso | 插件 → 宿主 | 创建/取消定时任务 |
luo9_send | 插件 → 宿主 | 请求发送消息 |
luo9_version | 宿主 → 插件 | 版本查询 |
luo9_version_reply | 插件 → 宿主 | 版本响应 |
插件入口
每个插件必须导出一个 plugin_main 函数:
rust
#[unsafe(no_mangle)]
pub extern "C" fn plugin_main() {
// 你的代码从这里开始
}宿主会在独立线程里调用它。如果 panic 了,宿主会捕获,不会带崩整个机器人。