miraie 未来へ
Miraie 是一个基于 mirai 和 mirai-api-http 的 Rust 机器人框架。
特性
- 灵活、自然的对话式写法
- 基于 mirai-api-http,可基于 docker 灵活部署
- 支持 rustls,编译出的机器人可不依赖于 openssl
Demo
use miraie::prelude::*;
use anyhow::*;
use futures::*;
#[tokio::main]
async fn main() -> Result<()> {
let (bot, con) = miraie::Bot::new("127.0.0.1:18418", "VERIFY_KEY", QQ(123456)).await?;
bot.command("你好", |_: GroupMessage| async { "你好" })
.command("在吗", |_: GroupMessage| async {
Result::<&'static str>::Ok("嗯嗯")
})
.command("在干什么", |msg: GroupMessage, bot: Bot| async move {
msg.reply("你有事吗", &bot).await?;
Result::<(), Error>::Ok(())
})
.handler(ping_pong_handler::<GroupMessage>)
.handler(ping_pong_handler::<FriendMessage>)
.handler(on_group_msg_confirm);
Ok(())
}
async fn ping_pong_handler<T: Conversation>(msg: T, bot: Bot) -> Result<()> {
if msg.as_message().to_string().trim() == "ping" {
let resp = msg.reply("pong", &bot).await?;
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
bot.request(api::recall::Request {
message_id: resp.message_id,
})
.await?;
return Ok(());
}
Ok(())
}
async fn on_group_msg_confirm(group_msg: GroupMessage, bot: Bot) -> Result<()> {
if group_msg.message.to_string() == "复读一下" {
let next_msg = group_msg
.prompt("真的要复读吗?请在 10 秒内进行确认", &bot)
.await?;
if next_msg.message.as_confirm() == Some(true) {
group_msg.reply("确认成功,复读下一句", &bot).await?;
log::info!("开始复读,等待下一句");
let mut next = group_msg
.followed_sender_messages(&bot)
.next()
.await
.context("连接断开了哦")?;
log::info!("复读这一句话:{:?}", next);
let msg = next.message.take();
next.reply_unquote(msg, &bot).await?;
} else {
group_msg.reply("确认失败", &bot).await?;
}
}
Ok(())
}
上面的机器人完整代码可以在 simple_bot.rs 示例代码 中找到。
一个更完整的、带有管理员、配置文件的机器人示例可以在 avabot 找到。
Rust features
native-tls
使用 native tls 作为 backend
rustls
使用 rustls 作为 backend
后续规划
运行时需要提供的环境变量
MIRAIE_RESOURCE_ROOT
:资源的根目录,这个需要是 mirai 运行时的目录。如果 mirai(Java)运行在机器 A 上,基于 miraie 的 rust bot 运行在机器 B 上,这个需要是机器 A 上的路径。