diff --git a/.gitignore b/.gitignore index 373f0803f..1159a493b 100755 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,6 @@ hs_err_pid* HMCLAPI/build/ HMCL/build/ -HMCL/src/main/org/jackhuang/hellominecraft/launcher/servers/ +HMCLServer/ HMCSM/build/ MetroLookAndFeel/build/ diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultPlugin.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultPlugin.java index b22b4bfc4..06ebd4cf0 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultPlugin.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultPlugin.java @@ -48,13 +48,17 @@ public class DefaultPlugin implements IPlugin { public void onRegisterAuthenticators(Consumer apply) { String clientToken = Settings.getInstance().getClientToken(); OFFLINE_LOGIN = new OfflineAuthenticator(clientToken); + OFFLINE_LOGIN.onLoadSettings(Settings.getInstance().getAuthenticatorConfig(OFFLINE_LOGIN.id())); YGGDRASIL_LOGIN = new YggdrasilAuthenticator(clientToken); - YGGDRASIL_LOGIN.onLoadSettings(Settings.getInstance().getYggdrasilConfig()); + YGGDRASIL_LOGIN.onLoadSettings(Settings.getInstance().getAuthenticatorConfig(YGGDRASIL_LOGIN.id())); SKINME_LOGIN = new SkinmeAuthenticator(clientToken); + SKINME_LOGIN.onLoadSettings(Settings.getInstance().getAuthenticatorConfig(SKINME_LOGIN.id())); - Runtime.getRuntime().addShutdownHook(new Thread(() - -> Settings.getInstance().setYggdrasilConfig(YGGDRASIL_LOGIN.onSaveSettings()) - )); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + Settings.getInstance().setAuthenticatorConfig(OFFLINE_LOGIN.id(), OFFLINE_LOGIN.onSaveSettings()); + Settings.getInstance().setAuthenticatorConfig(YGGDRASIL_LOGIN.id(), YGGDRASIL_LOGIN.onSaveSettings()); + Settings.getInstance().setAuthenticatorConfig(SKINME_LOGIN.id(), SKINME_LOGIN.onSaveSettings()); + })); apply.accept(OFFLINE_LOGIN); apply.accept(YGGDRASIL_LOGIN); apply.accept(SKINME_LOGIN); @@ -62,7 +66,7 @@ public class DefaultPlugin implements IPlugin { @Override public void showUI() { - MainFrame.showMainFrame(Settings.isFirstLoading()); + MainFrame.showMainFrame(); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java index c1c3f8855..97b6a306e 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/MinecraftLoader.java @@ -36,6 +36,7 @@ import org.jackhuang.hellominecraft.launcher.version.MinecraftLibrary; import org.jackhuang.hellominecraft.tasks.TaskWindow; import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.MessageBox; +import org.jackhuang.hellominecraft.utils.StrUtils; /** * @@ -67,7 +68,7 @@ public class MinecraftLoader extends AbstractMinecraftLoader { res.add((v.isCanceledWrapper() ? "" : "-mainClass=") + mainClass); String arg = v.getSelectedMinecraftVersion().minecraftArguments; - String[] splitted = org.jackhuang.hellominecraft.utils.StrUtils.tokenize(arg); + String[] splitted = StrUtils.tokenize(arg); if (!checkAssetsExist()) if (MessageBox.Show(C.i18n("assets.no_assets"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Config.java index 76c1ff26f..46e9b4a8d 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Config.java @@ -20,6 +20,7 @@ package org.jackhuang.hellominecraft.launcher.settings; import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import com.google.gson.annotations.SerializedName; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -40,8 +41,6 @@ public final class Config { private String last; @SerializedName("bgpath") private String bgpath; - @SerializedName("username") - private String username; @SerializedName("clientToken") private final String clientToken; private String proxyHost, proxyPort, proxyUserName, proxyPassword; @@ -116,15 +115,6 @@ public final class Config { Settings.save(); } - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - Settings.save(); - } - public String getClientToken() { return clientToken; } @@ -163,12 +153,12 @@ public final class Config { return configurations; } - public Map getYggdrasilConfig() { - return yggdrasil; + public Map getAuthenticatorConfig(String authId) { + return auth.get(authId); } - public void setYggdrasilConfig(Map yggdrasil) { - this.yggdrasil = yggdrasil; + public void setAuthenticatorConfig(String authId, Map map) { + auth.put(authId, map); Settings.save(); } @@ -178,17 +168,17 @@ public final class Config { private int downloadtype; @SerializedName("configurations") private TreeMap configurations; - @SerializedName("yggdrasil") - private Map yggdrasil; + @SerializedName("auth") + private Map auth; public Config() { clientToken = UUID.randomUUID().toString(); - username = ""; logintype = downloadtype = 0; enableShadow = false; enableAnimation = true; theme = 4; decorated = OS.os() == OS.LINUX; + auth = new HashMap<>(); } public DownloadType getDownloadSource() { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java index 7d15f06e6..660c9b413 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java @@ -32,7 +32,6 @@ import org.jackhuang.hellominecraft.utils.CollectionUtils; import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.MessageBox; -import org.jackhuang.hellominecraft.utils.StrUtils; import org.jackhuang.hellominecraft.utils.UpdateChecker; import org.jackhuang.hellominecraft.utils.VersionNumber; import org.jackhuang.hellominecraft.utils.system.Java; @@ -48,7 +47,6 @@ public final class Settings { public static final File SETTINGS_FILE = new File(IOUtils.currentDir(), "hmcl.json"); - private static boolean isFirstLoading; private static final Config SETTINGS; public static final UpdateChecker UPDATE_CHECKER = new UpdateChecker(new VersionNumber(Main.VERSION_FIRST, Main.VERSION_SECOND, Main.VERSION_THIRD), "hmcl"); @@ -58,10 +56,6 @@ public final class Settings { return SETTINGS; } - public static boolean isFirstLoading() { - return isFirstLoading; - } - static { SETTINGS = initSettings(); if (!getProfiles().containsKey(DEFAULT_PROFILE)) @@ -82,7 +76,7 @@ public final class Settings { private static Config initSettings() { Config c = new Config(); - if (SETTINGS_FILE.exists()) { + if (SETTINGS_FILE.exists()) try { String str = FileUtils.readFileToString(SETTINGS_FILE); if (str == null || str.trim().equals("")) @@ -100,11 +94,8 @@ public final class Settings { System.exit(1); } } - isFirstLoading = StrUtils.isBlank(c.getUsername()); - } else { + else HMCLog.log("No settings file here, may be first loading."); - isFirstLoading = true; - } return c; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/BestLogin.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/BestLogin.java index 229484564..e23501750 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/BestLogin.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/BestLogin.java @@ -79,6 +79,11 @@ public final class BestLogin extends IAuthenticator { } } + @Override + public String id() { + return "best"; + } + @Override public String getName() { return "BestLogin"; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/IAuthenticator.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/IAuthenticator.java index 711b7e663..37809270c 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/IAuthenticator.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/IAuthenticator.java @@ -18,7 +18,9 @@ package org.jackhuang.hellominecraft.launcher.utils.auth; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.jackhuang.hellominecraft.launcher.api.PluginManager; /** @@ -34,7 +36,7 @@ public abstract class IAuthenticator { PluginManager.NOW_PLUGIN.onRegisterAuthenticators(LOGINS::add); } - protected String clientToken; + protected String clientToken, username; public IAuthenticator(String clientToken) { this.clientToken = clientToken; @@ -52,6 +54,8 @@ public abstract class IAuthenticator { */ public abstract UserProfileProvider login(LoginInfo info) throws AuthenticationException; + public abstract String id(); + /** * * @return the name of login method. @@ -78,4 +82,24 @@ public abstract class IAuthenticator { public abstract UserProfileProvider loginBySettings() throws AuthenticationException; public abstract void logout(); + + public Map onSaveSettings() { + HashMap m = new HashMap(); + m.put("IAuthenticator_UserName", username); + return m; + } + + public void onLoadSettings(Map m) { + if (m == null) + return; + username = (String) m.get("IAuthenticator_UserName"); + } + + public String getUsername() { + return username; + } + + public void setUsername(String s) { + username = s; + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/OfflineAuthenticator.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/OfflineAuthenticator.java index 3f27c2d66..2f1d36c37 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/OfflineAuthenticator.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/OfflineAuthenticator.java @@ -49,6 +49,11 @@ public final class OfflineAuthenticator extends IAuthenticator { return DigestUtils.md5Hex(str); } + @Override + public String id() { + return "offline"; + } + @Override public String getName() { return C.i18n("login.methods.offline"); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/SkinmeAuthenticator.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/SkinmeAuthenticator.java index 7ada3b176..a5e9636fc 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/SkinmeAuthenticator.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/SkinmeAuthenticator.java @@ -104,6 +104,11 @@ public final class SkinmeAuthenticator extends IAuthenticator { } } + @Override + public String id() { + return "skinme"; + } + @Override public String getName() { return "Skinme"; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java index 650a8c61d..ab8ab0da6 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/YggdrasilAuthenticator.java @@ -92,16 +92,26 @@ public final class YggdrasilAuthenticator extends IAuthenticator { return ua.isLoggedIn(); } + @Override + public String id() { + return "yggdrasil"; + } + @Override public String getName() { return C.i18n("login.methods.yggdrasil"); } + @Override public Map onSaveSettings() { - return ua.saveForStorage(); + Map m = ua.saveForStorage(); + m.putAll(super.onSaveSettings()); + return m; } + @Override public void onLoadSettings(Map settings) { + super.onLoadSettings(settings); if (settings == null) return; ua.loadFromStorage(settings); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java index e5eb363a1..05e96145f 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java @@ -1241,7 +1241,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget // private boolean reloadingMods = false; - private void reloadMods() { + private synchronized void reloadMods() { if (reloadingMods) return; reloadingMods = true; @@ -1343,6 +1343,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget private javax.swing.JTextField txtWidth; // End of variables declaration//GEN-END:variables - private javax.swing.JPanel pnlGameDownloads; + private final javax.swing.JPanel pnlGameDownloads; // } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainFrame.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainFrame.java index ca82f9e48..ec53f73cd 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainFrame.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainFrame.java @@ -47,6 +47,7 @@ import org.jackhuang.hellominecraft.launcher.settings.Settings; import org.jackhuang.hellominecraft.launcher.utils.auth.IAuthenticator; import org.jackhuang.hellominecraft.lookandfeel.GraphicsUtils; import org.jackhuang.hellominecraft.lookandfeel.Theme; +import org.jackhuang.hellominecraft.utils.StrUtils; import org.jackhuang.hellominecraft.utils.Utils; import org.jackhuang.hellominecraft.views.DropShadowBorder; import org.jackhuang.hellominecraft.views.TintablePanel; @@ -388,10 +389,10 @@ public final class MainFrame extends DraggableFrame { windowTitle.setForeground(Color.white); } - public static void showMainFrame(boolean firstLoad) { - if (firstLoad) - SwingUtilities.invokeLater(() -> MainFrame.INSTANCE.showMessage(C.i18n("ui.message.first_load"))); + public static void showMainFrame() { IAuthenticator l = Settings.getInstance().getAuthenticator(); + if (StrUtils.isBlank(l.getUsername())) + SwingUtilities.invokeLater(() -> MainFrame.INSTANCE.showMessage(C.i18n("ui.message.first_load"))); if (l.hasPassword() && !l.isLoggedIn()) SwingUtilities.invokeLater(() -> MainFrame.INSTANCE.showMessage(C.i18n("ui.message.enter_password"))); INSTANCE.setVisible(true); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java index bd24df449..d46b41d25 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java @@ -297,7 +297,8 @@ public class MainPagePanel extends AnimatedPanel implements Event { }//GEN-LAST:event_txtPlayerNameFocusGained private void txtPlayerNameFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPlayerNameFocusLost - Settings.getInstance().setUsername(txtPlayerName.getText()); + IAuthenticator l = Settings.getInstance().getAuthenticator(); + l.setUsername(txtPlayerName.getText()); }//GEN-LAST:event_txtPlayerNameFocusLost private void cboLoginModeItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboLoginModeItemStateChanged @@ -350,8 +351,8 @@ public class MainPagePanel extends AnimatedPanel implements Event { private void txtPlayerNameKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtPlayerNameKeyPressed if (evt.getKeyCode() == KeyEvent.VK_ENTER) { - Settings.getInstance().setUsername(txtPlayerName.getText()); IAuthenticator l = Settings.getInstance().getAuthenticator(); + l.setUsername(txtPlayerName.getText()); if (!l.hasPassword()) runGame(); else if (!l.isLoggedIn()) @@ -400,7 +401,7 @@ public class MainPagePanel extends AnimatedPanel implements Event { return; } final IAuthenticator l = IAuthenticator.LOGINS.get(index); - final LoginInfo li = new LoginInfo(Settings.getInstance().getUsername(), l.isLoggedIn() || !l.hasPassword() ? null : new String(txtPassword.getPassword())); + final LoginInfo li = new LoginInfo(l.getUsername(), l.isLoggedIn() || !l.hasPassword() ? null : new String(txtPassword.getPassword())); new Thread() { @Override public void run() { @@ -458,9 +459,10 @@ public class MainPagePanel extends AnimatedPanel implements Event { cl.last(pnlPassword); else cl.first(pnlPassword); - String username = Settings.getInstance().getUsername(); - if (StrUtils.isNotBlank(username)) - txtPlayerName.setText(username); + String username = l.getUsername(); + if (username == null) + username = ""; + txtPlayerName.setText(username); } void loadFromSettings() { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/servers/ServerPlugin.java b/HMCLServer/src/main/java/org.jackhuang.hellominecraft.launcher/servers/ServerPlugin.java similarity index 100% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/servers/ServerPlugin.java rename to HMCLServer/src/main/java/org.jackhuang.hellominecraft.launcher/servers/ServerPlugin.java diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/servers/mfcraft/CheckModsMinecraftProvider.java b/HMCLServer/src/main/java/org.jackhuang.hellominecraft.launcher/servers/mfcraft/CheckModsMinecraftProvider.java similarity index 100% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/servers/mfcraft/CheckModsMinecraftProvider.java rename to HMCLServer/src/main/java/org.jackhuang.hellominecraft.launcher/servers/mfcraft/CheckModsMinecraftProvider.java diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/servers/mfcraft/MFCraftAuthenticator.java b/HMCLServer/src/main/java/org.jackhuang.hellominecraft.launcher/servers/mfcraft/MFCraftAuthenticator.java similarity index 100% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/servers/mfcraft/MFCraftAuthenticator.java rename to HMCLServer/src/main/java/org.jackhuang.hellominecraft.launcher/servers/mfcraft/MFCraftAuthenticator.java diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/servers/mfcraft/ServerArea.java b/HMCLServer/src/main/java/org.jackhuang.hellominecraft.launcher/servers/mfcraft/ServerArea.java similarity index 100% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/servers/mfcraft/ServerArea.java rename to HMCLServer/src/main/java/org.jackhuang.hellominecraft.launcher/servers/mfcraft/ServerArea.java diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/servers/mfcraft/Servers.java b/HMCLServer/src/main/java/org.jackhuang.hellominecraft.launcher/servers/mfcraft/Servers.java similarity index 100% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/servers/mfcraft/Servers.java rename to HMCLServer/src/main/java/org.jackhuang.hellominecraft.launcher/servers/mfcraft/Servers.java