#facebook #messenger #bot #api-bindings #rust

russenger

一个旨在简化处理Facebook Messenger webhook响应的Rust库

10个版本

0.3.0-rc2024年7月22日
0.2.1-rc2024年7月8日
0.2.0 2024年6月19日
0.1.6 2024年5月29日
0.1.1 2024年4月30日

#546 in 网络编程

Download history 383/week @ 2024-04-28 30/week @ 2024-05-05 249/week @ 2024-05-12 39/week @ 2024-05-19 129/week @ 2024-05-26 15/week @ 2024-06-02 5/week @ 2024-06-09 113/week @ 2024-06-16 5/week @ 2024-06-23 104/week @ 2024-07-07 4/week @ 2024-07-14 99/week @ 2024-07-21 17/week @ 2024-07-28

每月下载 123次

Apache-2.0

270KB
953

俄信使 - 使用Rust处理Facebook Messenger Webhook

Russenger Logo

欢迎来到俄信使,这是一个旨在简化处理Facebook Messenger webhook响应的Rust库。俄信使提供了一种方便的方式来构造和发送各种类型的响应,包括文本消息、快速回复、通用模板和媒体附件。

特性

  • 自定义模型:开发者现在可以使用俄信使库中的自定义模型。这是通过集成rusql-alchemy实现的,这是一个sqlx的ORM。这意味着模型在Rust代码中定义,无需编写SQL查询。
  • 易于使用:俄信使库旨在易于使用。它提供了一套模块和宏,可以抽象出构建机器人的复杂性,使您能够专注于应用程序的逻辑。
  • 灵活:俄信使库具有灵活性,可用于构建各种机器人。它支持基于文本的对话、快速回复和自定义操作。

入门

要开始使用俄信使库,您需要将其作为Rust项目中的依赖项安装。您可以在Cargo.toml文件中添加以下行来完成此操作

[dependencies]
russenger = { version = "0.3.O-rc", features = ["postgres"] } # features 'sqlite, postgres, mysql'
actix-web = "4"
sqlx = "^0.7.0"

安装库后,您就可以开始构建您的机器人了!有关如何使用库的更多信息,请参阅文档

创建新项目

要使用俄信使库创建新项目,您可以使用cargo-generate工具。以下是步骤

  1. 安装cargo-generate
cargo install cargo-generate
  1. 生成新项目
cargo generate --git https://github.com/j03-dev/russenger_template

示例

以下是一些使用俄信使库可以构建的示例

一个简单的机器人,问候用户并询问他们的名字

use russenger::prelude::*;
use russenger::models::RussengerUser;

#[derive(FromRow, Clone, Model)]
pub struct Register {
    #[model(primary_key = true, auto = true, null = false)]
    pub id: Integer,
    #[model(foreign_key = "RussengerUser.facebook_user_id", unique = true, null = false)]
    pub user_id: String,
    #[model(size = 30, unique = true, null = false)]
    pub username: String,
}

#[action]
async fn Main(res: Res, req: Req) {
    res.send(TextModel::new(&req.user, "Hello!")).await;
    if let Some(user_register) = Register::get(kwargs!(user_id == req.user), &req.query.conn).await {
        res.send(TextModel::new(&req.user, &format!("Hello {}", user_register.username)))
            .await;
    } else {
        res.send(TextModel::new(&req.user, "What is your name: "))
            .await;
        req.query.set_action(&req.user, SignUp).await;
        return;
    }
    req.query.set_action(&req.user, GetUserInput).await;
}

#[action]
async fn SignUp(res: Res, req: Req) {
    let username: String = req.data.get_value();
    let message = if Register::create(kwargs!(user_id = req.user, username = username), &req.query.conn).await {
        "Register success"
    } else {
        "Register failed"
    };
    res.send(TextModel::new(&req.user, message)).await;
    Main.execute(res, req).await;
}

#[action]
async fn GetUserInput(res: Res, req: Req) {
    let payload = |value: &str| Payload::new(NextAction, Some(Data::new(value, None)));

    // QuickReply
    let quick_replies: Vec<QuickReply> = vec![
        QuickReply::new("blue", "", payload("blue")),
        QuickReply::new("red", "", payload("red")),
    ];
    let quick_reply_model = QuickReplyModel::new(&req.user, "choose one color", quick_replies);
    res.send(quick_reply_model).await;
}

#[action]
async fn NextAction(res: Res, req: Req) {
    let color: String = req.data.get_value();
    res.send(TextModel::new(&req.user, &color)).await;
    Main.execute(res, req).await; // go back to Main action
}

#[russenger::main]
async fn main() {
    let conn = Database::new().await.conn;
    migrate!([RussengerUser, Register], &conn);

    russenger::actions![Main, GetUserInput, NextAction, SignUp];
    russenger::launch().await;
}

此示例展示了如何创建一个简单的机器人,它问候用户并询问他们的名字。它使用自定义模型来存储和检索用户数据。

一个机器人,向用户发送快速回复选项列表并处理他们的响应

use russenger::models::RussengerUser;
use russenger::prelude::*;

#[action]
async fn Main(res: Res, req: Req) {
    let payload = |value: &str| Payload::new(NextAction, Some(Data::new(value, None)));

    // QuickReply
    let quick_replies: Vec<QuickReply> = vec![
        QuickReply::new("Option 1", "", payload("Option 1")),
        QuickReply::new("Option 2", "", payload("Option 2")),
        QuickReply::new("Option 3", "", payload("Option 3")),
    ];
    let quick_reply_model = QuickReplyModel::new(&req.user, "Choose an option:", quick_replies);
    res.send(quick_reply_model).await;
}

#[action]
async fn NextAction(res: Res, req: Req) {
    let option: String = req.data.get_value();
    res.send(TextModel::new(&req.user, &format!("You chose: {}", option))).await;
}

#[russenger::main]
async fn main() {
    let conn = Database::new().await.conn;
    migrate!([RussengerUser], &conn);
    russenger::actions![Main, NextAction];
    russenger::launch().await;
}

此示例展示了如何创建一个机器人,它向用户发送快速回复选项列表并处理他们的响应。

贡献

我们欢迎为 Russenger 库做出贡献!如果您有新功能的想法或者发现了错误,请在本库的 GitHub 仓库 上提交一个问题。如果您想贡献代码,请克隆仓库并提交一个 pull request。

许可证

Russenger 库遵循 MIT 许可协议。更多信息请参阅 LICENSE 文件。

依赖项

~25–47MB
~814K SLoC