use azalea::{account::yggdrasil::Backend, prelude::*}; use clap::Parser; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] struct Args { /// Player name #[arg(short, long)] username: String, /// Drasl backend to authenticate with (should have /auth, /session and optionally /player routes) #[arg(short, long)] backend: String, /// Minecraft server to connect to #[arg(short, long)] server: String, /// If not present, password will be queried at runtime as needed. Drasl Minecraft Token can be used instead of password. #[arg(short, long)] password: Option, /// Disable requesting signing certificates #[arg(short, long, default_value_t = false)] no_certs: bool, } #[tokio::main] async fn main() -> AppExit { let args = Args::parse(); let backend = Backend::new_drasl(&args.backend, !args.no_certs); let account = match args.password { None => Account::yggdrasil(args.username.clone(), backend).await, Some(x) => { Account::yggdrasil_with_password(args.username.clone(), x.clone(), backend).await } }; let account = match account { Ok(x) => x, Err(e) => { eprintln!("Error logging in: {e}"); return AppExit::error(); } }; ClientBuilder::new() .set_handler(handle) .start(account, args.server.as_str()) .await } #[derive(Default, Clone, Component)] pub struct State {} async fn handle(_bot: Client, event: Event, _state: State) -> Result<(), ()> { match event { Event::Chat(m) => { println!("{}", m.message().to_ansi()); } _ => {} } Ok(()) }