kovi 0.0.1

A lightweight and fast development framework for OneBot protocol plugins
Documentation
[English]README.md |  **简体中文** 

# Kovi

使用 Rust 开发的**快速轻量** OneBot V11 机器人插件框架。
项目处于 beta 状态,目前已具备 **消息监听** 与 **基本api能力** 。
其他能力请等待开发。

**注意⚠️,项目处于 Beta 状态,以下可能会变动**

**注意⚠️,项目目前只支持 OneBot V11 正向 WebSocket 协议**

## 为什么选择 Kovi ?

- 🚲 轻量:低占用,目前为止,在 Linux 下编译,lib 库大小不到 1.5MB。
- ⚡ 高效:得益于足够轻量,所以足够快,从接受消息到处理好传到插件少于 5 微秒。
- 🚤 极速开发: 开发者无需在意底层细节,框架帮助你完成所有。

本项目开发初衷在于提高群活跃氛围、方便群管理,仅供个人娱乐、学习和交流使用,**任何人不得将本项目用于任何非法用途**。


## 为什么叫做Kovi
因为机器人插件写法来源于 [Kivi](https://github.com/xiaotian2333/KiviBot-Primitive) 。如果你之前开发过Kivi框架的插件,对于上手本框架会很简单。

## 快速上手

**注意⚠️,项目处于 Beta 状态,以下可能会变动**

**注意⚠️,项目目前只支持 OneBot V11 正向 WebSocket 协议**

项目由 [Rust](#) 所写,插件也需用 [Rust](#) 写,请确保本地已安装。

1. 创建基本rust项目,加入框架。

```bash
cargo new kovi-bot
cd ./kovi-bot
cargo add Kovi
```

2. **src/main.rs** 创建bot实例
```rust
use kovi::bot::Bot;
fn main() {
    let bot = Bot::build();
    bot.run()
}
```

如果是第一次运行,在 `Bot::build()` 时,会提示输入一些信息以创建 `kovi.conf.json` 文件,这是Kovi运行所需的信息。

```
✔ What is the IP of the OneBot server? · 127.0.0.1
OneBot服务端的IP是什么? (默认值:127.0.0.1)

✔ What is the port of the OneBot server? · 8081
OneBot服务端的端口是什么? (默认值:8081)

✔ What is the access_token of the OneBot server? · 
OneBot服务端的access_token是什么? (默认值:空)

✔ What is the ID of the main administrator? 
管理员的ID是什么? (无默认值)
```


## 插件开发

### 创建插件

推荐的插件开发方法是创建新目录 `plugins` 储存插件。跟着下面来吧。

首先创建 Cargo 工作区,在 `Cargo.toml` 写入 `[workspace]`

```toml
[package]
略
[dependencies]
略

[workspace]
```

接着

```bash
cargo new plugins/hi --lib
```

Cargo 会帮你做好一切的。

### 编写插件

编写我们新创建的插件 `plugins/hi/src/lib.rs`

下面是最小实例

```rust
// 导入插件构造结构体
use kovi::bot::plugin_builder::PluginBuilder;

// 要mian函数传入 mut plugin 这是挂载插件所必需的。
pub fn main(mut plugin: PluginBuilder) {
    // 设定插件名字,没有设定名字的话,所有的监听都会返回错误
    plugin.set_info("hi");

    // on_msg() 为监听消息,event 里面包含本次消息的所有信息。
    plugin.on_msg(move |event| {
            if event.text == Option::Some("Hi Bot".to_string()) {
                event.reply("Hi!")
            }
            // 必须返回一个Ok(),目前无效果,后续版本会根据返回Err()做相对应的操作
            Ok(())
        }) // 只要名字设置正确,此处不会返回错误,所以 .unwrap() 就行
        .unwrap();
}
```

main函数写在 `lib.rs` 是因为等下要导出给bot实例挂载。

插件一般不需要 ` main.rs`

### 挂载插件

将插件导入到 `kovi-bot` 的 `main.rs`

```bash
cargo add --path plugins/hi  
```

```rust
use kovi::bot::Bot;
use std::sync::Arc;

fn main() {
    let bot = Bot::build();
    let bot = bot
        .mount_main(Arc::new(hi::main))
        .mount_main(Arc::new(hi2::main))
        .mount_main(Arc::new(hi3::main));
    bot.run()
}

```

### 更多插件例子

#### bot 主动发言

```rust
use kovi::bot::plugin_builder::PluginBuilder;

pub fn main(mut plugin: PluginBuilder) {
    plugin.set_info("online");
    // 构造RuntimeBot
    let bot = plugin.build_runtime_bot();
    let user_id = bot.main_admin;

    bot.send_private_msg(user_id, "bot online")
}
```

`main()` 函数 只会在 KoviBot 启动时运行一次。

向 `plugin.on_msg()` 传入的闭包,会在每一次接收消息时运行。

目前 beta 阶段的 Kovi 还没有封装更多的 api 你可以使用 RuntimeBot 的 api_tx 来自行发送 api