use reqwest::{Client, Error}; use serde_json::Value; use crate::emotes::{Emote, RetrieveEmoteAPI}; pub struct SevenTVAPIClient { client: Client, base_url: String, } impl SevenTVAPIClient { pub fn new() -> Self { Self { client: Client::new(), base_url: "https://7tv.io/v3".into(), } } fn parse_emoteset(&self, emotesets_json: &Value) -> Vec { let mut emotes = Vec::new(); let emote_values = emotesets_json.get("emotes").unwrap().as_array().unwrap(); for emote_value in emote_values { let id = emote_value.get("id").unwrap().as_str().unwrap().to_string(); let code = emote_value .get("name") .unwrap() .as_str() .unwrap() .to_string(); let o_code = emote_value .get("data") .unwrap() .get("name") .unwrap() .to_string(); let original_code: Option = if code.eq(&o_code) { None } else { Some(o_code) }; emotes.push(Emote { id, code, original_code, }); } emotes } } impl RetrieveEmoteAPI for SevenTVAPIClient { async fn get_channel_emotes(&self, channel_id: &str) -> Result, Error> { let response = self .client .get(format!("{}/users/twitch/{}", self.base_url, channel_id)) .send() .await? .error_for_status()?; let json: Value = response.json().await?; let set = json.get("emote_set").unwrap(); let emotes = self.parse_emoteset(set); Ok(emotes) } async fn get_global_emotes(&self) -> Result, Error> { let response = self .client .get(format!("{}/emote-sets/global", self.base_url)) .send() .await? .error_for_status()?; let json: Value = response.json().await?; let emotes = self.parse_emoteset(&json); Ok(emotes) } }