From cf1a66e858e6f73da139ec38793cd0740d4adc80 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Mon, 9 Sep 2019 17:39:49 +0800 Subject: [PATCH] load authlib-injector server from external file --- .../java/org/jackhuang/hmcl/Launcher.java | 12 +++ .../hmcl/setting/AuthlibInjectorServers.java | 78 +++++++++++++++++++ .../jackhuang/hmcl/setting/ConfigHolder.java | 4 + 3 files changed, 94 insertions(+) create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/setting/AuthlibInjectorServers.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index 8b62df052..f6d7a82fa 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -20,6 +20,9 @@ package org.jackhuang.hmcl; import javafx.application.Application; import javafx.application.Platform; import javafx.stage.Stage; +import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; +import org.jackhuang.hmcl.setting.Accounts; +import org.jackhuang.hmcl.setting.AuthlibInjectorServers; import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.TaskExecutor; @@ -41,6 +44,7 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; +import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.ui.FXUtils.runInFX; import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -54,6 +58,14 @@ public final class Launcher extends Application { try { try { ConfigHolder.init(); + AuthlibInjectorServers.init(); + + if (ConfigHolder.isNewlyCreated() && !AuthlibInjectorServers.getConfigInstance().getUrls().isEmpty()) { + config().setPreferredLoginType(Accounts.getLoginType(Accounts.FACTORY_AUTHLIB_INJECTOR)); + AuthlibInjectorServers.getConfigInstance().getUrls().stream() + .map(AuthlibInjectorServer::new) + .forEach(config().getAuthlibInjectorServers()::add); + } } catch (IOException e) { Main.showErrorAndExit(i18n("fatal.config_loading_failure", Paths.get("").toAbsolutePath().normalize())); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/AuthlibInjectorServers.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/AuthlibInjectorServers.java new file mode 100644 index 000000000..089439d8d --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/AuthlibInjectorServers.java @@ -0,0 +1,78 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2019 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.setting; + +import com.google.gson.JsonParseException; +import org.jackhuang.hmcl.util.gson.JsonUtils; +import org.jackhuang.hmcl.util.gson.Validation; +import org.jackhuang.hmcl.util.io.FileUtils; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; + +import static org.jackhuang.hmcl.util.Logging.LOG; + +public class AuthlibInjectorServers implements Validation { + + public static final String CONFIG_FILENAME = "authlib-injectors.json"; + + private final List urls; + + public AuthlibInjectorServers(List urls) { + this.urls = urls; + } + + public List getUrls() { + return urls; + } + + @Override + public void validate() throws JsonParseException { + if (urls == null) + throw new JsonParseException("authlib-injectors.json -> urls cannot be null"); + } + + private static final Path configLocation = Paths.get(CONFIG_FILENAME); + private static AuthlibInjectorServers configInstance; + + public synchronized static void init() { + if (configInstance != null) { + throw new IllegalStateException("AuthlibInjectorServers is already loaded"); + } + + configInstance = new AuthlibInjectorServers(Collections.emptyList()); + + if (Files.exists(configLocation)) { + try { + String content = FileUtils.readText(configLocation); + configInstance = JsonUtils.GSON.fromJson(content, AuthlibInjectorServers.class); + } catch (IOException | JsonParseException e) { + LOG.log(Level.WARNING, "Malformed authlib-injectors.json", e); + } + } + } + + public static AuthlibInjectorServers getConfigInstance() { + return configInstance; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java index 10d719fe4..e4fc643ee 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java @@ -52,6 +52,10 @@ public final class ConfigHolder { return configInstance; } + public static boolean isNewlyCreated() { + return newlyCreated; + } + public synchronized static void init() throws IOException { if (configInstance != null) { throw new IllegalStateException("Configuration is already loaded");