robespierre_http/
channel_information.rs

1use serde::Serialize;
2
3use robespierre_models::{
4    autumn::AttachmentId,
5    channels::{Channel, ChannelField, ChannelPermissions, CreateChannelInviteResponse},
6    id::{ChannelId, RoleId},
7};
8
9use super::impl_prelude::*;
10
11impl Http {
12    /// Gets the channel given the id
13    pub async fn fetch_channel(&self, channel_id: ChannelId) -> Result<Channel> {
14        Ok(self
15            .client
16            .get(ep!(self, "/channels/{}" channel_id))
17            .send()
18            .await?
19            .error_for_status()?
20            .json()
21            .await?)
22    }
23
24    /// Edits the channel given by id
25    pub async fn edit_channel(
26        &self,
27        channel_id: ChannelId,
28        name: Option<String>,
29        description: Option<String>,
30        icon: Option<AttachmentId>,
31        nsfw: Option<bool>,
32        remove: Option<ChannelField>,
33    ) -> Result {
34        #[derive(serde::Serialize)]
35        struct PatchChannelRequest {
36            #[serde(skip_serializing_if = "Option::is_none")]
37            name: Option<String>,
38            #[serde(skip_serializing_if = "Option::is_none")]
39            description: Option<String>,
40            #[serde(skip_serializing_if = "Option::is_none")]
41            icon: Option<AttachmentId>,
42            #[serde(skip_serializing_if = "Option::is_none")]
43            nsfw: Option<bool>,
44            #[serde(skip_serializing_if = "Option::is_none")]
45            remove: Option<ChannelField>,
46        }
47
48        self.client
49            .patch(ep!(self, "/channels/{}" channel_id))
50            .json(&PatchChannelRequest {
51                name,
52                description,
53                icon,
54                nsfw,
55                remove,
56            })
57            .send()
58            .await?
59            .error_for_status()?;
60
61        Ok(())
62    }
63
64    /// Closes a channel / leaves group
65    pub async fn close_channel(&self, channel_id: ChannelId) -> Result {
66        self.client
67            .delete(ep!(self, "/channels/{}" channel_id))
68            .send()
69            .await?
70            .error_for_status()?;
71
72        Ok(())
73    }
74
75    /// Creates an invite
76    pub async fn create_invite(
77        &self,
78        channel_id: ChannelId,
79    ) -> Result<CreateChannelInviteResponse> {
80        Ok(self
81            .client
82            .post(ep!(self, "/channels/{}/invites" channel_id))
83            .send()
84            .await?
85            .error_for_status()?
86            .json()
87            .await?)
88    }
89
90    /// Sets role permissions
91    pub async fn set_channel_role_permissions(
92        &self,
93        channel_id: ChannelId,
94        role_id: RoleId,
95        permissions: ChannelPermissions,
96    ) -> Result {
97        self.client
98            .put(ep!(self, "/channels/{}/permissions/{}" channel_id, role_id))
99            .json(&PermissionsUpdateRequest { permissions })
100            .send()
101            .await?
102            .error_for_status()?;
103
104        Ok(())
105    }
106
107    /// Sets default permissions
108    pub async fn set_channel_default_role_permissions(
109        &self,
110        channel_id: ChannelId,
111        permissions: ChannelPermissions,
112    ) -> Result {
113        self.client
114            .put(ep!(self, "/channels/{}/permissions/default" channel_id))
115            .json(&PermissionsUpdateRequest { permissions })
116            .send()
117            .await?
118            .error_for_status()?;
119
120        Ok(())
121    }
122}
123
124#[derive(Serialize)]
125pub struct PermissionsUpdateRequest {
126    pub permissions: ChannelPermissions,
127}