diff options
| author | ilotterytea <iltsu@alright.party> | 2025-04-04 15:16:47 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-04-04 15:16:47 +0500 |
| commit | 8b156e7e62a5e8c36c671ba7a4ea7cdc39635c05 (patch) | |
| tree | e152c69749e2ea9f6037d895e0b6785b5bd921ff | |
| parent | ddd6f94e136de54dec68d4d2c90c944ad239b8e3 (diff) | |
feat: get 7tv emotes
| -rw-r--r-- | src/lib.rs | 27 | ||||
| -rw-r--r-- | src/seventv.rs | 84 |
2 files changed, 110 insertions, 1 deletions
@@ -1,12 +1,13 @@ pub mod betterttv; pub mod emotes; pub mod frankerfacez; +pub mod seventv; #[cfg(test)] mod tests { use crate::{ betterttv::BetterTTVAPIClient, emotes::RetrieveEmoteAPI, - frankerfacez::FrankerFaceZAPIClient, + frankerfacez::FrankerFaceZAPIClient, seventv::SevenTVAPIClient, }; #[tokio::test] @@ -56,4 +57,28 @@ mod tests { assert_eq!(emotes.len() >= 1, true); } + + #[tokio::test] + async fn get_seventv_channel_emotes() { + let stv = SevenTVAPIClient::new(); + let emotes = stv.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_seventv_global_emotes() { + let stv = SevenTVAPIClient::new(); + let emotes = stv.get_global_emotes().await; + + assert_eq!(emotes.is_ok(), true); + + let emotes = emotes.unwrap(); + + assert_eq!(emotes.len() >= 1, true); + } } diff --git a/src/seventv.rs b/src/seventv.rs new file mode 100644 index 0000000..97d462b --- /dev/null +++ b/src/seventv.rs @@ -0,0 +1,84 @@ +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<Emote> { + 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<String> = if code.eq(&o_code) { None } else { Some(o_code) }; + + emotes.push(Emote { + id, + code, + original_code, + }); + } + + emotes + } +} + +impl RetrieveEmoteAPI<Emote> for SevenTVAPIClient { + async fn get_channel_emotes(&self, channel_id: &str) -> Result<Vec<Emote>, 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<Vec<Emote>, 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) + } +} |
