From daf659373fb0d3f96f8d286a35565bacb135d1ab Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Mon, 8 Oct 2018 21:23:01 +0800 Subject: [PATCH] Removed static login method --- .../jackhuang/hmcl/game/LauncherHelper.java | 2 +- .../org/jackhuang/hmcl/setting/Accounts.java | 58 +++++-------------- .../AuthlibInjectorAccount.java | 2 +- .../hmcl/auth/yggdrasil/YggdrasilAccount.java | 4 +- .../jackhuang/hmcl/util/CacheRepository.java | 2 +- 5 files changed, 19 insertions(+), 49 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index e8c321b69..ae13db7c9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -142,7 +142,7 @@ public final class LauncherHelper { .then(Task.of(Schedulers.javafx(), () -> emitStatus(LoadingState.LOGGING_IN))) .then(Task.of(i18n("account.methods"), variables -> { try { - variables.set("account", Accounts.logIn(account)); + variables.set("account", account.logIn()); } catch (CredentialExpiredException e) { variables.set("account", DialogController.logIn(account)); } catch (AuthenticationException e) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java index 04f8ceca4..794c1da90 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -26,7 +26,6 @@ import javafx.collections.ObservableList; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.AccountFactory; -import org.jackhuang.hmcl.auth.AuthInfo; import org.jackhuang.hmcl.auth.AuthenticationException; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccount; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccountFactory; @@ -40,11 +39,8 @@ import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccountFactory; import org.jackhuang.hmcl.task.Schedulers; import java.io.IOException; -import java.util.HashMap; import java.util.Map; import java.util.Optional; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; import java.util.logging.Level; import static java.util.stream.Collectors.toList; @@ -165,11 +161,6 @@ public final class Accounts { if (initialized) throw new IllegalStateException("Already initialized"); - selectedAccount.addListener((a, b, newValue) -> { - if (newValue != null) - startLoggingIn(newValue); - }); - // load accounts config().getAccountStorages().forEach(storage -> { AccountFactory factory = type2factory.get(storage.get("type")); @@ -192,11 +183,20 @@ public final class Accounts { config().getAuthlibInjectorServers().addListener(onInvalidating(Accounts::removeDanglingAuthlibInjectorAccounts)); // load selected account - selectedAccount.set( - accounts.stream() - .filter(it -> accountId(it).equals(config().getSelectedAccount())) - .findFirst() - .orElse(null)); + Account selected = accounts.stream() + .filter(it -> accountId(it).equals(config().getSelectedAccount())) + .findFirst() + .orElse(null); + selectedAccount.set(selected); + + Schedulers.io().schedule(() -> { + if (selected != null) + try { + selected.logIn(); + } catch (AuthenticationException e) { + LOG.log(Level.WARNING, "Failed to log " + selected + " in", e); + } + }); } public static ObservableList getAccounts() { @@ -269,34 +269,4 @@ public final class Accounts { return getAccountTypeName(getAccountFactory(account)); } // ==== - - private static final Map> accountFutures = new HashMap<>(); - - public static void startLoggingIn(Account account) { - if (!accountFutures.containsKey(account)) { - Future future = Schedulers.computation().schedule(account::logIn); - accountFutures.put(account, future); - } - } - - public static AuthInfo logIn(Account account) throws AuthenticationException { - try { - if (!accountFutures.containsKey(account)) { - Future future = Schedulers.computation().schedule(account::logIn); - accountFutures.put(account, future); - future.get(); - } else { - accountFutures.get(account).get(); - } - } catch (ExecutionException e) { - if (e.getCause() instanceof AuthenticationException) - throw (AuthenticationException) e.getCause(); - else - LOG.log(Level.WARNING, "Unable to logIn", e); - } catch (InterruptedException e) { - // account.logIn() - } - - return account.logIn(); - } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccount.java index 4d95fb41d..d135cf81c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccount.java @@ -47,7 +47,7 @@ public class AuthlibInjectorAccount extends YggdrasilAccount { } @Override - public AuthInfo logIn() throws AuthenticationException { + public synchronized AuthInfo logIn() throws AuthenticationException { return inject(super::logIn); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java index 654ca8452..f1ec430a3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java @@ -64,7 +64,7 @@ public class YggdrasilAccount extends Account { } @Override - public AuthInfo logIn() throws AuthenticationException { + public synchronized AuthInfo logIn() throws AuthenticationException { if (!canPlayOnline()) { if (service.validate(session.getAccessToken(), session.getClientToken())) { isOnline = true; @@ -84,7 +84,7 @@ public class YggdrasilAccount extends Account { } @Override - public AuthInfo logInWithPassword(String password) throws AuthenticationException { + public synchronized AuthInfo logInWithPassword(String password) throws AuthenticationException { return logInWithPassword(password, new SpecificCharacterSelector(characterUUID)); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java index a2844aa64..e6dfb9de6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java @@ -62,7 +62,7 @@ public class CacheRepository { public void tryCacheFile(Path path, String algorithm, String hash) throws IOException { Path cache = getFile(algorithm, hash); - if (Files.exists(cache)) return; + if (Files.isRegularFile(cache)) return; FileUtils.copyFile(path.toFile(), cache.toFile()); }