kick_api/api/
moderation.rs1use crate::error::{KickApiError, Result};
2use crate::models::{BanRequest, UnbanRequest};
3use reqwest;
4
5pub struct ModerationApi<'a> {
9 client: &'a reqwest::Client,
10 token: &'a Option<String>,
11 base_url: &'a str,
12}
13
14impl<'a> ModerationApi<'a> {
15 pub(crate) fn new(
17 client: &'a reqwest::Client,
18 token: &'a Option<String>,
19 base_url: &'a str,
20 ) -> Self {
21 Self {
22 client,
23 token,
24 base_url,
25 }
26 }
27
28 pub async fn ban(&self, request: BanRequest) -> Result<()> {
49 self.require_token()?;
50
51 let url = format!("{}/moderation/bans", self.base_url);
52 let request = self
53 .client
54 .post(&url)
55 .header("Accept", "*/*")
56 .bearer_auth(self.token.as_ref().unwrap())
57 .json(&request);
58 let response = crate::http::send_with_retry(self.client, request).await?;
59
60 if response.status().is_success() {
61 Ok(())
62 } else {
63 Err(KickApiError::ApiError(format!(
64 "Failed to ban user: {}",
65 response.status()
66 )))
67 }
68 }
69
70 pub async fn unban(&self, request: UnbanRequest) -> Result<()> {
85 self.require_token()?;
86
87 let url = format!("{}/moderation/bans", self.base_url);
88 let request = self
89 .client
90 .delete(&url)
91 .header("Accept", "*/*")
92 .bearer_auth(self.token.as_ref().unwrap())
93 .json(&request);
94 let response = crate::http::send_with_retry(self.client, request).await?;
95
96 if response.status().is_success() {
97 Ok(())
98 } else {
99 Err(KickApiError::ApiError(format!(
100 "Failed to unban user: {}",
101 response.status()
102 )))
103 }
104 }
105
106 fn require_token(&self) -> Result<()> {
107 if self.token.is_none() {
108 return Err(KickApiError::ApiError(
109 "OAuth token required for this endpoint".to_string(),
110 ));
111 }
112 Ok(())
113 }
114}