summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-04-04 15:16:47 +0500
committerilotterytea <iltsu@alright.party>2025-04-04 15:16:47 +0500
commit8b156e7e62a5e8c36c671ba7a4ea7cdc39635c05 (patch)
treee152c69749e2ea9f6037d895e0b6785b5bd921ff
parentddd6f94e136de54dec68d4d2c90c944ad239b8e3 (diff)
feat: get 7tv emotes
-rw-r--r--src/lib.rs27
-rw-r--r--src/seventv.rs84
2 files changed, 110 insertions, 1 deletions
diff --git a/src/lib.rs b/src/lib.rs
index b293ab7..404bc4b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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)
+ }
+}