1use crate::error::{KickApiError, Result};
2use crate::models::{SendMessageRequest, SendMessageResponse};
3use reqwest;
4
5pub struct ChatApi<'a> {
9 client: &'a reqwest::Client,
10 token: &'a Option<String>,
11 base_url: &'a str,
12}
13
14impl<'a> ChatApi<'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 send_message(&self, request: SendMessageRequest) -> Result<SendMessageResponse> {
46 super::require_token(self.token)?;
47
48 let url = format!("{}/chat", self.base_url);
49 let request = self
50 .client
51 .post(&url)
52 .header("Accept", "*/*")
53 .bearer_auth(self.token.as_ref().unwrap())
54 .json(&request);
55 let response = crate::http::send_with_retry(self.client, request).await?;
56
57 if response.status().is_success() {
58 let body = response.text().await?;
59
60 #[derive(serde::Deserialize)]
61 struct DataResponse {
62 data: SendMessageResponse,
63 }
64
65 let resp: DataResponse = serde_json::from_str(&body)
66 .map_err(|e| KickApiError::ApiError(format!("JSON parse error: {}", e)))?;
67
68 Ok(resp.data)
69 } else {
70 Err(KickApiError::ApiError(format!(
71 "Failed to send message: {}",
72 response.status()
73 )))
74 }
75 }
76
77 pub async fn delete_message(&self, message_id: &str) -> Result<()> {
86 super::require_token(self.token)?;
87
88 let url = format!("{}/chat/{}", self.base_url, message_id);
89 let request = self
90 .client
91 .delete(&url)
92 .header("Accept", "*/*")
93 .bearer_auth(self.token.as_ref().unwrap());
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 delete message: {}",
101 response.status()
102 )))
103 }
104 }
105
106}