Convert old offline account setings
This commit is contained in:
@@ -87,7 +87,7 @@ public final class Accounts {
|
|||||||
return type2factory.get(accountType(account));
|
return type2factory.get(accountType(account));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String accountId(Account account) {
|
static String accountId(Account account) {
|
||||||
return account.getUsername() + ":" + account.getCharacter();
|
return account.getUsername() + ":" + account.getCharacter();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,20 +138,19 @@ public final class Accounts {
|
|||||||
accounts.addListener(onInvalidating(Accounts::updateAccountStorages));
|
accounts.addListener(onInvalidating(Accounts::updateAccountStorages));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Map<Object, Object> getAccountStorage(Account account) {
|
||||||
|
Map<Object, Object> storage = account.toStorage();
|
||||||
|
storage.put("type", accountType(account));
|
||||||
|
return storage;
|
||||||
|
}
|
||||||
|
|
||||||
private static void updateAccountStorages() {
|
private static void updateAccountStorages() {
|
||||||
// don't update the underlying storage before data loading is completed
|
// don't update the underlying storage before data loading is completed
|
||||||
// otherwise it might cause data loss
|
// otherwise it might cause data loss
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
return;
|
return;
|
||||||
// update storage
|
// update storage
|
||||||
config().getAccountStorages().setAll(
|
config().getAccountStorages().setAll(accounts.stream().map(Accounts::getAccountStorage).collect(toList()));
|
||||||
accounts.stream()
|
|
||||||
.map(account -> {
|
|
||||||
Map<Object, Object> storage = account.toStorage();
|
|
||||||
storage.put("type", accountType(account));
|
|
||||||
return storage;
|
|
||||||
})
|
|
||||||
.collect(toList()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ import com.google.gson.Gson;
|
|||||||
import com.google.gson.JsonParseException;
|
import com.google.gson.JsonParseException;
|
||||||
|
|
||||||
import org.jackhuang.hmcl.util.OperatingSystem;
|
import org.jackhuang.hmcl.util.OperatingSystem;
|
||||||
import org.jackhuang.hmcl.util.StringUtils;
|
|
||||||
|
|
||||||
public final class ConfigHolder {
|
public final class ConfigHolder {
|
||||||
|
|
||||||
@@ -111,7 +110,7 @@ public final class ConfigHolder {
|
|||||||
LOG.info("Config is empty");
|
LOG.info("Config is empty");
|
||||||
} else {
|
} else {
|
||||||
Map<?, ?> raw = new Gson().fromJson(content, Map.class);
|
Map<?, ?> raw = new Gson().fromJson(content, Map.class);
|
||||||
upgradeConfig(deserialized, raw);
|
ConfigUpgrader.upgradeConfig(deserialized, raw);
|
||||||
return deserialized;
|
return deserialized;
|
||||||
}
|
}
|
||||||
} catch (JsonParseException e) {
|
} catch (JsonParseException e) {
|
||||||
@@ -142,22 +141,4 @@ public final class ConfigHolder {
|
|||||||
// ignore it as it has been logged
|
// ignore it as it has been logged
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is for the compatibility with old HMCL 3.x as well as HMCL 2.x.
|
|
||||||
* @param deserialized deserialized config settings
|
|
||||||
* @param rawJson raw json structure of the config settings without modification
|
|
||||||
* @return {@code deserialized}
|
|
||||||
*/
|
|
||||||
private static void upgradeConfig(Config deserialized, Map<?, ?> rawJson) {
|
|
||||||
// Following is for the compatibility with HMCL 2.x
|
|
||||||
if (!rawJson.containsKey("commonDirType"))
|
|
||||||
deserialized.setCommonDirType(deserialized.getCommonDirectory().equals(Settings.getDefaultCommonDirectory()) ? EnumCommonDirectory.DEFAULT : EnumCommonDirectory.CUSTOM);
|
|
||||||
if (!rawJson.containsKey("backgroundType"))
|
|
||||||
deserialized.setBackgroundImageType(StringUtils.isNotBlank(deserialized.getBackgroundImage()) ? EnumBackgroundImage.CUSTOM : EnumBackgroundImage.DEFAULT);
|
|
||||||
if (!rawJson.containsKey("hasProxy"))
|
|
||||||
deserialized.setHasProxy(StringUtils.isNotBlank(deserialized.getProxyHost()));
|
|
||||||
if (!rawJson.containsKey("hasProxyAuth"))
|
|
||||||
deserialized.setHasProxyAuth(StringUtils.isNotBlank(deserialized.getProxyUser()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Hello Minecraft! Launcher.
|
||||||
|
* Copyright (C) 2018 huangyuhui <huanghongxun2008@126.com>
|
||||||
|
*
|
||||||
|
* 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 {http://www.gnu.org/licenses/}.
|
||||||
|
*/
|
||||||
|
package org.jackhuang.hmcl.setting;
|
||||||
|
|
||||||
|
import org.jackhuang.hmcl.auth.offline.OfflineAccount;
|
||||||
|
import org.jackhuang.hmcl.auth.offline.OfflineAccountFactory;
|
||||||
|
import org.jackhuang.hmcl.util.StringUtils;
|
||||||
|
import org.jackhuang.hmcl.util.UUIDTypeAdapter;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.jackhuang.hmcl.util.Lang.tryCast;
|
||||||
|
|
||||||
|
final class ConfigUpgrader {
|
||||||
|
private ConfigUpgrader() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is for the compatibility with old HMCL 3.x as well as HMCL 2.x.
|
||||||
|
*
|
||||||
|
* @param deserialized deserialized config settings
|
||||||
|
* @param rawJson raw json structure of the config settings without modification
|
||||||
|
*/
|
||||||
|
static void upgradeConfig(Config deserialized, Map<?, ?> rawJson) {
|
||||||
|
upgradeV2(deserialized, rawJson);
|
||||||
|
upgradeV3(deserialized, rawJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upgrade configuration of HMCL 2.x
|
||||||
|
*
|
||||||
|
* @param deserialized deserialized config settings
|
||||||
|
* @param rawJson raw json structure of the config settings without modification
|
||||||
|
*/
|
||||||
|
private static void upgradeV2(Config deserialized, Map<?, ?> rawJson) {
|
||||||
|
// Convert OfflineAccounts whose stored uuid is important.
|
||||||
|
tryCast(rawJson.get("auth"), Map.class).ifPresent(auth -> {
|
||||||
|
tryCast(auth.get("offline"), Map.class).ifPresent(offline -> {
|
||||||
|
List<OfflineAccount> accounts = new LinkedList<>();
|
||||||
|
tryCast(offline.get("uuidMap"), Map.class).ifPresent(uuidMap -> {
|
||||||
|
((Map<?, ?>) uuidMap).forEach((key, value) -> {
|
||||||
|
OfflineAccount account = OfflineAccountFactory.INSTANCE.create((String) key, UUIDTypeAdapter.fromString((String) value));
|
||||||
|
accounts.add(account);
|
||||||
|
deserialized.getAccountStorages().add(Accounts.getAccountStorage(account));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
tryCast(offline.get("IAuthenticator_UserName"), String.class).ifPresent(selected -> {
|
||||||
|
if (!rawJson.containsKey("selectedAccount"))
|
||||||
|
accounts.stream().filter(account -> selected.equals(account.getUsername())).findAny().ifPresent(account ->
|
||||||
|
deserialized.setSelectedAccount(Accounts.accountId(account)));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upgrade configuration of HMCL earlier than 3.1.70
|
||||||
|
*
|
||||||
|
* @param deserialized deserialized config settings
|
||||||
|
* @param rawJson raw json structure of the config settings without modification
|
||||||
|
*/
|
||||||
|
private static void upgradeV3(Config deserialized, Map<?, ?> rawJson) {
|
||||||
|
if (!rawJson.containsKey("commonDirType"))
|
||||||
|
deserialized.setCommonDirType(deserialized.getCommonDirectory().equals(Settings.getDefaultCommonDirectory()) ? EnumCommonDirectory.DEFAULT : EnumCommonDirectory.CUSTOM);
|
||||||
|
if (!rawJson.containsKey("backgroundType"))
|
||||||
|
deserialized.setBackgroundImageType(StringUtils.isNotBlank(deserialized.getBackgroundImage()) ? EnumBackgroundImage.CUSTOM : EnumBackgroundImage.DEFAULT);
|
||||||
|
if (!rawJson.containsKey("hasProxy"))
|
||||||
|
deserialized.setHasProxy(StringUtils.isNotBlank(deserialized.getProxyHost()));
|
||||||
|
if (!rawJson.containsKey("hasProxyAuth"))
|
||||||
|
deserialized.setHasProxyAuth(StringUtils.isNotBlank(deserialized.getProxyUser()));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -37,6 +37,10 @@ public class OfflineAccountFactory extends AccountFactory<OfflineAccount> {
|
|||||||
private OfflineAccountFactory() {
|
private OfflineAccountFactory() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public OfflineAccount create(String username, UUID uuid) {
|
||||||
|
return new OfflineAccount(username, uuid);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public OfflineAccount create(CharacterSelector selector, String username, String password, Object additionalData) {
|
public OfflineAccount create(CharacterSelector selector, String username, String password, Object additionalData) {
|
||||||
return new OfflineAccount(username, getUUIDFromUserName(username));
|
return new OfflineAccount(username, getUUIDFromUserName(username));
|
||||||
|
|||||||
Reference in New Issue
Block a user