1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use crate::error::{KickApiError, Result};
use crate::models::{SendMessageRequest, SendMessageResponse};
use reqwest;
/// Chat API - handles chat message endpoints
///
/// Scopes required: `chat:write`, `moderation:chat_message:manage`
pub struct ChatApi<'a> {
client: &'a reqwest::Client,
token: &'a Option<String>,
base_url: &'a str,
}
impl<'a> ChatApi<'a> {
/// Create a new ChatApi instance
pub(crate) fn new(
client: &'a reqwest::Client,
token: &'a Option<String>,
base_url: &'a str,
) -> Self {
Self {
client,
token,
base_url,
}
}
/// Send a chat message
///
/// Requires OAuth token with `chat:write` scope
///
/// # Example
/// ```no_run
/// use kick_api::SendMessageRequest;
///
/// let request = SendMessageRequest {
/// r#type: "user".to_string(),
/// content: "Hello chat!".to_string(),
/// broadcaster_user_id: Some(12345),
/// reply_to_message_id: None,
/// };
/// let response = client.chat().send_message(request).await?;
/// println!("Message sent: {}", response.message_id);
/// ```
pub async fn send_message(&self, request: SendMessageRequest) -> Result<SendMessageResponse> {
super::require_token(self.token)?;
let url = format!("{}/chat", self.base_url);
let request = self
.client
.post(&url)
.header("Accept", "*/*")
.bearer_auth(self.token.as_ref().unwrap())
.json(&request);
let response = crate::http::send_with_retry(self.client, request).await?;
if response.status().is_success() {
let body = response.text().await?;
#[derive(serde::Deserialize)]
struct DataResponse {
data: SendMessageResponse,
}
let resp: DataResponse = serde_json::from_str(&body)
.map_err(|e| KickApiError::ApiError(format!("JSON parse error: {}", e)))?;
Ok(resp.data)
} else {
Err(KickApiError::ApiError(format!(
"Failed to send message: {}",
response.status()
)))
}
}
/// Delete a chat message
///
/// Requires OAuth token with `moderation:chat_message:manage` scope
///
/// # Example
/// ```no_run
/// client.chat().delete_message("message_id_here").await?;
/// ```
pub async fn delete_message(&self, message_id: &str) -> Result<()> {
super::require_token(self.token)?;
let url = format!("{}/chat/{}", self.base_url, message_id);
let request = self
.client
.delete(&url)
.header("Accept", "*/*")
.bearer_auth(self.token.as_ref().unwrap());
let response = crate::http::send_with_retry(self.client, request).await?;
if response.status().is_success() {
Ok(())
} else {
Err(KickApiError::ApiError(format!(
"Failed to delete message: {}",
response.status()
)))
}
}
}