Nonebot-rs 简称 nbrs,是一个基于 Nonebot2 思路的 Onebot 协议机器人框架 Rust 实现。 本框架的基本目标是实现比较便利的 Rust Onebot 机器人搭建。长期目标是以本项目为基础, 开发与其他脚本语言(比如:Python、Lua)互通的 Onebot 机器人平台(如果我能坚持下去 的话)。
基于本框架实现的机器人,可以由一下几部分组成:nbrs 核心、Matcher 插件、启动文件, 每个部分均可独立为单个 crate ,通过启动文件向 nbrs 注册 Matcher 后编译启动的方式 构建一个机器人实例。
nbrs 启动后,将读取设置文件、并注册 Matchers(其实这一步已经在编译时硬编码),当接 收到 WebSocket 连接后,加载 Bot 设置,接受 Event 后,由 nbrs 逐级匹配分发到各个 Matcher ,Matcher 处理后,通过 channel 将数据传递回 WebSocket 发送。每个 Event 的匹配与 Matcher 的处理均为独立协程,以此提高并发性能。
当第一次运行 nbrs 时将会自动创建 Nonebotrs.toml 配置文件。
```toml [global] # 全局设置 host = "127.0.0.1" # 监听 host port = 8088 # 监听 port debug = true # 开启 debug log superusers = ["YourID"] # 全局管理员账号 nicknames = ["nickname"] # 全局 Bot 昵称 command_starts = ["/"] # 全局命令起始符
[bots.BotID] # Bot 设置 superusers = ["YourID"] # 管理员账户 nicknames = ["nickname"] # Bot 昵称 command_starts = ["/"] # 命令起始符 ```
需要启用 feature matcher
最小运行实例:
rust
fn main() {
let mut nb = nonebot_rs::Nonebot::new(); // 新建 Nonebot
nb.matchers
.add_message_matcher(nonebot_rs::builtin::echo::echo()) // 注册 echo Matcher
.add_message_matcher(nonebot_rs::builtin::rcnb::rcnb()); // 注册 rcnb Matcher
nb.run() // 运行 Nonebot
}
Matcher 开发:
```rust use crate::matcher::prelude::*; use rcnb_rs::encode;
pub struct Rcnb {} // 定义 handler struct,可以在该结构体容纳静态数据
impl Handler
// Matcher 的构建函数
pub fn rcnb() -> Matcher
使用 Onebot Api:
rust
let msg:Option<nonebot_rs::api_resp::Message> = matcher.get_msg().await
没有启用 matcher ?
rust
let msg:Option<nonebot_rs::api_resp::Message> = bot.get_msg().await
就是这么简单~
需要启用 feature scheduler
定义一个定时任务
```rust use nonebot_rs::{Job, Message};
pub fn clock(nb: &nonebotrs::Nonebot) -> Job { let botgetter = nb.botgetter.clone(); Job::new("1 * * * * *", move |, | { let bots = botgetter.borrow().clone(); for (, bot) in bots { let bot = bot.clone(); tokio::spawn(senda_msg(bot)); } }) .unwrap() }
// Just for test async fn sendamsg(bot: nonebotrs::Bot) { for superuser in &bot.config.superusers { bot.sendprivate_msg( superuser.parse().unwrap(), vec![Message::text("One minute passed.")], ) .await; } } ```
在你的入口文件 main.rs
注册定时任务
```rust use nonebot_rs;
fn main() { let mut nb = nonebotrs::Nonebot::new(); .addmessage_matchers(r6s()); nb.scheduler.add(clock::clock(&nb)).unwrap(); nb.run() } ```
enjoy~