diff --git a/examples/cookies_load.rs b/examples/cookies_load.rs new file mode 100644 index 0000000..6f954ba --- /dev/null +++ b/examples/cookies_load.rs @@ -0,0 +1,39 @@ +use reqwest::cookie::CookieStore; +use reqwest::header::HeaderValue; +use std::str::FromStr; +use std::sync::Arc; +pub use vrchatapi::apis; +use vrchatapi::models::EitherUserOrTwoFactor; + +#[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 jar = reqwest::cookie::Jar::default(); + jar.set_cookies( + &mut [HeaderValue::from_str( + &"auth=[AUTH_COOKIE_HERE], twoFactorAuth=[TWO_FACTOR_AUTH_COOKIE_HERE]", + ) + .expect("Cookie not okay")] + .iter(), + &url::Url::from_str("https://api.vrchat.cloud").expect("Url not okay"), + ); + let jar = Arc::new(jar); + + config.client = reqwest::Client::builder() + .cookie_store(true) + .cookie_provider(jar) + .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..52e58a0 --- /dev/null +++ b/examples/cookies_store.rs @@ -0,0 +1,83 @@ +use reqwest::cookie::CookieStore; +use std::io::{self, Write}; +use std::str::FromStr; +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/example.rs b/examples/example.rs new file mode 100644 index 0000000..39fb5da --- /dev/null +++ b/examples/example.rs @@ -0,0 +1,63 @@ +use std::io::{self, Write}; +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")); + 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"), + } +} + +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/online.rs deleted file mode 100644 index 0a1ad52..0000000 --- a/examples/online.rs +++ /dev/null @@ -1,25 +0,0 @@ -pub use vrchatapi::apis; - -#[tokio::main] -async fn main() { - let mut config = apis::configuration::Configuration::default(); - config.basic_auth = Some((String::from("username"), Some(String::from("password")))); - - 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) => println!( - "The Username requires Auth: {:?}", - requires_auth.requires_two_factor_auth - ), - } - - let online = apis::system_api::get_current_online_users(&config) - .await - .unwrap(); - println!("Current Online Users: {}", online); -}