写在前面

2026年4月13日

已完成基础的luo9_bot架构搭建 -> luoy-oss/luo9_bot

已完成基础的Rust sdk -> luo9-bot/luo9_sdk_rust

已完成基础的C++ sdk -> luo9-bot/luo9_sdk_cpp

已完成基础的rust插件样例-> luo9-bot/plugin-rust-example

已完成基础的c++插件样例-> luo9-bot/plugin-cpp-example

2026年3月28日

随着rust的学习推进,发现旧版本的rust实现较为劣质,现阶段正在进行重构

本项目不作为核心项目开发,项目的迭代时间并不确定

请不要使用以下sdk,当前页面仅作保留,后续将继续使用该页面进行sdk更新跟进


架构模式:

┌────────────────────────┐
│ 主程序 (Rust)
│ ├── 网络层 (WebSocket)
│ ├── API实现
│ └── 插件管理器
└────────────┬───────────┘
│ 启动时注入函数指针表

┌────────────────────────┐
│ 插件DLL (C/ Rust/Python)
│ ├── 保存API表
│ ├── 业务逻辑
│ └── 导出事件处理函数
└────────────────────────┘


指令解析(Command)

luo9_sdk提供了Command 库,你可以使用它进行简单高效的指令前缀解析功能,支持自定义前缀字符和三种前缀模式。

模式 说明 示例
Required(char) 必须有指定前缀才解析成功 /echo hello → 解析成功
Optional(char) 前缀可选,有或没有都能解析 echo hello/echo hello 都能解析
None 不检查前缀,直接解析 echo hello → 解析成功

基本用法

Rust

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use luo9_sdk::command::{Command, PrefixMode};

match Command::parse(msg, "echo", PrefixMode::Required('/')) {
Some(cmd) => {
// ✅ 解析成功,指令匹配
let args = cmd.args_raw(); // 获取参数部分
Bot::send_private_msg(user_id, &args);
}
None => {
// ❌ 解析失败:可能不是这个指令,或前缀不对
// 可以忽略或处理其他逻辑
return;
}
}

C++

1
2
3
4
5
6
7
8
9
10
11
#include "command.h"

// 解析指令:可选 '/' 前缀
auto cmd = Command::parse(msg, "echo", PrefixMode::Optional('/'));

if (!cmd.empty()) {
// ✅ 解析成功,指令匹配
std::string args = cmd.args_raw(); // 获取参数部分
Bot::send_private_msg(user_id, args);
}
// else: 解析失败,忽略

常用方法速查

方法 Rust C++ 说明
获取指令名 cmd.name() cmd.name() 返回匹配到的指令名称
获取原始参数 cmd.args_raw() cmd.args_raw() 返回去除指令名后的参数字符串
是否有参数 cmd.has_args() cmd.has_args() 返回 bool
参数个数 cmd.args_count() cmd.args_count() 返回参数数量
获取指定参数 cmd.arg_at(0) cmd.arg_at(0) 返回第 n 个参数

解析规则说明

假设指令名为 echo,前缀为 /

输入消息 必选前缀模式 可选前缀模式 无前缀模式
/echo hello ✅ 成功 ✅ 成功 ❌ 失败
echo hello ❌ 失败 ✅ 成功 ✅ 成功
/test hello ❌ 失败(指令名不匹配) ❌ 失败 ❌ 失败

Rust 与 C++ 对比

操作 Rust C++
解析成功判断 match / if let Some(cmd) if (!cmd.empty())
解析失败处理 None => {} empty() == true
获取参数 cmd.args_raw() cmd.args_raw()
前缀模式 PrefixMode::Required('/') PrefixMode::Required('/')

插件消息分发

你会收到如下的消息类型:

群消息

私聊消息

Rust模板

你可以从luo9-bot/plugin-rust-example找到 rust的插件开发样例

插件最终会向handle_private_msg和handle_group_msg推送私聊/群聊消息,你可以在其中进行处理

处理完成后,你可以调用Bot::send_private_msg或Bot::send_group_msg进行消息发送

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
pub mod core;
use luo9_sdk::Bot;
use luo9_sdk::command::Command;
use luo9_sdk::command::PrefixMode;

use std::ffi::CString;

pub fn handle_private_msg(user_id: u64, msg: &str) {
match Command::parse(msg, "echo", PrefixMode::Required('/')) {
Some(cmd) => {
let c_msg = CString::new(cmd.args_raw()).unwrap();
Bot::send_private_msg(user_id, c_msg);
}
None => return,
};

}

pub fn handle_group_msg(group_id: u64, user_id: u64, msg: &str) {
match Command::parse(msg, "echo", PrefixMode::Required('/')) {
Some(cmd) => {
let c_msg = CString::new(cmd.args_raw()).unwrap();
Bot::send_group_msg(group_id, c_msg);
}
None => return,
};

}

C++模板

你可以从luo9-bot/plugin-cpp-example找到 rust的插件开发样例

插件最终会向handle_private_msg和handle_group_msg推送私聊/群聊消息,你可以在其中进行处理

处理完成后,你可以调用Bot::send_private_msg或Bot::send_group_msg进行消息发送

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "main.h"

void handle_private_msg(uint64_t user_id, const std::string& msg) {
auto cmd = Command::parse(msg, "echo", PrefixMode::Optional('/'));
if (!cmd.empty()) {
Bot::send_private_msg(user_id, cmd.args_raw());
}
}

void handle_group_msg(uint64_t group_id, uint64_t user_id, const std::string& msg) {
auto cmd = Command::parse(msg, "echo", PrefixMode::Optional('/'));
if (!cmd.empty()) {
Bot::send_group_msg(group_id, cmd.args_raw());
}
}

群聊事件

私聊事件

事件名称 事件含义
inputing 正在输入中
poke 收到戳一戳