summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-04-04 01:18:47 +0500
committerilotterytea <iltsu@alright.party>2025-04-04 01:18:47 +0500
commit89b2b38f9c9cbc1419676de055bad93a2ef1c428 (patch)
tree0bf867a0dfb038818f07d3fddadfc09fe61674da
parent918afb51dbd7abd535f425f5176cac05c14a56dc (diff)
feat: get frankerfacez emotes
-rw-r--r--src/emotes.rs8
-rw-r--r--src/frankerfacez.rs73
-rw-r--r--src/lib.rs33
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)
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index b3f80ed..b293ab7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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);
+ }
}