From 7c1bd99be3945c187572db951dd7816f131e7f75 Mon Sep 17 00:00:00 2001 From: Tom Bloor Date: Sat, 20 Apr 2024 23:48:59 +0100 Subject: [PATCH] refactor avatar_fetch out --- src/avatar_fetch.rs | 63 +++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 63 ++------------------------------------------- 2 files changed, 65 insertions(+), 61 deletions(-) create mode 100644 src/avatar_fetch.rs diff --git a/src/avatar_fetch.rs b/src/avatar_fetch.rs new file mode 100644 index 0000000..847603d --- /dev/null +++ b/src/avatar_fetch.rs @@ -0,0 +1,63 @@ +use twitch_api::TwitchClient; +use twitch_oauth2::AppAccessToken; +use std::error::Error; +use twitch_api::helix::users; +use crate::config; +use crate::user_data::UserData; + +pub struct AvatarFetch { + client: TwitchClient<'static, reqwest::Client>, + token: AppAccessToken, +} + +impl AvatarFetch { + pub fn new(client: TwitchClient<'static, reqwest::Client>, token: AppAccessToken) -> Self { + AvatarFetch { + client, + token, + } + } + + pub async fn connect(config: &config::TwitchConfig) -> Result> { + let client: TwitchClient = TwitchClient::new(); + let token = AppAccessToken::get_app_access_token( + &client, + config.client_id().into(), + config.client_secret().into(), + vec![], + ).await?; + Ok(Self::new(client, token)) + } + + pub async fn get_user_by_id(&self, id: &str) -> Result, Box> { + let mut request = users::GetUsersRequest::new(); + let ids: &[&twitch_types::UserIdRef] = &[id.into()]; + request.id = ids.into(); + let response: Vec = self.client.helix.req_get(request, &self.token).await?.data; + + Ok(self.user_from_response(response)) + } + + pub fn user_from_response(&self, response: Vec) -> Option { + if let Some(user) = response.first() { + dbg!(user); + Some(UserData::new( + user.login.to_string(), + user.display_name.to_string(), + user.id.to_string(), + user.profile_image_url.clone().unwrap_or("".to_string()), + )) + } else { + None + } + } + + pub async fn get_user_by_name(&self, name: &str) -> Result, Box> { + let mut request = users::GetUsersRequest::new(); + let logins: &[&twitch_types::UserNameRef] = &[name.into()]; + request.login = logins.into(); + let response: Vec = self.client.helix.req_get(request, &self.token).await?.data; + + Ok(self.user_from_response(response)) + } +} diff --git a/src/main.rs b/src/main.rs index 2302cc7..4528f70 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,14 @@ use std::error::Error; -use twitch_api::helix::users::get_users; -use twitch_api::twitch_oauth2::AppAccessToken; -use twitch_api::TwitchClient; +use avatar_fetch::AvatarFetch; use crate::avatar_cache::AvatarCache; use crate::config::Config; -use crate::user_data::UserData; mod user_data; mod avatar_cache; mod config; +mod avatar_fetch; #[tokio::main] async fn main() -> Result<(), Box> { @@ -36,60 +34,3 @@ async fn main() -> Result<(), Box> { Ok(()) } - -struct AvatarFetch { - client: TwitchClient<'static, reqwest::Client>, - token: AppAccessToken, -} - -impl AvatarFetch { - fn new(client: TwitchClient<'static, reqwest::Client>, token: AppAccessToken) -> Self { - AvatarFetch { - client, - token, - } - } - - async fn connect(config: &config::TwitchConfig) -> Result> { - let client: TwitchClient = TwitchClient::new(); - let token = AppAccessToken::get_app_access_token( - &client, - config.client_id().into(), - config.client_secret().into(), - vec![], - ).await?; - Ok(Self::new(client, token)) - } - - async fn get_user_by_id(&self, id: &str) -> Result, Box> { - let mut request = get_users::GetUsersRequest::new(); - let ids: &[&twitch_types::UserIdRef] = &[id.into()]; - request.id = ids.into(); - let response: Vec = self.client.helix.req_get(request, &self.token).await?.data; - - Ok(self.user_from_response(response)) - } - - fn user_from_response(&self, response: Vec) -> Option { - if let Some(user) = response.first() { - dbg!(user); - Some(UserData::new( - user.login.to_string(), - user.display_name.to_string(), - user.id.to_string(), - user.profile_image_url.clone().unwrap_or("".to_string()), - )) - } else { - None - } - } - - async fn get_user_by_name(&self, name: &str) -> Result, Box> { - let mut request = get_users::GetUsersRequest::new(); - let logins: &[&twitch_types::UserNameRef] = &[name.into()]; - request.login = logins.into(); - let response: Vec = self.client.helix.req_get(request, &self.token).await?.data; - - Ok(self.user_from_response(response)) - } -}