diff --git a/src/client/src/api/conversations.rs b/src/client/src/api/conversations.rs index af0bca4..ff69f5a 100644 --- a/src/client/src/api/conversations.rs +++ b/src/client/src/api/conversations.rs @@ -5,11 +5,12 @@ use rsb_derive::Builder; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; +use rvstruct::ValueStruct; -use crate::ClientResult; -use crate::SlackClientSession; +use crate::*; use slack_morphism_models::*; use std::collections::HashSet; +use futures::future::{BoxFuture, FutureExt}; impl<'a> SlackClientSession<'a> { /// @@ -41,6 +42,48 @@ impl<'a> SlackClientSession<'a> { ) -> ClientResult { self.http_api.http_post("conversations.create", req).await } + + /// + /// https://api.slack.com/methods/conversations.history + /// + pub async fn conversations_history( + &self, + req: &SlackApiConversationsHistoryRequest, + ) -> ClientResult { + self.http_api + .http_get( + "conversations.history", + &vec![ + ("channel", req.channel.as_ref().map(|x| x.value())), + ("cursor", req.cursor.as_ref().map(|x| x.value())), + ("limit", req.limit.map(|v| v.to_string()).as_ref()), + ("inclusive",req.inclusive.map(|v| v.to_string()).as_ref()), + ("latest", req.latest.as_ref().map(|x| x.value())), + ("oldest", req.oldest.as_ref().map(|x| x.value())), + ], + ) + .await + } + + /// + /// https://api.slack.com/methods/conversations.info + /// + pub async fn conversations_info( + &self, + req: &SlackApiConversationsInfoRequest, + ) -> ClientResult { + self.http_api + .http_get( + "conversations.info", + &vec![ + ("channel", Some(req.channel.value())), + ("include_num_members", req.include_num_members.map(|v| v.to_string()).as_ref()), + ("include_locale",req.include_locale.map(|v| v.to_string()).as_ref()) + ], + ) + .await + } + } #[skip_serializing_none] @@ -79,3 +122,70 @@ pub struct SlackApiConversationsCreateRequest { pub struct SlackApiConversationsCreateResponse { pub channel: SlackChannelInfo, } + +#[skip_serializing_none] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)] +pub struct SlackApiConversationsHistoryRequest { + pub channel: Option, + pub cursor: Option, + pub latest: Option, + pub limit: Option, + pub oldest: Option, + pub inclusive : Option +} + +#[skip_serializing_none] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)] +pub struct SlackApiConversationsHistoryResponse { + pub messages: Vec, + pub response_metadata: Option, + pub has_more: Option, + pub pin_count: Option, +} + +impl SlackApiScrollableRequest for SlackApiConversationsHistoryRequest { + type ResponseType = SlackApiConversationsHistoryResponse; + type CursorType = SlackCursorId; + type ResponseItemType = SlackHistoryMessage; + + fn with_new_cursor(&self, new_cursor: Option<&Self::CursorType>) -> Self { + self.clone().opt_cursor(new_cursor.cloned()) + } + + fn scroll<'a, 's>( + &'a self, + session: &'a SlackClientSession<'s>, + ) -> BoxFuture<'a, ClientResult> { + async move { session.conversations_history(&self).await }.boxed() + } +} + +impl SlackApiScrollableResponse for SlackApiConversationsHistoryResponse { + type CursorType = SlackCursorId; + type ResponseItemType = SlackHistoryMessage; + + fn next_cursor(&self) -> Option<&Self::CursorType> { + self.response_metadata + .as_ref() + .map(|rm| rm.next_cursor.as_ref()) + .flatten() + } + + fn scrollable_items<'a>(&'a self) -> Box + 'a> { + Box::new(self.messages.iter()) + } +} + +#[skip_serializing_none] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)] +pub struct SlackApiConversationsInfoRequest{ + pub channel : SlackChannelId, + pub include_locale: Option, + pub include_num_members: Option +} + +#[skip_serializing_none] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)] +pub struct SlackApiConversationsInfoResponse{ + pub channel: SlackChannelInfo +} \ No newline at end of file diff --git a/src/models/src/messages/mod.rs b/src/models/src/messages/mod.rs index 4609157..e7f653a 100644 --- a/src/models/src/messages/mod.rs +++ b/src/models/src/messages/mod.rs @@ -3,6 +3,7 @@ use crate::common::*; use rsb_derive::Builder; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; +use crate::events::SlackMessageEventType; #[skip_serializing_none] #[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)] @@ -28,3 +29,13 @@ pub struct SlackMessage { #[serde(flatten)] pub content: SlackMessageContent, } + +#[skip_serializing_none] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)] +pub struct SlackHistoryMessage { + #[serde(flatten)] + pub origin: SlackMessageOrigin, + #[serde(flatten)] + pub content: SlackMessageContent, + pub subtype: Option, +} \ No newline at end of file