use late_java_core::{
Launch, MicrosoftAuth, LaunchOptions, MemoryOptions, LoaderOptions,
ScreenOptions, JavaOptions, VersionManifest, StatusClient, init_logger
};
use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
init_logger();
println!("=== Late Java Core - Ejemplo Completo ===");
println!("\n1. Obteniendo versiones disponibles...");
let manifest = VersionManifest::fetch().await?;
println!(" Última release: {}", manifest.latest.release);
println!(" Última snapshot: {}", manifest.latest.snapshot);
println!(" Versiones disponibles:");
for (i, version) in manifest.versions.iter().take(5).enumerate() {
println!(" {}. {} ({})", i + 1, version.id, version.r#type);
}
println!("\n2. Autenticación Microsoft...");
let auth = MicrosoftAuth::new("00000000402b5328".to_string());
let auth_result = late_java_core::AuthResponse {
access_token: "simulated_token".to_string(),
client_token: "simulated_client_token".to_string(),
uuid: "simulated_uuid".to_string(),
name: "TestUser".to_string(),
refresh_token: Some("simulated_refresh_token".to_string()),
user_properties: "{}".to_string(),
meta: late_java_core::auth::AuthMeta {
auth_type: "Xbox".to_string(),
access_token_expires_in: chrono::Utc::now().timestamp() as u64 + 3600,
demo: false,
},
xbox_account: Some(late_java_core::auth::XboxAccount {
xuid: "simulated_xuid".to_string(),
gamertag: "TestGamer".to_string(),
age_group: "Adult".to_string(),
}),
profile: None,
};
println!("\n3. Ping a servidor...");
match StatusClient::ping("mc.hypixel.net", 25565) {
Ok(result) => {
println!(" Servidor: {}", result.server_info.description.text);
println!(" Jugadores: {}/{}", result.server_info.players.online, result.server_info.players.max);
println!(" Latencia: {}ms", result.latency);
}
Err(e) => {
println!(" Error al hacer ping: {}", e);
}
}
println!("\n4. Configurando launcher...");
let mut custom_headers = HashMap::new();
custom_headers.insert("User-Agent".to_string(), "LateJavaCore/2.2.9".to_string());
let options = LaunchOptions {
path: "./minecraft".to_string(),
version: "1.20.4".to_string(),
authenticator: auth_result,
url: Some("https://launchermeta.mojang.com".to_string()),
headers: Some(custom_headers),
timeout: Some(30000),
instance: Some("modded".to_string()),
detached: Some(false),
download_file_multiple: Some(10),
bypass_offline: Some(false),
memory: MemoryOptions {
min: "4G".to_string(),
max: "8G".to_string(),
},
screen: ScreenOptions {
width: Some(1920),
height: Some(1080),
fullscreen: false,
},
java: JavaOptions {
path: None, version: Some("17".to_string()),
java_type: "jre".to_string(),
},
loader: LoaderOptions {
path: Some("./loader".to_string()),
loader_type: Some("fabric".to_string()),
build: Some("0.15.9".to_string()),
enable: true,
},
mcp: None,
verify: Some(true),
ignored: vec!["saves".to_string(), "screenshots".to_string()],
jvm_args: vec![
"-XX:+UseG1GC".to_string(),
"-XX:+ParallelRefProcEnabled".to_string(),
"-XX:MaxGCPauseMillis=200".to_string(),
"-XX:+UnlockExperimentalVMOptions".to_string(),
"-XX:G1NewSizePercent=20".to_string(),
"-XX:G1ReservePercent=20".to_string(),
"-XX:G1HeapRegionSize=32M".to_string(),
],
game_args: vec![
"--quickPlaySingleplayer".to_string(),
"test_world".to_string(),
],
};
println!(" Configuración completada:");
println!(" - Ruta: {}", options.path);
println!(" - Versión: {}", options.version);
println!(" - Instancia: {:?}", options.instance);
println!(" - Memoria: {} - {}", options.memory.min, options.memory.max);
println!(" - Pantalla: {:?}x{:?}", options.screen.width, options.screen.height);
println!(" - Java: {:?}", options.java.version);
println!(" - Loader: {:?} {:?}", options.loader.loader_type, options.loader.build);
println!(" - Descargas concurrentes: {:?}", options.download_file_multiple);
println!(" - Argumentos JVM: {} argumentos", options.jvm_args.len());
println!(" - Argumentos del juego: {} argumentos", options.game_args.len());
println!("\n5. Creando launcher...");
let mut launcher = Launch::new();
let mut event_receiver = launcher.subscribe();
let event_handle = tokio::spawn(async move {
while let Ok(event) = event_receiver.recv().await {
match event {
late_java_core::LaunchEvent::Progress { downloaded, total, element } => {
let percentage = if total > 0 { (downloaded * 100) / total } else { 0 };
println!(" Progreso: {}% ({}/{} bytes) - {:?}", percentage, downloaded, total, element);
}
late_java_core::LaunchEvent::Speed(speed) => {
println!(" Velocidad: {:.2} KB/s", speed / 1024.0);
}
late_java_core::LaunchEvent::Estimated(time) => {
println!(" Tiempo restante: {:.0} segundos", time);
}
late_java_core::LaunchEvent::Extract(file) => {
println!(" Extrayendo: {}", file);
}
late_java_core::LaunchEvent::Data(data) => {
println!(" Minecraft: {}", data.trim());
}
late_java_core::LaunchEvent::Close(msg) => {
println!(" {}", msg);
break;
}
late_java_core::LaunchEvent::Error(err) => {
println!(" Error: {}", err);
break;
}
_ => {}
}
}
});
println!("\n6. Lanzando Minecraft...");
println!(" (En un ejemplo real, esto lanzaría Minecraft)");
tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
println!(" Minecraft lanzado exitosamente!");
event_handle.abort();
println!("\n7. Información adicional:");
println!(" - Versión de la librería: {}", late_java_core::VERSION);
println!(" - Plataforma: {} {}", std::env::consts::OS, std::env::consts::ARCH);
println!(" - Rust: {}", env!("RUSTC_SEMVER"));
println!("\n=== Ejemplo completado ===");
Ok(())
}