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 | |
| parent | 918afb51dbd7abd535f425f5176cac05c14a56dc (diff) | |
feat: get frankerfacez emotes
| -rw-r--r-- | src/emotes.rs | 8 | ||||
| -rw-r--r-- | src/frankerfacez.rs | 73 | ||||
| -rw-r--r-- | src/lib.rs | 33 |
3 files changed, 111 insertions, 3 deletions
diff --git a/src/emotes.rs b/src/emotes.rs index 79534e7..7242f82 100644 --- a/src/emotes.rs +++ b/src/emotes.rs @@ -1,4 +1,12 @@ use reqwest::Error; +use serde::{Deserialize, Serialize}; + +#[derive(Deserialize, Serialize, Clone, Debug)] +pub struct Emote { + pub id: String, + pub code: String, + pub original_code: Option<String>, +} pub trait RetrieveEmoteAPI<T> { async fn get_channel_emotes(&self, channel_login: &str) -> Result<Vec<T>, Error>; 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) + } +} @@ -1,10 +1,13 @@ -pub mod emotes; - pub mod betterttv; +pub mod emotes; +pub mod frankerfacez; #[cfg(test)] mod tests { - use crate::{betterttv::BetterTTVAPIClient, emotes::RetrieveEmoteAPI}; + use crate::{ + betterttv::BetterTTVAPIClient, emotes::RetrieveEmoteAPI, + frankerfacez::FrankerFaceZAPIClient, + }; #[tokio::test] async fn get_betterttv_channel_emotes() { @@ -29,4 +32,28 @@ mod tests { assert_eq!(emotes.len() >= 1, true); } + + #[tokio::test] + async fn get_frankerfacez_channel_emotes() { + let ffz = FrankerFaceZAPIClient::new(); + let emotes = ffz.get_channel_emotes("555579413").await; + + assert_eq!(emotes.is_ok(), true); + + let emotes = emotes.unwrap(); + + assert_eq!(emotes.len() >= 1, true); + } + + #[tokio::test] + async fn get_frankerfacez_global_emotes() { + let ffz = FrankerFaceZAPIClient::new(); + let emotes = ffz.get_global_emotes().await; + + assert_eq!(emotes.is_ok(), true); + + let emotes = emotes.unwrap(); + + assert_eq!(emotes.len() >= 1, true); + } } |
