use reqwest::{Client, Error}; use serde_json::Value; use crate::emotes::{Emote, RetrieveEmoteAPI}; pub struct FrankerFaceZAPIClient { client: Client, base_url: String, } impl FrankerFaceZAPIClient { pub fn new() -> Self { Self { client: Client::new(), base_url: "https://api.frankerfacez.com/v1".into(), } } fn parse_emoteset(&self, emotesets_json: &Value) -> Vec { let mut emotes = Vec::new(); for (_, set) in emotesets_json.as_object().unwrap() { let emoticons = set.get("emoticons").unwrap().as_array().unwrap(); for emoticon in emoticons { let emote = Emote { id: emoticon.get("id").unwrap().to_string(), code: emoticon.get("name").unwrap().to_string(), original_code: None, }; emotes.push(emote); } } emotes } } impl RetrieveEmoteAPI for FrankerFaceZAPIClient { async fn get_channel_emotes(&self, channel_id: &str) -> Result, Error> { let response = self .client .get(format!("{}/room/id/{}", self.base_url, channel_id)) .send() .await? .error_for_status()?; let json: Value = response.json().await?; let sets = json.get("sets").unwrap(); let emotes = self.parse_emoteset(sets); Ok(emotes) } async fn get_global_emotes(&self) -> Result, Error> { let response = self .client .get(format!("{}/set/global", self.base_url)) .send() .await? .error_for_status()?; let json: Value = response.json().await?; let sets = json.get("sets").unwrap(); let emotes = self.parse_emoteset(sets); Ok(emotes) } }