From c2d3c81a1b27bbb020347a65959987cec60513d8 Mon Sep 17 00:00:00 2001 From: jellejurre Date: Mon, 25 Nov 2024 12:29:14 +0100 Subject: [PATCH] Update examples and add cookie examples --- examples/cookies_load.rs | 31 ++++++++++++ examples/cookies_store.rs | 76 ++++++++++++++++++++++++++++++ examples/{online.rs => example.rs} | 10 ++-- 3 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 examples/cookies_load.rs create mode 100644 examples/cookies_store.rs rename examples/{online.rs => example.rs} (84%) diff --git a/examples/cookies_load.rs b/examples/cookies_load.rs new file mode 100644 index 0000000..43a1587 --- /dev/null +++ b/examples/cookies_load.rs @@ -0,0 +1,31 @@ +use std::io::{self, Write}; +use reqwest::header::{HeaderMap, HeaderValue}; +pub use vrchatapi::apis; +use vrchatapi::models::{EitherUserOrTwoFactor, TwoFactorAuthCode, TwoFactorEmailCode}; + +#[tokio::main] +async fn main() { + let mut config = apis::configuration::Configuration::default(); + config.basic_auth = Some((String::from("username"), Some(String::from("password")))); + config.user_agent = Some(String::from("ProjectName/0.0.1 email@example.com")); + + let mut header_map = HeaderMap::new(); + header_map.append("Cookie", HeaderValue::from_str( + &"auth=[AUTH_COOKIE_HERE]; twoFactorAuth=[TWO_FACTOR_AUTH_COOKIE_HERE]" + ).unwrap()); + + config.client = reqwest::Client::builder() + .cookie_store(true) + .default_headers(header_map) + .build() + .unwrap(); + + let user = apis::authentication_api::get_current_user(&config) + .await + .unwrap(); + + match user { + EitherUserOrTwoFactor::CurrentUser(user) => println!("Current user: {}", user.display_name), + EitherUserOrTwoFactor::RequiresTwoFactorAuth(_) => println!("cookie invalid") + } +} diff --git a/examples/cookies_store.rs b/examples/cookies_store.rs new file mode 100644 index 0000000..9616eba --- /dev/null +++ b/examples/cookies_store.rs @@ -0,0 +1,76 @@ +use std::io::{self, Write}; +use std::str::FromStr; +use reqwest::cookie::CookieStore; +use url::Url; +pub use vrchatapi::apis; +use vrchatapi::models::{EitherUserOrTwoFactor, TwoFactorAuthCode, TwoFactorEmailCode}; + +#[tokio::main] +async fn main() { + let mut config = apis::configuration::Configuration::default(); + config.basic_auth = Some((String::from("username"), Some(String::from("password")))); + config.user_agent = Some(String::from("ProjectName/0.0.1 email@example.com")); + + let cookie_store = std::sync::Arc::new(reqwest::cookie::Jar::default()); + config.client = reqwest::Client::builder() + .cookie_store(true) + .cookie_provider(cookie_store.clone()) + .build() + .unwrap(); + + match apis::authentication_api::get_current_user(&config) + .await + .unwrap() + { + vrchatapi::models::EitherUserOrTwoFactor::CurrentUser(me) => { + println!("Username: {}", me.username.unwrap()) + } + vrchatapi::models::EitherUserOrTwoFactor::RequiresTwoFactorAuth(requires_auth) => { + if requires_auth.requires_two_factor_auth.contains(&String::from("emailOtp")){ + let code = read_user_input("Please enter your Email 2fa code: "); + if let Err(err) = apis::authentication_api::verify2_fa_email_code( + &config, + TwoFactorEmailCode::new(code), + ) + .await + { + eprintln!("Error verifying 2FA email code: {}", err); + } + } else { + let code = read_user_input("Please enter your Authenticator 2fa code: "); + if let Err(err) = apis::authentication_api::verify2_fa( + &config, + TwoFactorAuthCode::new(code), + ) + .await + { + eprintln!("Error verifying 2FA auth code: {}", err); + } + } + + } + } + + let user = apis::authentication_api::get_current_user(&config) + .await + .unwrap(); + + match user { + EitherUserOrTwoFactor::CurrentUser(user) => println!("Current user: {}", user.display_name), + EitherUserOrTwoFactor::RequiresTwoFactorAuth(_) => println!("cookie invalid") + } + + println!("Cookie:{}", cookie_store.cookies(&Url::from_str("https://api.vrchat.cloud").expect("Url not okay")).expect("Cookies not found").to_str().expect("Cookies not valid string")); +} + +fn read_user_input(prompt: &str) -> String { + print!("{}", prompt); + io::stdout().flush().expect("Failed to flush stdout"); + + let mut input = String::new(); + io::stdin() + .read_line(&mut input) + .expect("Failed to read line"); + + input.trim().to_string() +} diff --git a/examples/online.rs b/examples/example.rs similarity index 84% rename from examples/online.rs rename to examples/example.rs index 258f2cd..2d99a95 100644 --- a/examples/online.rs +++ b/examples/example.rs @@ -1,6 +1,6 @@ use std::io::{self, Write}; pub use vrchatapi::apis; -use vrchatapi::models::{TwoFactorAuthCode, TwoFactorEmailCode}; +use vrchatapi::models::{EitherUserOrTwoFactor, TwoFactorAuthCode, TwoFactorEmailCode}; #[tokio::main] async fn main() { @@ -40,10 +40,14 @@ async fn main() { } } - let online = apis::system_api::get_current_online_users(&config) + let user = apis::authentication_api::get_current_user(&config) .await .unwrap(); - println!("Current Online Users: {}", online); + + match user { + EitherUserOrTwoFactor::CurrentUser(user) => println!("Current user: {}", user.display_name), + EitherUserOrTwoFactor::RequiresTwoFactorAuth(_) => println!("cookie invalid") + } } fn read_user_input(prompt: &str) -> String {