late-java-core 2.2.9

A Rust library for launching Minecraft Java Edition
use late_java_core::{
    Launch, MicrosoftAuth, MojangAuth, AZauthAuth, 
    LaunchOptions, MemoryOptions, LoaderOptions, 
    ScreenOptions, JavaOptions, VersionManifest, init_logger
};
use std::collections::HashMap;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    init_logger();

    println!("=== Late Java Core - Ejemplo Avanzado ===");
    
    // Mostrar versiones disponibles
    println!("Obteniendo versiones disponibles...");
    let manifest = VersionManifest::fetch().await?;
    println!("Última versión release: {}", manifest.latest.release);
    println!("Última versión snapshot: {}", manifest.latest.snapshot);
    
    // Ejemplo con diferentes autenticadores
    println!("\n=== Ejemplo de Autenticación ===");
    
    // Microsoft (recomendado)
    println!("Autenticación Microsoft:");
    let microsoft_auth = MicrosoftAuth::new("00000000402b5328".to_string());
    // let microsoft_result = microsoft_auth.authenticate().await?;
    // println!("Microsoft: {}", microsoft_result.name);
    
    // Mojang (legacy)
    println!("Autenticación Mojang (legacy):");
    let mojang_auth = MojangAuth::new();
    // let mojang_result = mojang_auth.authenticate("usuario", "contraseña").await?;
    // println!("Mojang: {}", mojang_result.name);
    
    // AZauth (servidor personalizado)
    println!("Autenticación AZauth:");
    let azauth_auth = AZauthAuth::new("https://authserver.example.com".to_string());
    // let azauth_result = azauth_auth.authenticate("usuario", "contraseña").await?;
    // println!("AZauth: {}", azauth_result.name);
    
    // Configuración avanzada del launcher
    println!("\n=== Configuración Avanzada ===");
    
    let mut custom_headers = HashMap::new();
    custom_headers.insert("User-Agent".to_string(), "LateJavaCore/2.2.9".to_string());
    
    let options = LaunchOptions {
        // Configuración básica
        path: "./minecraft".to_string(),
        version: "1.20.4".to_string(),
        // authenticator: microsoft_result, // Usar el resultado de autenticación real
        
        // Configuración de red
        url: Some("https://launchermeta.mojang.com".to_string()),
        headers: Some(custom_headers),
        timeout: Some(30000), // 30 segundos
        
        // Configuración de instancia
        instance: Some("modded".to_string()),
        detached: Some(false),
        download_file_multiple: Some(10), // 10 descargas concurrentes
        bypass_offline: Some(false),
        
        // Configuración de memoria
        memory: MemoryOptions {
            min: "4G".to_string(),
            max: "8G".to_string(),
        },
        
        // Configuración de pantalla
        screen: ScreenOptions {
            width: Some(1920),
            height: Some(1080),
            fullscreen: false,
        },
        
        // Configuración de Java
        java: JavaOptions {
            path: None, // Usar Java del sistema
            version: Some("17".to_string()),
            java_type: "jre".to_string(),
        },
        
        // Configuración del loader
        loader: LoaderOptions {
            path: Some("./loader".to_string()),
            loader_type: Some("fabric".to_string()),
            build: Some("0.15.9".to_string()),
            enable: true,
        },
        
        // Configuración MCP (opcional)
        mcp: None,
        
        // Verificación de archivos
        verify: Some(true),
        ignored: vec!["saves".to_string(), "screenshots".to_string()],
        
        // Argumentos personalizados
        jvm_args: vec![
            "-XX:+UseG1GC".to_string(),
            "-XX:+ParallelRefProcEnabled".to_string(),
            "-XX:MaxGCPauseMillis=200".to_string(),
        ],
        game_args: vec![
            "--quickPlaySingleplayer".to_string(),
            "world_name".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);
    
    // Lanzar Minecraft
    println!("\n=== Lanzando Minecraft ===");
    let launcher = Launch::new();
    
    // En un ejemplo real, descomenta la siguiente línea:
    // launcher.launch(options).await?;
    
    println!("Minecraft lanzado exitosamente!");
    Ok(())
}