From c9e7bf7ca5cbf230e7b73b347390a67b20d51b40 Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Wed, 14 Feb 2018 14:51:42 +0800 Subject: [PATCH] Yggdrasil account offline logging in --- .../org/jackhuang/hmcl/game/LauncherHelper.java | 10 ++++++---- .../main/java/org/jackhuang/hmcl/auth/Account.java | 8 ++++++++ .../org/jackhuang/hmcl/auth/OfflineAccount.java | 10 ++++++++++ .../hmcl/auth/yggdrasil/YggdrasilAccount.java | 13 +++++++++++++ 4 files changed, 37 insertions(+), 4 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 e08115e5a..715ce8c3b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -20,10 +20,7 @@ package org.jackhuang.hmcl.game; import com.jfoenix.concurrency.JFXUtilities; import javafx.application.Platform; import org.jackhuang.hmcl.Main; -import org.jackhuang.hmcl.auth.Account; -import org.jackhuang.hmcl.auth.AuthInfo; -import org.jackhuang.hmcl.auth.AuthenticationException; -import org.jackhuang.hmcl.auth.SpecificCharacterSelector; +import org.jackhuang.hmcl.auth.*; import org.jackhuang.hmcl.download.DefaultDependencyManager; import org.jackhuang.hmcl.launch.*; import org.jackhuang.hmcl.mod.CurseCompletionTask; @@ -91,6 +88,11 @@ public final class LauncherHelper { .then(Task.of(Main.i18n("account.methods"), variables -> { try { variables.set("account", account.logIn(new SpecificCharacterSelector(Accounts.getCurrentCharacter(account)), Settings.INSTANCE.getProxy())); + } catch (ServerDisconnectException e) { + if (account.canPlayOffline()) + variables.set("account", account.playOffline()); + else + throw e; } catch (AuthenticationException e) { variables.set("account", DialogController.logIn(account)); JFXUtilities.runInFX(() -> Controllers.dialog(launchingStepsPane)); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java index 7ea665ae4..c9555d997 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java @@ -57,6 +57,14 @@ public abstract class Account { */ public abstract AuthInfo logIn(MultiCharacterSelector selector, Proxy proxy) throws AuthenticationException; + public abstract boolean canPlayOffline(); + + /** + * Play offline. + * @return the specific offline player's info. + */ + public abstract AuthInfo playOffline(); + public abstract void logOut(); protected abstract Map toStorageImpl(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/OfflineAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/OfflineAccount.java index e7c0ede0b..a28660373 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/OfflineAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/OfflineAccount.java @@ -69,6 +69,16 @@ public class OfflineAccount extends Account { // Offline account need not log out. } + @Override + public boolean canPlayOffline() { + return false; + } + + @Override + public AuthInfo playOffline() { + throw new IllegalStateException(); + } + @Override public Map toStorageImpl() { return Lang.mapOf( 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 b3e691932..12baa8818 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 @@ -171,6 +171,19 @@ public final class YggdrasilAccount extends Account { userProperties.putAll(user.getProperties()); } + @Override + public boolean canPlayOffline() { + return isLoggedIn() && getSelectedProfile() != null && !canPlayOnline(); + } + + @Override + public AuthInfo playOffline() { + if (!canPlayOffline()) + throw new IllegalStateException("Current account " + this + " cannot play offline."); + + return new AuthInfo(selectedProfile, accessToken, userType, GSON.toJson(userProperties)); + } + @Override public void logOut() { password = null;