diff options
| author | ilotterytea <iltsu@alright.party> | 2025-04-04 01:18:47 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-04-04 01:18:47 +0500 |
| commit | 89b2b38f9c9cbc1419676de055bad93a2ef1c428 (patch) | |
| tree | 0bf867a0dfb038818f07d3fddadfc09fe61674da /src/frankerfacez.rs | |
| parent | 918afb51dbd7abd535f425f5176cac05c14a56dc (diff) | |
feat: get frankerfacez emotes
Diffstat (limited to 'src/frankerfacez.rs')
| -rw-r--r-- | src/frankerfacez.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/frankerfacez.rs b/src/frankerfacez.rs new file mode 100644 index 0000000..1b40f21 --- /dev/null +++ b/src/frankerfacez.rs @@ -0,0 +1,73 @@ +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<Emote> { + 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<Emote> for FrankerFaceZAPIClient { + async fn get_channel_emotes(&self, channel_id: &str) -> Result<Vec<Emote>, 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<Vec<Emote>, 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) + } +} |
