* fix(app-frontend): do not emit exceptions when no loaders are available * refactor(app): simplify Microsoft login code without functional changes * feat(app): external browser auth flow for Modrinth account login * chore: address Clippy lint * chore(app/oauth_utils): simplify `handle_reply` error handling according to review * chore(app-lib): simplify `Url` usage out of MC auth module
59 lines
1.7 KiB
Rust
59 lines
1.7 KiB
Rust
#![cfg_attr(
|
|
all(not(debug_assertions), target_os = "windows"),
|
|
windows_subsystem = "windows"
|
|
)]
|
|
|
|
use enumset::EnumSet;
|
|
use theseus::prelude::*;
|
|
use theseus::worlds::get_recent_worlds;
|
|
|
|
// A simple Rust implementation of the authentication run
|
|
// 1) call the authenticate_begin_flow() function to get the URL to open (like you would in the frontend)
|
|
// 2) open the URL in a browser
|
|
// 3) call the authenticate_await_complete_flow() function to get the credentials (like you would in the frontend)
|
|
pub async fn authenticate_run() -> theseus::Result<Credentials> {
|
|
println!("A browser window will now open, follow the login flow there.");
|
|
let login = minecraft_auth::begin_login().await?;
|
|
|
|
println!("Open URL {} in a browser", login.auth_request_uri.as_str());
|
|
|
|
println!("Please enter URL code: ");
|
|
let mut input = String::new();
|
|
std::io::stdin()
|
|
.read_line(&mut input)
|
|
.expect("error: unable to read user input");
|
|
|
|
println!("You entered: {}", input.trim());
|
|
|
|
let credentials = minecraft_auth::finish_login(&input, login).await?;
|
|
|
|
println!(
|
|
"Logged in user {}.",
|
|
credentials.maybe_online_profile().await.name
|
|
);
|
|
Ok(credentials)
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> theseus::Result<()> {
|
|
println!("Starting.");
|
|
|
|
let _log_guard = theseus::start_logger();
|
|
|
|
// Initialize state
|
|
State::init().await?;
|
|
|
|
let worlds = get_recent_worlds(4, EnumSet::all()).await?;
|
|
for world in worlds {
|
|
println!(
|
|
"World: {:?}/{:?} played at {:?}: {:#?}",
|
|
world.profile,
|
|
world.world.name,
|
|
world.world.last_played,
|
|
world.world.details
|
|
);
|
|
}
|
|
|
|
Ok(())
|
|
}
|