1use crate::error::HttpError;
2use crate::HttpClient;
3use serde::Serialize;
4use titanium_model::{GuildMember, Role, Snowflake};
5
6impl HttpClient {
7 pub async fn get_member(
13 &self,
14 guild_id: Snowflake,
15 user_id: Snowflake,
16 ) -> Result<GuildMember<'static>, HttpError> {
17 let route = format!("/guilds/{}/members/{}", guild_id, user_id);
18 self.get(&route).await
19 }
20
21 pub async fn list_members(
25 &self,
26 guild_id: Snowflake,
27 limit: Option<u32>,
28 after: Option<Snowflake>,
29 ) -> Result<Vec<GuildMember<'static>>, HttpError> {
30 #[derive(Serialize)]
31 struct Query {
32 limit: u32,
33 after: Option<Snowflake>,
34 }
35
36 let query = Query {
37 limit: limit.unwrap_or(1),
38 after,
39 };
40
41 let route = format!("/guilds/{}/members", guild_id);
42 self.get_with_query(&route, &query).await
43 }
44
45 pub async fn kick_member(
47 &self,
48 guild_id: Snowflake,
49 user_id: Snowflake,
50 reason: Option<&str>,
51 ) -> Result<(), HttpError> {
52 let route = format!("/guilds/{}/members/{}", guild_id, user_id);
53
54 let headers = reason.map(|r| {
55 let mut h = reqwest::header::HeaderMap::new();
56 h.insert(
57 "X-Audit-Log-Reason",
58 reqwest::header::HeaderValue::from_str(r).unwrap(),
59 ); h
61 });
62
63 self.delete_with_headers(&route, headers).await
69 }
70
71 pub async fn ban_member(
75 &self,
76 guild_id: Snowflake,
77 user_id: Snowflake,
78 delete_message_seconds: Option<u32>,
79 reason: Option<&str>,
80 ) -> Result<(), HttpError> {
81 #[derive(Serialize)]
82 struct BanBody {
83 delete_message_seconds: Option<u32>,
84 }
85
86 let body = BanBody {
87 delete_message_seconds,
88 };
89 let route = format!("/guilds/{}/bans/{}", guild_id, user_id);
90
91 let headers = reason.and_then(|r| {
92 reqwest::header::HeaderValue::from_str(r).ok().map(|v| {
93 let mut h = reqwest::header::HeaderMap::new();
94 h.insert("X-Audit-Log-Reason", v);
95 h
96 })
97 });
98
99 self.put_with_headers(&route, Some(body), headers).await
100 }
101
102 pub async fn unban_member(
104 &self,
105 guild_id: Snowflake,
106 user_id: Snowflake,
107 reason: Option<&str>,
108 ) -> Result<(), HttpError> {
109 let route = format!("/guilds/{}/bans/{}", guild_id, user_id);
110
111 let headers = reason.and_then(|r| {
112 reqwest::header::HeaderValue::from_str(r).ok().map(|v| {
113 let mut h = reqwest::header::HeaderMap::new();
114 h.insert("X-Audit-Log-Reason", v);
115 h
116 })
117 });
118
119 self.delete_with_headers(&route, headers).await
120 }
121
122 pub async fn modify_member(
124 &self,
125 guild_id: Snowflake,
126 user_id: Snowflake,
127 params: &titanium_model::builder::ModifyMember<'_>,
128 ) -> Result<GuildMember<'static>, HttpError> {
129 let route = format!("/guilds/{}/members/{}", guild_id, user_id);
130 self.patch(&route, params).await
131 }
132
133 pub async fn get_roles(&self, guild_id: Snowflake) -> Result<Vec<Role<'static>>, HttpError> {
139 let route = format!("/guilds/{}/roles", guild_id);
140 self.get(&route).await
141 }
142
143 pub async fn create_role(
145 &self,
146 guild_id: Snowflake,
147 params: &titanium_model::builder::CreateRole<'_>,
148 ) -> Result<Role<'static>, HttpError> {
149 let route = format!("/guilds/{}/roles", guild_id);
150 self.post(&route, params).await
151 }
152
153 pub async fn delete_role(
155 &self,
156 guild_id: Snowflake,
157 role_id: Snowflake,
158 reason: Option<&str>,
159 ) -> Result<(), HttpError> {
160 let route = format!("/guilds/{}/roles/{}", guild_id, role_id);
161
162 let headers = reason.map(|r| {
163 let mut h = reqwest::header::HeaderMap::new();
164 h.insert(
165 "X-Audit-Log-Reason",
166 reqwest::header::HeaderValue::from_str(r).unwrap(),
167 );
168 h
169 });
170
171 self.delete_with_headers(&route, headers).await
172 }
173}