Crates.io | atri_plugin |
lib.rs | atri_plugin |
version | 0.9.0 |
source | src |
created_at | 2022-08-21 10:30:36.855204 |
updated_at | 2023-02-02 03:36:51.331529 |
description | AtriPlugin |
homepage | https://atrikawaii.github.io/atri_doc/ |
repository | https://github.com/AtriKawaii/atri_rust |
max_upload_size | |
id | 649730 |
size | 62,369 |
编写遵循AtriPlugin加载标准的插件
Cargo.toml:
[lib]
crate-type = ["cdylib"] # or dylib
[dependencies]
atri_plugin = "0"
首先, 定义一个结构体(struct)或枚举(enum)作为插件的实例
#[atri_plugin::plugin] // 使用此宏标记其为插件
struct MyPlugin {
listener: Option<ListenerGuard>,
}
为其实现Plugin
use atri_plugin::Plugin;
impl Plugin for MyPlugin {
fn new() -> Self {
Self { listener: None }
}
fn enable(&mut self) {
info!("Enable my plugin");
let guard = Listener::listening_on_always(|e: GroupMessageEvent| async move {
let message = e.message();
if message.to_string() == "123" {
let mut chain = MessageChainBuilder::new();
chain.push_str("321")
.push_str("114514");
let _ = e.group().send_message(chain).await;
}
});
self.listener = Some(guard);
}
fn disable(&mut self) {
info!("Disable my plugin");
}
}
也可以为插件实现Drop
, 将根据规则释放
最后, 使用cargo build
编译得到的动态库即为插件本体
详细文档另请参阅本crate源码
所有的插件依赖都应被放入plugins/dependencies
文件夹内,
在加载插件动态库前会先加载此文件夹内所有的动态库文件