summaryrefslogtreecommitdiff
path: root/src/frankerfacez.rs
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 /src/frankerfacez.rs
parent918afb51dbd7abd535f425f5176cac05c14a56dc (diff)
feat: get frankerfacez emotes
Diffstat (limited to 'src/frankerfacez.rs')
-rw-r--r--src/frankerfacez.rs73
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)
+ }
+}