slack_morphism/api/
webhook.rs

1//!
2//! Support for Slack Webhooks methods
3//!
4
5use lazy_static::lazy_static;
6use rsb_derive::Builder;
7use serde::{Deserialize, Serialize};
8use serde_with::skip_serializing_none;
9use url::Url;
10
11use crate::models::*;
12use crate::ratectl::*;
13use crate::SlackClient;
14use crate::{ClientResult, SlackClientHttpConnector};
15use rvstruct::ValueStruct;
16use tracing::*;
17
18impl<SCHC> SlackClient<SCHC>
19where
20    SCHC: SlackClientHttpConnector + Send,
21{
22    ///
23    /// Post a webhook message using webhook url
24    ///
25    pub async fn post_webhook_message(
26        &self,
27        incoming_webhook_url: &Url,
28        req: &SlackApiPostWebhookMessageRequest,
29    ) -> ClientResult<SlackApiPostWebhookMessageResponse> {
30        let http_webhook_span = span!(Level::DEBUG, "Slack WebHook");
31
32        let context = crate::SlackClientApiCallContext {
33            rate_control_params: Some(&POST_WEBHOOK_SPECIAL_LIMIT_RATE_CTL),
34            token: None,
35            tracing_span: &http_webhook_span,
36            is_sensitive_url: true,
37        };
38
39        self.http_api
40            .connector
41            .http_post_uri(incoming_webhook_url.clone(), req, context)
42            .await
43    }
44
45    //
46    // Respond to event using a Slack ResponseURL and providing message.
47    //
48    pub async fn respond_to_event(
49        &self,
50        response_url: &SlackResponseUrl,
51        req: &SlackApiPostWebhookMessageRequest,
52    ) -> ClientResult<SlackApiPostWebhookMessageResponse> {
53        self.post_webhook_message(response_url.value(), req).await
54    }
55}
56
57#[skip_serializing_none]
58#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
59pub struct SlackApiPostWebhookMessageRequest {
60    #[serde(flatten)]
61    pub content: SlackMessageContent,
62    pub thread_ts: Option<SlackTs>,
63    pub replace_original: Option<bool>,
64    pub delete_original: Option<bool>,
65}
66
67#[skip_serializing_none]
68#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
69pub struct SlackApiPostWebhookMessageResponse {}
70
71lazy_static! {
72    pub static ref POST_WEBHOOK_SPECIAL_LIMIT_RATE_CTL: SlackApiMethodRateControlConfig =
73        SlackApiMethodRateControlConfig::new().with_special_rate_limit(
74            SlackApiRateControlSpecialLimit::new(
75                "post_webhook_message".into(),
76                SlackApiRateControlLimit::new(1, std::time::Duration::from_secs(1))
77            )
78        );
79}