package com.atlauncher.bootstrap; import com.atlauncher.bootstrap.obj.Dependency; import com.atlauncher.bootstrap.utils.OS; import com.google.gson.Gson; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.EnumSet; import java.util.LinkedList; import java.util.List; //TODO: Write loading Screen //TODO: Write packs.json retrieval //TODO: Write hash validation update system public final class ATLBoot{ public static final Gson GSON = new Gson(); public static void main(String... args){ try{ Path core = OS.getStorageLocation(); if(!Files.exists(core)){ Files.createDirectories(core); } Path c = core.resolve("ATLauncher-Core.jar"); if(!Files.exists(c)){ try(InputStream in = new URL("http://www.creeperrepo.net/ATL/newlauncher/modules/ATLauncher-Core.jar").openStream(); FileChannel channel = FileChannel.open(c, EnumSet.of( StandardOpenOption.CREATE, StandardOpenOption.WRITE)); ReadableByteChannel rbc = Channels.newChannel(in)){ channel.transferFrom(rbc, 0, Long.MAX_VALUE); } } checkDependencies(core.resolve("libs")); launch(core); } catch(Exception ex){ ex.printStackTrace(System.out); } } private static void checkDependencies(Path parent) throws IOException{ if(!Files.exists(parent)){ Files.createDirectories(parent); } Path provider = parent.resolve("ATLauncher-DataProvider.jar"); if(!Files.exists(provider)){ try(InputStream in = new URL("http://www.creeperrepo.net/ATL/newlauncher/modules/ATLauncher-DataProvider.jar").openStream(); FileChannel channel = FileChannel.open(provider, EnumSet.of( StandardOpenOption.CREATE, StandardOpenOption.WRITE)); ReadableByteChannel rbc = Channels.newChannel(in)){ channel.transferFrom(rbc, 0, Long.MAX_VALUE); } } Path authLib = parent.resolve("authlib-1.5.16.jar"); if(!Files.exists(authLib)){ try(InputStream in = new URL("https://libraries.minecraft.net/com/mojang/authlib/1.5.16/authlib-1.5.16.jar").openStream(); FileChannel channel = FileChannel.open(authLib, EnumSet.of( StandardOpenOption.CREATE, StandardOpenOption.WRITE)); ReadableByteChannel rbc = Channels.newChannel(in)){ channel.transferFrom(rbc, 0, Long.MAX_VALUE); } } InputStream in = System.class.getResourceAsStream("/package.json"); Dependency[] dependencies = ATLBoot.GSON.fromJson(new InputStreamReader(in), Dependency[].class); in.close(); for(Dependency dep : dependencies){ System.out.println("Checking Dependency -> " + dep); if(!Files.exists(dep.resolve(parent))){ System.out.println("Resolving Dependency -> " + dep); dep.download(parent); } } } private static void launch(Path parent) throws IOException{ try{ List<String> a = new LinkedList<>(); if(OS.getCurrent() == OS.MAC && Files.exists(Paths.get(System.getProperty("user.home")).getParent())){ a.add("open"); a.add(Paths.get(System.getProperty("user.home")).getParent().getParent().getParent().toAbsolutePath().toString()); } else{ String p = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java"; if(OS.getCurrent() == OS.WINDOWS){ p += "w"; } a.add(p); a.add("-jar"); a.add(parent.resolve("ATLauncher-Core.jar").toString()); a.add("--provider"); a.add("com.atlauncher.ATLModule"); a.add("--developer"); a.add("false"); } System.out.println(a); Process process = new ProcessBuilder().command(a).start(); try(BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))){ String line; while((line = reader.readLine()) != null){ System.out.println(line); } } catch(Exception ex){ ex.printStackTrace(System.out); try(BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))){ String line; while((line = reader.readLine()) != null){ System.out.println(line); } } catch(Exception e){ e.printStackTrace(System.out); } } try{ int exit = process.waitFor(); System.out.println("Exit Value: " + exit); } catch(Exception ex){ ex.printStackTrace(System.out); } } catch(Exception ex){ ex.printStackTrace(System.out); } } }