#slack #messaging #webhook

slack-messaging

支持构建 Slack 消息 API 的消息

6 个版本

0.3.1 2024年4月9日
0.3.0 2024年4月8日
0.2.2 2023年3月2日
0.2.1 2023年2月28日
0.1.0 2023年2月26日

#368 in 网页编程

每月 23 次下载

MIT 许可证

660KB
6K SLoC

Slack Messaging

Version License Test

这是一个为 Rust 编写的库,用于支持构建 Slack 消息 API 的消息。使用它,您可以以类型安全的方式构建任何消息,如下所示。

use slack_messaging::{mrkdwn, Message};
use slack_messaging::blocks::{elements::Button, Actions, Section};

#[tokio::main]
async fn main() {
    let message = Message::builder()
        .block(
            Section::builder()
                .text(mrkdwn!("You have a new request:\n*<fakeLink.toEmployeeProfile.com|Fred Enriquez - New device request>*"))
                .build()
        )
        .block(
            Section::builder()
                .field(mrkdwn!("*Type:*\nComputer (laptop)"))
                .field(mrkdwn!("*When:*\nSubmitted Aug 10"))
                .build()
        )
        .block(
            Actions::builder()
                .element(
                    Button::builder()
                        .text("Approve")
                        .value("approve")
                        .primary()
                        .build()
                )
                .element(
                    Button::builder()
                        .text("Deny")
                        .value("deny")
                        .danger()
                        .build()
                )
                .build()
        )
        .build();

    let req = reqwest::Client::new()
        .post("https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX")
        .json(&message);

    if let Err(err) = req.send().await {
        eprintln!("{}", err);
    }
}

上述示例的消息负载如下。

{
    "blocks": [
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "You have a new request:\n*<fakeLink.toEmployeeProfile.com|Fred Enriquez - New device request>*"
            }
        },
        {
            "type": "section",
            "fields": [
                {
                    "type": "mrkdwn",
                    "text": "*Type:*\nComputer (laptop)"
                },
                {
                    "type": "mrkdwn",
                    "text": "*When:*\nSubmitted Aug 10"
                }
            ]
        },
        {
            "type": "actions",
            "elements": [
                {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "Approve"
                    },
                    "value": "approve",
                    "style": "primary"
                },
                {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "Deny"
                    },
                    "value": "deny",
                    "style": "danger"
                }
            ]
        }
    ]
}

可选功能

以下是可以启用或禁用的 Cargo 功能 列表。

fmt

启用 fmt 模块,并按以下方式格式化消息。

use chrono::prelude::*;
use slack_messaging::fmt::DateFormatter;

// Formatter without optional link.
let f = DateFormatter::builder()
    .token("{date_short} at {time}")
    .build();

let dt = DateTime::parse_from_rfc3339("2023-02-27T12:34:56+09:00").unwrap();

assert_eq!(
    f.format(&dt),
    "<!date^1677468896^{date_short} at {time}|Feb 27, 2023 at 12:34 PM>"
);

// You can also set optional link when formatting.
assert_eq!(
    f.format_with_link(&dt, "https://example.com"),
    "<!date^1677468896^{date_short} at {time}^https://example.com|Feb 27, 2023 at 12:34 PM>"
);

// Formatter with optional link.
let f = DateFormatter::builder()
    .token("{date_short} at {time}")
    .link("https://example.com")
    .build();

// This time, format method returns text with link set to the formatter.
assert_eq!(
    f.format(&dt),
    "<!date^1677468896^{date_short} at {time}^https://example.com|Feb 27, 2023 at 12:34 PM>"
);

许可证

本软件根据 MIT 许可证 发布。

依赖项

~0.7–2.4MB
~47K SLoC