Update & Crash

This commit is contained in:
huangyuhui
2018-02-02 17:45:29 +08:00
parent e4bd1c758f
commit c923ed69a0
6 changed files with 55 additions and 27 deletions

View File

@@ -38,29 +38,42 @@ public final class Main extends Application {
@Override @Override
public void start(Stage primaryStage) { public void start(Stage primaryStage) {
// When launcher visibility is set to "hide and reopen" without Platform.implicitExit = false, Thread.currentThread().setUncaughtExceptionHandler(CRASH_REPORTER);
// Stage.show() cannot work again because JavaFX Toolkit have already shut down.
Platform.setImplicitExit(false); try {
Controllers.initialize(primaryStage); // When launcher visibility is set to "hide and reopen" without Platform.implicitExit = false,
primaryStage.setResizable(false); // Stage.show() cannot work again because JavaFX Toolkit have already shut down.
primaryStage.setScene(Controllers.getScene()); Platform.setImplicitExit(false);
primaryStage.show(); 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) { public static void main(String[] args) {
Thread.setDefaultUncaughtExceptionHandler(new CrashReporter()); Thread.setDefaultUncaughtExceptionHandler(CRASH_REPORTER);
// NetworkUtils.setUserAgentSupplier(() -> "Hello Minecraft! Launcher"); try {
Constants.UI_THREAD_SCHEDULER = Constants.JAVAFX_UI_THREAD_SCHEDULER; // NetworkUtils.setUserAgentSupplier(() -> "Hello Minecraft! Launcher");
IUpgrader.NOW_UPGRADER.parseArguments(VersionNumber.asVersion(VERSION), Arrays.asList(args)); 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) UPDATE_CHECKER.process(false)
.then(Task.of(Schedulers.javafx(), Controllers::showUpdate)) .then(Task.of(Schedulers.javafx(), () -> {
.start(); 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() { public static void stopApplication() {
@@ -112,7 +125,8 @@ public final class Main extends Application {
public static final String TITLE = NAME + " " + VERSION; public static final String TITLE = NAME + " " + VERSION;
public static final File APPDATA = getWorkingDirectory("hmcl"); public static final File APPDATA = getWorkingDirectory("hmcl");
public static final ResourceBundle RESOURCE_BUNDLE = Settings.INSTANCE.getLocale().getResourceBundle(); 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 CONTACT = "http://huangyuhui.duapp.com/hmcl.php";
public static final String PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html"; public static final String PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html";

View File

@@ -67,6 +67,10 @@ public class CrashWindow extends Stage {
setScene(scene); setScene(scene);
getIcons().add(new Image("/assets/img/icon.png")); getIcons().add(new Image("/assets/img/icon.png"));
setTitle(Main.i18n("message.error")); setTitle(Main.i18n("message.error"));
setOnCloseRequest(e -> {
System.exit(1);
});
} }
} }

View File

@@ -21,6 +21,7 @@ import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import org.jackhuang.hmcl.Main; import org.jackhuang.hmcl.Main;
import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.FileDownloadTask;
import org.jackhuang.hmcl.task.Schedulers;
import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.Task;
import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.Controllers;
import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.construct.MessageBox;
@@ -95,10 +96,10 @@ public class AppDataUpgrader extends IUpgrader {
if (!(ver instanceof IntVersionNumber)) if (!(ver instanceof IntVersionNumber))
return; return;
IntVersionNumber version = (IntVersionNumber) ver; IntVersionNumber version = (IntVersionNumber) ver;
checker.requestDownloadLink().then(Task.of(variables -> { checker.requestDownloadLink().then(Task.of(Schedulers.javafx(), variables -> {
Map<String, String> map = variables.get(UpdateChecker.REQUEST_DOWNLOAD_LINK_ID); Map<String, String> 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"), + Main.i18n("update.should_open_link"),
MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION)
if (map != null && map.containsKey("jar") && !StringUtils.isBlank(map.get("jar"))) if (map != null && map.containsKey("jar") && !StringUtils.isBlank(map.get("jar")))

View File

@@ -42,12 +42,10 @@ public final class UpdateChecker {
private volatile boolean outOfDate = false; private volatile boolean outOfDate = false;
private VersionNumber base; private VersionNumber base;
private String versionString; private String versionString;
public String type;
private Map<String, String> download_link = null; private Map<String, String> download_link = null;
public UpdateChecker(VersionNumber base, String type) { public UpdateChecker(VersionNumber base) {
this.base = base; this.base = base;
this.type = type;
} }
private VersionNumber value; private VersionNumber value;
@@ -69,8 +67,11 @@ public final class UpdateChecker {
return new TaskResult<VersionNumber>() { return new TaskResult<VersionNumber>() {
@Override @Override
public void execute() throws Exception { public void execute() throws Exception {
if (Main.VERSION.contains("@"))
return;
if (value == null) { 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); value = VersionNumber.asVersion(versionString);
} }
@@ -114,7 +115,7 @@ public final class UpdateChecker {
public void execute() { public void execute() {
if (download_link == null) if (download_link == null)
try { try {
download_link = Constants.GSON.<Map<String, String>>fromJson(NetworkUtils.doGet(NetworkUtils.toURL("http://huangyuhui.duapp.com/update_link.php?type=" + type)), Map.class); download_link = Constants.GSON.<Map<String, String>>fromJson(NetworkUtils.doGet(NetworkUtils.toURL("http://huangyuhui.duapp.com/update_link.php?type=hmcl")), Map.class);
} catch (JsonSyntaxException | IOException e) { } catch (JsonSyntaxException | IOException e) {
Logging.LOG.log(Level.SEVERE, "Failed to get update link.", e); Logging.LOG.log(Level.SEVERE, "Failed to get update link.", e);
} }

View File

@@ -81,14 +81,14 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler {
builder.append("\n Content: \n "); builder.append("\n Content: \n ");
builder.append(s).append("\n\n"); builder.append(s).append("\n\n");
builder.append("-- System Details --\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 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"); 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(); String text = builder.toString();
Logging.LOG.log(Level.SEVERE, text); 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()); Platform.runLater(() -> new CrashWindow(text).show());
if (!Main.UPDATE_CHECKER.isOutOfDate()) if (!Main.UPDATE_CHECKER.isOutOfDate())
reportToServer(text, s); reportToServer(text, s);
@@ -110,7 +110,9 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler {
map.put("crash_report", text); map.put("crash_report", text);
map.put("version", Main.VERSION); map.put("version", Main.VERSION);
try { 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) { } catch (IOException ex) {
Logging.LOG.log(Level.SEVERE, "Unable to post HMCL server.", ex); Logging.LOG.log(Level.SEVERE, "Unable to post HMCL server.", ex);
} }

View File

@@ -18,6 +18,7 @@
package org.jackhuang.hmcl.util; package org.jackhuang.hmcl.util;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* If a version string formats x.x.x.x, a {@code IntVersionNumber} * 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 false;
return true; return true;
} }
@Override
public String toString() {
return String.join(".", version.stream().map(Object::toString).collect(Collectors.toList()));
}
} }