robespierre_http/
messaging.rs

1use robespierre_models::{
2    autumn::AttachmentId,
3    channels::{Message, MessageFilter, ReplyData},
4    id::{ChannelId, MessageId},
5    servers::Member,
6    users::User,
7};
8
9use super::impl_prelude::*;
10
11impl Http {
12    /// Sends a message
13    pub async fn send_message(
14        &self,
15        channel_id: ChannelId,
16        content: impl AsRef<str>,
17        nonce: impl AsRef<str>,
18        attachments: Vec<AttachmentId>,
19        replies: Vec<ReplyData>,
20    ) -> Result<Message> {
21        Ok(self
22            .client
23            .post(ep!(self, "/channels/{}/messages" channel_id))
24            .json(&SendMessageRequest {
25                content: content.as_ref(),
26                nonce: nonce.as_ref(),
27                attachments,
28                replies,
29            })
30            .send()
31            .await?
32            .error_for_status()?
33            .json()
34            .await?)
35    }
36
37    /// Fetches messages
38    pub async fn fetch_messages(
39        &self,
40        channel: ChannelId,
41        filter: MessageFilter,
42    ) -> Result<FetchMessagesResult> {
43        let v = self
44            .client
45            .get(ep!(self, "/channels/{}/messages" channel))
46            .json(&filter)
47            .send()
48            .await?
49            .error_for_status()?
50            .json::<serde_json::Value>()
51            .await?;
52
53        if matches!(&filter.include_users, Some(true)) {
54            Ok(serde_json::from_value(v)?)
55        } else {
56            Ok(FetchMessagesResult {
57                messages: serde_json::from_value(v)?,
58                users: vec![],
59                members: vec![],
60            })
61        }
62    }
63
64    /// Fetches a single message
65    pub async fn fetch_message(&self, channel: ChannelId, message: MessageId) -> Result<Message> {
66        Ok(self
67            .client
68            .get(ep!(self, "/channels/{}/messages/{}" channel, message))
69            .send()
70            .await?
71            .error_for_status()?
72            .json()
73            .await?)
74    }
75
76    /// Edits a message to contain content `content`
77    pub async fn edit_message(
78        &self,
79        channel: ChannelId,
80        message: MessageId,
81        content: &str,
82    ) -> Result {
83        #[derive(serde::Serialize)]
84        struct MessagePatch<'a> {
85            content: &'a str,
86        }
87        self.client
88            .patch(ep!(self, "/channels/{}/messages/{}" channel, message))
89            .json(&MessagePatch { content })
90            .send()
91            .await?
92            .error_for_status()?;
93        Ok(())
94    }
95
96    /// Deletes a message
97    pub async fn delete_message(&self, channel: ChannelId, message: MessageId) -> Result {
98        self.client
99            .delete(ep!(self, "/channels/{}/messages/{}" channel, message))
100            .send()
101            .await?
102            .error_for_status()?;
103        Ok(())
104    }
105
106    pub async fn poll_message_changes(
107        &self,
108        channel: ChannelId,
109        ids: &[MessageId],
110    ) -> Result<PollMessageChangesResponse> {
111        #[derive(serde::Serialize)]
112        struct PollMessageChanges<'a> {
113            ids: &'a [MessageId],
114        }
115
116        Ok(self
117            .client
118            .post(ep!(self, "/channels/{}/messages/stale" channel))
119            .json(&PollMessageChanges { ids })
120            .send()
121            .await?
122            .error_for_status()?
123            .json()
124            .await?)
125    }
126
127    // TODO: search for messages
128
129    pub async fn acknowledge_message(&self, channel: ChannelId, message: MessageId) -> Result {
130        self.client_user_session_auth_type()
131            .put(ep!(self, "/channels/{}/ack/{}" channel, message))
132            .send()
133            .await?
134            .error_for_status()?;
135
136        Ok(())
137    }
138}
139
140#[derive(serde::Serialize)]
141pub struct SendMessageRequest<'a> {
142    pub content: &'a str,
143    pub nonce: &'a str,
144    #[serde(skip_serializing_if = "Vec::is_empty")]
145    pub attachments: Vec<AttachmentId>,
146    #[serde(skip_serializing_if = "Vec::is_empty")]
147    pub replies: Vec<ReplyData>,
148}
149
150#[derive(serde::Deserialize)]
151pub struct PollMessageChangesResponse {
152    pub changed: Vec<Message>,
153    pub deleted: Vec<MessageId>,
154}
155
156/// Result when fetching multiple messages
157#[derive(serde::Deserialize)]
158pub struct FetchMessagesResult {
159    pub messages: Vec<Message>,
160    #[serde(default)]
161    pub users: Vec<User>,
162    #[serde(default)]
163    pub members: Vec<Member>,
164}