slack_morphism/api/
webhook.rs1use 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 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 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}