From c923ed69a0bbcfc05eb3672568a69bf2d3c2ec9c Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Fri, 2 Feb 2018 17:45:29 +0800 Subject: [PATCH] Update & Crash --- .../main/java/org/jackhuang/hmcl/Main.java | 48 ++++++++++++------- .../org/jackhuang/hmcl/ui/CrashWindow.java | 4 ++ .../hmcl/upgrade/AppDataUpgrader.java | 5 +- .../jackhuang/hmcl/upgrade/UpdateChecker.java | 11 +++-- .../jackhuang/hmcl/util/CrashReporter.java | 8 ++-- .../jackhuang/hmcl/util/IntVersionNumber.java | 6 +++ 6 files changed, 55 insertions(+), 27 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java index d576cbf10..a3b38b8f1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java @@ -38,29 +38,42 @@ public final class Main extends Application { @Override public void start(Stage primaryStage) { - // When launcher visibility is set to "hide and reopen" without Platform.implicitExit = false, - // Stage.show() cannot work again because JavaFX Toolkit have already shut down. - Platform.setImplicitExit(false); - Controllers.initialize(primaryStage); - primaryStage.setResizable(false); - primaryStage.setScene(Controllers.getScene()); - primaryStage.show(); + Thread.currentThread().setUncaughtExceptionHandler(CRASH_REPORTER); + + try { + // When launcher visibility is set to "hide and reopen" without Platform.implicitExit = false, + // Stage.show() cannot work again because JavaFX Toolkit have already shut down. + Platform.setImplicitExit(false); + Controllers.initialize(primaryStage); + primaryStage.setResizable(false); + primaryStage.setScene(Controllers.getScene()); + primaryStage.show(); + } catch (Throwable e) { + CRASH_REPORTER.uncaughtException(Thread.currentThread(), e); + } } public static void main(String[] args) { - Thread.setDefaultUncaughtExceptionHandler(new CrashReporter()); + Thread.setDefaultUncaughtExceptionHandler(CRASH_REPORTER); - // NetworkUtils.setUserAgentSupplier(() -> "Hello Minecraft! Launcher"); - Constants.UI_THREAD_SCHEDULER = Constants.JAVAFX_UI_THREAD_SCHEDULER; - IUpgrader.NOW_UPGRADER.parseArguments(VersionNumber.asVersion(VERSION), Arrays.asList(args)); + try { + // NetworkUtils.setUserAgentSupplier(() -> "Hello Minecraft! Launcher"); + Constants.UI_THREAD_SCHEDULER = Constants.JAVAFX_UI_THREAD_SCHEDULER; + IUpgrader.NOW_UPGRADER.parseArguments(VersionNumber.asVersion(VERSION), Arrays.asList(args)); - Logging.LOG.info("*** " + TITLE + " ***"); + Logging.LOG.info("*** " + TITLE + " ***"); - UPDATE_CHECKER.process(false) - .then(Task.of(Schedulers.javafx(), Controllers::showUpdate)) - .start(); + UPDATE_CHECKER.process(false) + .then(Task.of(Schedulers.javafx(), () -> { + if (UPDATE_CHECKER.isOutOfDate()) + Controllers.showUpdate(); + })) + .start(); - launch(args); + launch(args); + } catch (Throwable e) { // Fucking JavaFX will suppress the exception and will break our crash reporter. + CRASH_REPORTER.uncaughtException(Thread.currentThread(), e); + } } public static void stopApplication() { @@ -112,7 +125,8 @@ public final class Main extends Application { public static final String TITLE = NAME + " " + VERSION; public static final File APPDATA = getWorkingDirectory("hmcl"); public static final ResourceBundle RESOURCE_BUNDLE = Settings.INSTANCE.getLocale().getResourceBundle(); - public static final UpdateChecker UPDATE_CHECKER = new UpdateChecker(VersionNumber.asVersion(VERSION), "hmcl"); + public static final UpdateChecker UPDATE_CHECKER = new UpdateChecker(VersionNumber.asVersion(VERSION)); + public static final CrashReporter CRASH_REPORTER = new CrashReporter(); public static final String CONTACT = "http://huangyuhui.duapp.com/hmcl.php"; public static final String PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html"; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java index 7dc7d7122..6eb1f9225 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java @@ -67,6 +67,10 @@ public class CrashWindow extends Stage { setScene(scene); getIcons().add(new Image("/assets/img/icon.png")); setTitle(Main.i18n("message.error")); + + setOnCloseRequest(e -> { + System.exit(1); + }); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java index 8b7726da5..27dcdd62d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java @@ -21,6 +21,7 @@ import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import org.jackhuang.hmcl.Main; import org.jackhuang.hmcl.task.FileDownloadTask; +import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.construct.MessageBox; @@ -95,10 +96,10 @@ public class AppDataUpgrader extends IUpgrader { if (!(ver instanceof IntVersionNumber)) return; IntVersionNumber version = (IntVersionNumber) ver; - checker.requestDownloadLink().then(Task.of(variables -> { + checker.requestDownloadLink().then(Task.of(Schedulers.javafx(), variables -> { Map map = variables.get(UpdateChecker.REQUEST_DOWNLOAD_LINK_ID); - if (MessageBox.confirm(Main.i18n("update.newest_version") + version.get(0) + "." + version.get(1) + "." + version.get(2) + "\n" + if (MessageBox.confirm(Main.i18n("update.newest_version") + version.toString() + "\n" + Main.i18n("update.should_open_link"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) if (map != null && map.containsKey("jar") && !StringUtils.isBlank(map.get("jar"))) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java index 7580681ff..d320c8769 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java @@ -42,12 +42,10 @@ public final class UpdateChecker { private volatile boolean outOfDate = false; private VersionNumber base; private String versionString; - public String type; private Map download_link = null; - public UpdateChecker(VersionNumber base, String type) { + public UpdateChecker(VersionNumber base) { this.base = base; - this.type = type; } private VersionNumber value; @@ -69,8 +67,11 @@ public final class UpdateChecker { return new TaskResult() { @Override public void execute() throws Exception { + if (Main.VERSION.contains("@")) + return; + if (value == null) { - versionString = NetworkUtils.doGet(NetworkUtils.toURL("http://huangyuhui.duapp.com/info.php?type=" + type)); + versionString = NetworkUtils.doGet(NetworkUtils.toURL("http://huangyuhui.duapp.com/hmcl/update.php?version=" + Main.VERSION)); value = VersionNumber.asVersion(versionString); } @@ -114,7 +115,7 @@ public final class UpdateChecker { public void execute() { if (download_link == null) try { - download_link = Constants.GSON.>fromJson(NetworkUtils.doGet(NetworkUtils.toURL("http://huangyuhui.duapp.com/update_link.php?type=" + type)), Map.class); + download_link = Constants.GSON.>fromJson(NetworkUtils.doGet(NetworkUtils.toURL("http://huangyuhui.duapp.com/update_link.php?type=hmcl")), Map.class); } catch (JsonSyntaxException | IOException e) { Logging.LOG.log(Level.SEVERE, "Failed to get update link.", e); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java index a511e5291..0a9840c9d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java @@ -81,14 +81,14 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { builder.append("\n Content: \n "); builder.append(s).append("\n\n"); builder.append("-- System Details --\n"); - builder.append(" Operating System: ").append(OperatingSystem.SYSTEM_VERSION).append("\n"); + builder.append(" Operating System: ").append(System.getProperty("os.name")).append(' ').append(OperatingSystem.SYSTEM_VERSION).append("\n"); builder.append(" Java Version: ").append(System.getProperty("java.version")).append(", ").append(System.getProperty("java.vendor")).append("\n"); builder.append(" Java VM Version: ").append(System.getProperty("java.vm.name")).append(" (").append(System.getProperty("java.vm.info")).append("), ").append(System.getProperty("java.vm.vendor")).append("\n"); String text = builder.toString(); Logging.LOG.log(Level.SEVERE, text); - if (checkThrowable(e) && !System.getProperty("java.vm.name").contains("OpenJDK")) { + if (checkThrowable(e) && !text.contains("OpenJDK")) { Platform.runLater(() -> new CrashWindow(text).show()); if (!Main.UPDATE_CHECKER.isOutOfDate()) reportToServer(text, s); @@ -110,7 +110,9 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { map.put("crash_report", text); map.put("version", Main.VERSION); try { - NetworkUtils.doPost(NetworkUtils.toURL("http://huangyuhui.duapp.com/hmcl/crash.php"), map); + String response = NetworkUtils.doPost(NetworkUtils.toURL("http://huangyuhui.duapp.com/hmcl/crash.php"), map); + if (StringUtils.isNotBlank(response)) + Logging.LOG.log(Level.SEVERE, "Crash server response: " + response); } catch (IOException ex) { Logging.LOG.log(Level.SEVERE, "Unable to post HMCL server.", ex); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/IntVersionNumber.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/IntVersionNumber.java index 7fbb24966..4f8128f64 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/IntVersionNumber.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/IntVersionNumber.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.util; import java.util.List; +import java.util.stream.Collectors; /** * If a version string formats x.x.x.x, a {@code IntVersionNumber} @@ -72,4 +73,9 @@ public final class IntVersionNumber extends VersionNumber { return false; return true; } + + @Override + public String toString() { + return String.join(".", version.stream().map(Object::toString).collect(Collectors.toList())); + } }