diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 863293c..65ef41b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,24 +8,28 @@ on: [push] jobs: build: - strategy: - matrix: - # Use these Java versions - java: [ - 17, # Current Java LTS & minimum supported by Minecraft - ] runs-on: ubuntu-latest + steps: - - name: checkout repository - uses: actions/checkout@v3 - - name: setup jdk ${{ matrix.java }} - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: - java-version: ${{ matrix.java }} - distribution: 'temurin' + distribution: 'temurin' # See 'Supported distributions' for available options + java-version: '17' + - name: build run: mvn package + + - name: l4j dl + run: curl -o l4j.tgz https://cytranet.dl.sourceforge.net/project/launch4j/launch4j-3/3.50/launch4j-3.50-linux-x64.tgz + + - name: l4j unzip + run: tar -xzf l4j.tgz + + - name: l4j run + run: java -jar launch4j/launch4j.jar launch4jConfig.xml + - name: capture build artifacts uses: actions/upload-artifact@v3 with: diff --git a/launch4jConfig.xml b/launch4jConfig.xml new file mode 100644 index 0000000..ef4769a --- /dev/null +++ b/launch4jConfig.xml @@ -0,0 +1,21 @@ + + console + target/dist/Toolbox2.0.exe + target/dist/Toolbox2.0.jar + BattleModeIcon.ico + + 17 + 18 + + + 2.0.0.0 + 2.0 + 2.0.0.0 + 2.0 + All-in-one tools to manage your own LEM server + Legacy Edition Minigames Team + Toolbox 2.0 + Toolbox 2.0 + Toolbox2.0.exe + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 6c11c22..5902d47 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,7 @@ net.kyrptonaught ToolBox2.0 2.0.0 + jar 17 @@ -49,30 +50,6 @@ - - com.akathist.maven.plugins.launch4j - launch4j-maven-plugin - - - l4j-clui - package - launch4j - - console - target/dist/Toolbox2.0.exe - target/dist/Toolbox2.0.jar - BattleModeIcon.ico - %JAVA_HOME%;%PATH% - - All-in-one tools to manage your own LEM server - Legacy Edition Minigames Team - Toolbox 2.0 - Toolbox 2.0 - - - - - diff --git a/src/main/java/net/kyrptonaught/ToolBox/CMDArgsParser.java b/src/main/java/net/kyrptonaught/ToolBox/CMDArgsParser.java index d2c5012..8b0b6d5 100644 --- a/src/main/java/net/kyrptonaught/ToolBox/CMDArgsParser.java +++ b/src/main/java/net/kyrptonaught/ToolBox/CMDArgsParser.java @@ -6,7 +6,7 @@ public class CMDArgsParser { - private static String[] args; + public static String[] args; public static void setArgs(String[] args) { CMDArgsParser.args = args; @@ -39,6 +39,8 @@ public static String getTargetServer() { return null; } + public static boolean autoUpdateToolbox() {return containsArgs("--autoUpdateToolbox");} + public static boolean updateServer() { return containsArgs("--updateServer"); } diff --git a/src/main/java/net/kyrptonaught/ToolBox/Main.java b/src/main/java/net/kyrptonaught/ToolBox/Main.java index 9cd0138..f280f97 100644 --- a/src/main/java/net/kyrptonaught/ToolBox/Main.java +++ b/src/main/java/net/kyrptonaught/ToolBox/Main.java @@ -1,16 +1,19 @@ package net.kyrptonaught.ToolBox; +import java.io.BufferedReader; +import java.io.InputStreamReader; + public class Main { //Γûä public static void main(String[] args) { if (args.length > 0 && args[0].equals("--autoHash")) { AutoHash.autoHash(); - return; - } else if (args.length > 0 && args[0].equals("--updater")) { - UpdateChecker.installUpdate(); - return; + } else if (args.length > 0 && args[0].equals("--runToolbox")) { + Menu.startStateMachine(args); + } else { + BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); + CMDArgsParser.setArgs(args); + Menu.checkForUpdate(input); } - - Menu.startStateMachine(args); } } \ No newline at end of file diff --git a/src/main/java/net/kyrptonaught/ToolBox/Menu.java b/src/main/java/net/kyrptonaught/ToolBox/Menu.java index d7976de..61d5c65 100644 --- a/src/main/java/net/kyrptonaught/ToolBox/Menu.java +++ b/src/main/java/net/kyrptonaught/ToolBox/Menu.java @@ -19,32 +19,26 @@ import java.util.stream.Stream; public class Menu { - public static boolean SKIP_SHUTDOWN_TASKS = false; - - public static State state; public static Object stateData; public static void startStateMachine(String[] args) { - CMDArgsParser.setArgs(args); - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - if(!SKIP_SHUTDOWN_TASKS) { - System.out.println(); - System.out.println(); - System.out.println("SHUTTING DOWN"); - System.out.println("Attempting to stop running servers"); - ServerRunner.exit(); - } + System.out.println(); + System.out.println(); + System.out.println("SHUTTING DOWN"); + System.out.println("Attempting to stop running servers"); + ServerRunner.exit(); })); BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); + CMDArgsParser.setArgs(args); + setState(CMDArgsParser.skipSplash() ? State.MENU : State.SPLASH); Automation.run(); clearConsole(); - //checkForUpdate(input); while (true) { clearConsole(); @@ -503,26 +497,28 @@ public static void checkEula(BufferedReader input, InstalledServerInfo serverInf public static void checkForUpdate(BufferedReader input) { System.out.println("Checking for Toolbox Updates..."); - System.out.println(); - System.out.println("Current version: Toolbox 2.0 v" + UpdateChecker.version); - - String update = UpdateChecker.isUpdateAvailable(); - if (update != null) { - System.out.println("An update for Toolbox is available: v" + update); + String installedVersion = UpdateBootstrapper.getInstalledVersion(); + if (installedVersion.equals("0.0")) { + System.out.println("Toolbox is missing files require to run. The required files will be downloaded automatically."); System.out.println(); - System.out.println("1. View Release"); - System.out.println("2. Download Update"); - - System.out.println("0. Ignore"); - + System.out.println("1. View Latest Release"); + System.out.println("2. Download"); + System.out.println("0. Exit"); System.out.println(); System.out.print("Select Option: "); + if(CMDArgsParser.autoUpdateToolbox()){ + System.out.println("Auto Accepting update..."); + UpdateBootstrapper.installUpdate(); + UpdateBootstrapper.runToolbox(); + return ; + } + int selection = readInt(input); if (selection == 1) { if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { try { - Desktop.getDesktop().browse(new URI(UpdateChecker.URL)); + Desktop.getDesktop().browse(new URI(UpdateBootstrapper.URL)); } catch (Exception e) { e.printStackTrace(); } @@ -530,14 +526,59 @@ public static void checkForUpdate(BufferedReader input) { clearConsole(); checkForUpdate(input); } else if (selection == 2) { - System.out.println("Installing update"); - UpdateChecker.prepUpdate(); + System.out.println("Installing latest version"); + UpdateBootstrapper.installUpdate(); + UpdateBootstrapper.runToolbox(); + return; + } else if (selection == 0) { + System.out.println("Exiting..."); + System.exit(0); + } + } + + String update = UpdateBootstrapper.isUpdateAvailable(); + if (update != null) { + Path versionFile = Paths.get(".toolbox/VERSION"); + if (FileHelper.exists(versionFile)) { + System.out.println("Current version: Toolbox 2.0 v" + installedVersion); System.out.println(); - System.out.println("Update installed. Closing Toolbox. Please "); - pressEnterToCont(input); - setState(State.EXIT); + System.out.println("An update for Toolbox is available: v" + update); + System.out.println(); + System.out.println("1. View Release"); + System.out.println("2. Download Update"); + System.out.println("0. Ignore"); + System.out.println(); + System.out.print("Select Option: "); + + if(CMDArgsParser.autoUpdateToolbox()){ + System.out.println("Auto Accepting update..."); + UpdateBootstrapper.installUpdate(); + UpdateBootstrapper.runToolbox(); + return ; + } + + int selection = readInt(input); + if (selection == 1) { + if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { + try { + Desktop.getDesktop().browse(new URI(UpdateBootstrapper.URL)); + } catch (Exception e) { + e.printStackTrace(); + } + } + clearConsole(); + checkForUpdate(input); + + } else if (selection == 2) { + System.out.println("Installing update"); + UpdateBootstrapper.installUpdate(); + UpdateBootstrapper.runToolbox(); + return; + } } } + System.out.println("Already up to date"); + UpdateBootstrapper.runToolbox(); } public static void clearConsole() { diff --git a/src/main/java/net/kyrptonaught/ToolBox/UpdateBootstrapper.java b/src/main/java/net/kyrptonaught/ToolBox/UpdateBootstrapper.java new file mode 100644 index 0000000..0923e4b --- /dev/null +++ b/src/main/java/net/kyrptonaught/ToolBox/UpdateBootstrapper.java @@ -0,0 +1,118 @@ +package net.kyrptonaught.ToolBox; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.kyrptonaught.ToolBox.IO.FileHelper; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +public class UpdateBootstrapper { + public static BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); + public static String URL = "https://github.com/Legacy-Edition-Minigames/ToolBox/releases"; + + public static String isUpdateAvailable() { + JsonArray response = FileHelper.download(URL.replace("//github.com/", "//api.github.com/repos/"), JsonArray.class); + + if (!response.isEmpty()) { + String latestRelease = response.get(0).getAsJsonObject().get("tag_name").getAsString(); + if (compareVersions(getInstalledVersion(), latestRelease) == -1) + return latestRelease; + return null; + } + + System.out.println("Failed to check for Toolbox Updates"); + return null; + } + + public static void installUpdate() { + Menu.clearConsole(); + System.out.println("Installing Toolbox update..."); + try { + JsonArray response = FileHelper.download(URL.replace("//github.com/", "//api.github.com/repos/"), JsonArray.class); + + if (!response.isEmpty()) { + JsonArray assets = response.get(0).getAsJsonObject().get("assets").getAsJsonArray(); + for (int i = 0; i < assets.size(); i++) { + JsonObject obj = assets.get(i).getAsJsonObject(); + + String[] fileName = obj.get("name").getAsString().split("\\."); + + String fileExtension = fileName[fileName.length - 1]; + + FileHelper.download(obj.get("browser_download_url").getAsString(), Paths.get(".toolbox").resolve("launch." + fileExtension)); + + FileHelper.writeFile(Paths.get(".toolbox/VERSION"), response.get(0).getAsJsonObject().get("tag_name").getAsString()); + } + } + } catch (Exception e) { + System.out.println("Update failed"); + e.printStackTrace(); + return; + } + + System.out.println("Update successful"); + System.out.println("Done. Relaunching toolbox..."); + System.out.println(); + + Menu.pressEnterToCont(input); + } + + public static void runToolbox() { + launchJar(getToolboxRunArgs()); + } + + private static void launchJar(List args) { + try { + URLClassLoader child = new URLClassLoader(new URL[]{Paths.get(".toolbox/launch.jar").toUri().toURL()}, Main.class.getClassLoader()); + Class classToLoad = Class.forName(Main.class.getName(), true, child); + Method method = classToLoad.getDeclaredMethod("main", String[].class); + Object instance = classToLoad.newInstance(); + method.invoke(instance, (Object) args.toArray(String[]::new)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static int compareVersions(String version1, String version2) { + int comparisonResult = 0; + + String[] version1Splits = version1.split("\\."); + String[] version2Splits = version2.split("\\."); + int maxLengthOfVersionSplits = Math.max(version1Splits.length, version2Splits.length); + + for (int i = 0; i < maxLengthOfVersionSplits; i++) { + Integer v1 = i < version1Splits.length ? Integer.parseInt(version1Splits[i]) : 0; + Integer v2 = i < version2Splits.length ? Integer.parseInt(version2Splits[i]) : 0; + int compare = v1.compareTo(v2); + if (compare != 0) { + comparisonResult = compare; + break; + } + } + return comparisonResult; + } + + public static String getInstalledVersion() { + Path versionFile = Paths.get(".toolbox/VERSION"); + if (FileHelper.exists(versionFile)) { + return FileHelper.readFile(versionFile); + } else { + return "0.0"; + } + } + + private static List getToolboxRunArgs() { + List arguments = new ArrayList<>(); + arguments.add("--runToolbox"); + arguments.addAll(List.of(CMDArgsParser.args)); + return arguments; + } +} diff --git a/src/main/java/net/kyrptonaught/ToolBox/UpdateChecker.java b/src/main/java/net/kyrptonaught/ToolBox/UpdateChecker.java deleted file mode 100644 index b8926de..0000000 --- a/src/main/java/net/kyrptonaught/ToolBox/UpdateChecker.java +++ /dev/null @@ -1,125 +0,0 @@ -package net.kyrptonaught.ToolBox; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import net.kyrptonaught.ToolBox.IO.FileHelper; - -import java.io.BufferedReader; -import java.io.File; -import java.io.InputStreamReader; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.stream.Stream; - -public class UpdateChecker { - - //todo change on every new release - public static String version = "1.0"; - - public static String URL = "https://github.com/Legacy-Edition-Minigames/ToolBox/releases"; - - public static String isUpdateAvailable() { - JsonArray response = FileHelper.download(URL.replace("//github.com/", "//api.github.com/repos/"), JsonArray.class); - - if (!response.isEmpty()) { - String latestRelease = response.get(0).getAsJsonObject().get("tag_name").getAsString(); - if (compareVersions(version, latestRelease) == -1) - return latestRelease; - return null; - } - - System.out.println("Failed to check for Toolbox Updates"); - return null; - } - - public static void prepUpdate() { - FileHelper.createDir(Paths.get(".toolbox").resolve("update")); - - JsonArray response = FileHelper.download(URL.replace("//github.com/", "//api.github.com/repos/"), JsonArray.class); - - if (!response.isEmpty()) { - JsonArray assets = response.get(0).getAsJsonObject().get("assets").getAsJsonArray(); - for (int i = 0; i < assets.size(); i++) { - JsonObject obj = assets.get(i).getAsJsonObject(); - FileHelper.download(obj.get("browser_download_url").getAsString(), Paths.get(".toolbox").resolve("update").resolve(obj.get("name").getAsString())); - } - - FileHelper.copyFile(Paths.get(".").resolve("Toolbox2.0.jar"), Paths.get(".toolbox").resolve("Updater.jar")); - FileHelper.writeFile(Paths.get(".toolbox").resolve("UPDATE_IN_PROGRESS"), "rua"); - - launchJar(".toolbox/Updater.jar", "--updater", true); - } - } - - public static void installUpdate() { - Menu.clearConsole(); - System.out.println("Installing Toolbox update..."); - try (Stream files = Files.walk(Paths.get(".toolbox").resolve("update"), 1)) { - Thread.sleep(1000); - - files.forEach(path -> { - if (!Files.isDirectory(path)) { - FileHelper.copyFile(path, path.getFileName()); - } - }); - } catch (Exception e) { - System.out.println("Update failed"); - e.printStackTrace(); - return; - } - - System.out.println("Update successful"); - System.out.println("Cleaning up..."); - FileHelper.deleteDirectory(Paths.get(".toolbox").resolve("update")); - FileHelper.delete(Paths.get(".toolbox").resolve("UPDATE_IN_PROGRESS")); - - - System.out.println("Done. Relaunching toolbox..."); - System.out.println(); - - BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); - Menu.pressEnterToCont(input); - - launchJar("Toolbox2.0.jar", "", true); - } - - private static void launchJar(String jar, String args, Boolean waitfor) { - try { - ProcessBuilder launcher = new ProcessBuilder("java", "-jar", jar, args) - .directory(new File(System.getProperty("user.dir"))) - .inheritIO(); - - Process launchedjar = launcher.start(); - - Menu.SKIP_SHUTDOWN_TASKS = true; - - if (waitfor) { - launchedjar.waitFor(); - } - - System.exit(0); - } catch (Exception e) { - e.printStackTrace(); - } - } - - private static int compareVersions(String version1, String version2) { - int comparisonResult = 0; - - String[] version1Splits = version1.split("\\."); - String[] version2Splits = version2.split("\\."); - int maxLengthOfVersionSplits = Math.max(version1Splits.length, version2Splits.length); - - for (int i = 0; i < maxLengthOfVersionSplits; i++) { - Integer v1 = i < version1Splits.length ? Integer.parseInt(version1Splits[i]) : 0; - Integer v2 = i < version2Splits.length ? Integer.parseInt(version2Splits[i]) : 0; - int compare = v1.compareTo(v2); - if (compare != 0) { - comparisonResult = compare; - break; - } - } - return comparisonResult; - } -}