diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/SpecificCharacterSelector.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/SpecificCharacterSelector.java index dd75c6033..884a976ee 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/SpecificCharacterSelector.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/SpecificCharacterSelector.java @@ -20,23 +20,24 @@ package org.jackhuang.hmcl.auth; import org.jackhuang.hmcl.auth.yggdrasil.GameProfile; import java.util.List; +import java.util.UUID; /** * Select character by name. */ public class SpecificCharacterSelector implements CharacterSelector { - private final String id; + private UUID uuid; /** * Constructor. - * @param id character's name. + * @param uuid character's uuid. */ - public SpecificCharacterSelector(String id) { - this.id = id; + public SpecificCharacterSelector(UUID uuid) { + this.uuid = uuid; } @Override public GameProfile select(Account account, List names) throws NoSelectedCharacterException { - return names.stream().filter(profile -> profile.getName().equals(id)).findAny().orElseThrow(() -> new NoSelectedCharacterException(account)); + return names.stream().filter(profile -> profile.getId().equals(uuid)).findAny().orElseThrow(() -> new NoSelectedCharacterException(account)); } } 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 6bd5422fd..0114bc804 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 @@ -31,6 +31,7 @@ import org.jackhuang.hmcl.util.NetworkUtils; import java.util.Base64; import java.util.Map; +import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import static java.nio.charset.StandardCharsets.UTF_8; @@ -39,8 +40,8 @@ public class AuthlibInjectorAccount extends YggdrasilAccount { private final String serverBaseURL; private final ExceptionalSupplier injectorJarPath; - protected AuthlibInjectorAccount(YggdrasilService service, String serverBaseURL, ExceptionalSupplier injectorJarPath, String username, String character, YggdrasilSession session) { - super(service, username, character, session); + protected AuthlibInjectorAccount(YggdrasilService service, String serverBaseURL, ExceptionalSupplier injectorJarPath, String username, UUID characterUUID, YggdrasilSession session) { + super(service, username, characterUUID, session); this.injectorJarPath = injectorJarPath; this.serverBaseURL = serverBaseURL; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java index 2d6edd8f2..51d642f72 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorAccountFactory.java @@ -42,14 +42,14 @@ public class AuthlibInjectorAccountFactory extends AccountFactory new IllegalArgumentException("storage does not have username")); - String character = tryCast(storage.get("character"), String.class) - .orElseThrow(() -> new IllegalArgumentException("storage does not have selected character name.")); String apiRoot = tryCast(storage.get("serverBaseURL"), String.class) .orElseThrow(() -> new IllegalArgumentException("storage does not have API root.")); return new AuthlibInjectorAccount(new YggdrasilService(new AuthlibInjectorProvider(apiRoot), proxy), - apiRoot, injectorJarPathSupplier, username, character, YggdrasilSession.fromStorage(storage)); + apiRoot, injectorJarPathSupplier, username, session.getSelectedProfile().getId(), session); } } 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 cb6d88022..139d464d5 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 @@ -33,13 +33,13 @@ public class YggdrasilAccount extends Account { private final YggdrasilService service; private boolean isOnline = false; private YggdrasilSession session; - private String character; + private UUID characterUUID; - protected YggdrasilAccount(YggdrasilService service, String username, String character, YggdrasilSession session) { + protected YggdrasilAccount(YggdrasilService service, String username, UUID characterUUID, YggdrasilSession session) { this.service = service; this.username = username; this.session = session; - this.character = character; + this.characterUUID = characterUUID; if (session == null || session.getSelectedProfile() == null || StringUtils.isBlank(session.getAccessToken())) this.session = null; @@ -67,14 +67,14 @@ public class YggdrasilAccount extends Account { public AuthInfo logIn() throws AuthenticationException { if (!canPlayOnline()) { logInWithToken(); - selectProfile(new SpecificCharacterSelector(character)); + selectProfile(new SpecificCharacterSelector(characterUUID)); } return session.toAuthInfo(); } @Override public final AuthInfo logInWithPassword(String password) throws AuthenticationException { - return logInWithPassword(password, new SpecificCharacterSelector(character)); + return logInWithPassword(password, new SpecificCharacterSelector(characterUUID)); } protected AuthInfo logInWithPassword(String password, CharacterSelector selector) throws AuthenticationException { @@ -91,7 +91,7 @@ public class YggdrasilAccount extends Account { session = service.refresh(session.getAccessToken(), session.getClientToken(), selector.select(this, Arrays.asList(session.getAvailableProfiles()))); } - character = session.getSelectedProfile().getName(); + characterUUID = session.getSelectedProfile().getId(); } private void logInWithToken() throws AuthenticationException { @@ -112,13 +112,12 @@ public class YggdrasilAccount extends Account { @Override public Map toStorage() { + if (session == null) + throw new IllegalStateException("No session is specified"); + HashMap storage = new HashMap<>(); - storage.put("username", getUsername()); - storage.put("character", character); - if (session != null) - storage.putAll(session.toStorage()); - + storage.putAll(session.toStorage()); return storage; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccountFactory.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccountFactory.java index 03bbaf62d..3fb044793 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccountFactory.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccountFactory.java @@ -58,12 +58,12 @@ public class YggdrasilAccountFactory extends AccountFactory { Objects.requireNonNull(storage); Objects.requireNonNull(proxy); + YggdrasilSession session = YggdrasilSession.fromStorage(storage); + String username = tryCast(storage.get("username"), String.class) .orElseThrow(() -> new IllegalArgumentException("storage does not have username")); - String character = tryCast(storage.get("character"), String.class) - .orElseThrow(() -> new IllegalArgumentException("storage does not have selected character name.")); - return new YggdrasilAccount(new YggdrasilService(provider, proxy), username, character, YggdrasilSession.fromStorage(storage)); + return new YggdrasilAccount(new YggdrasilService(provider, proxy), username, session.getSelectedProfile().getId(), session); } public static String randomToken() {