robespierre_http/
messaging.rs1use 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 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 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 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 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 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 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#[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}