diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java index e2fc7b704..310f3f79e 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Launcher.java @@ -18,6 +18,7 @@ package org.jackhuang.hellominecraft.launcher; import java.io.File; import java.io.FileOutputStream; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; @@ -128,11 +129,22 @@ public final class Launcher { System.err.println(advice); System.err.println(trace); LogWindow.instance.setVisible(true); - flag = 1; } println("*** Game Exited ***"); System.exit(flag); } + + static Object getShutdownHaltLock() { + try { + Class z = Class.forName("java.lang.Shutdown"); + Field haltLock = z.getDeclaredField("haltLock"); + haltLock.setAccessible(true); + return haltLock.get(null); + } catch (Throwable ex) { + ex.printStackTrace(); + return new Object(); + } + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java index 352a765ad..bc5e52cc9 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -23,7 +23,9 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.Authenticator; +import java.net.InetSocketAddress; import java.net.PasswordAuthentication; +import java.net.Proxy; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -57,6 +59,7 @@ import org.jackhuang.hellominecraft.launcher.views.MainFrame; import org.jackhuang.hellominecraft.lookandfeel.HelloMinecraftLookAndFeel; import org.jackhuang.hellominecraft.tasks.TaskWindow; import org.jackhuang.hellominecraft.utils.ArrayUtils; +import org.jackhuang.hellominecraft.utils.MathUtils; import org.jackhuang.hellominecraft.utils.system.MessageBox; import org.jackhuang.hellominecraft.utils.StrUtils; import org.jackhuang.hellominecraft.utils.VersionNumber; @@ -104,6 +107,7 @@ public final class Main implements Runnable { public static String launcherName = "Hello Minecraft! Launcher"; public static byte firstVer = 2, secondVer = 3, thirdVer = 5, forthVer = 5; public static int minimumLauncherVersion = 16; + public static Proxy PROXY; /** * Make the version of HMCL. @@ -125,6 +129,7 @@ public final class Main implements Runnable { public static final Main INSTANCE = new Main(); + @SuppressWarnings( {"CallToPrintStackTrace", "UseSpecificCatch"}) public static void main(String[] args) { { if (!ArrayUtils.contains(args, "nofound")) @@ -183,7 +188,7 @@ public final class Main implements Runnable { Settings.UPDATE_CHECKER.start(); - if (StrUtils.isNotBlank(Settings.getInstance().getProxyHost()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPort())) { + if (StrUtils.isNotBlank(Settings.getInstance().getProxyHost()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPort()) && MathUtils.canParseInt(Settings.getInstance().getProxyPort())) { System.setProperty("http.proxyHost", Settings.getInstance().getProxyHost()); System.setProperty("http.proxyPort", Settings.getInstance().getProxyPort()); if (StrUtils.isNotBlank(Settings.getInstance().getProxyUserName()) && StrUtils.isNotBlank(Settings.getInstance().getProxyPassword())) @@ -193,6 +198,9 @@ public final class Main implements Runnable { return new PasswordAuthentication(Settings.getInstance().getProxyUserName(), Settings.getInstance().getProxyPassword().toCharArray()); } }); + PROXY = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(Settings.getInstance().getProxyHost(), Integer.parseInt(Settings.getInstance().getProxyPort()))); + } else { + PROXY = Proxy.NO_PROXY; } try { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java index d3e97becb..cd934bac0 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/GameLauncher.java @@ -30,6 +30,7 @@ import org.jackhuang.hellominecraft.launcher.utils.auth.LoginInfo; import org.jackhuang.hellominecraft.launcher.utils.auth.UserProfileProvider; import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import org.jackhuang.hellominecraft.launcher.settings.Profile; +import org.jackhuang.hellominecraft.launcher.utils.auth.AuthenticationException; import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.system.JavaProcess; @@ -77,20 +78,10 @@ public class GameLauncher { result = login.login(info); else result = login.loginBySettings(); - } catch (Exception e) { - HMCLog.err("An exception has thrown when logging in.", e); - result = new UserProfileProvider(); - result.setSuccess(false); - result.setErrorReason(e.getLocalizedMessage()); - } - if (result == null || result.isSuccessful() == false) { - String error; - if (result == null || result.getErrorReason() == null) - error = C.i18n("login.failed"); - else { - error = C.i18n("login.failed") + result.getErrorReason(); - HMCLog.warn("Login failed by method: " + login.getName() + ", state: " + result.isSuccessful() + ", error reason: " + result.getErrorReason()); - } + if (result == null) throw new AuthenticationException("Result can not be null."); + } catch (Throwable e) { + String error = C.i18n("login.failed") + e.getMessage(); + HMCLog.warn("Login failed by method: " + login.getName(), e); failEvent.execute(error); return null; } 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 c54e35839..89c95a5c9 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Settings.java @@ -130,7 +130,7 @@ public final class Settings { } public static Collection getProfilesFiltered() { - return CollectionUtils.sortOut(getProfiles().values(), (t) -> t != null && t.getName() != null); + return CollectionUtils.map(getProfiles().values(), (t) -> t != null && t.getName() != null); } public static Profile getOneProfile() { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java index 9893bf1d4..3ab613c1d 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/CrashReporter.java @@ -16,6 +16,7 @@ */ package org.jackhuang.hellominecraft.launcher.utils; +import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; @@ -120,7 +121,12 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { new Thread(() -> { HashMap map = new HashMap<>(); map.put("CrashReport", text); - System.out.println(NetUtils.post(NetUtils.constantURL("http://huangyuhui.duapp.com/crash.php"), map)); + try { + System.out.println(NetUtils.post(NetUtils.constantURL("http://huangyuhui.duapp.com/crash.php"), map)); + } catch (IOException ex) { + System.out.println("Failed to send post request to HMCL server."); + ex.printStackTrace(); + } }).start(); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java index b382813bd..c5bbe54f2 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/MCUtils.java @@ -329,7 +329,7 @@ public final class MCUtils { } public static MinecraftRemoteVersions getRemoteMinecraftVersions(DownloadType sourceType) throws IOException { - String result = NetUtils.doGet(sourceType.getProvider().getVersionsListDownloadURL()); + String result = NetUtils.get(sourceType.getProvider().getVersionsListDownloadURL()); return MinecraftRemoteVersions.fromJson(result); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/AuthenticationException.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/AuthenticationException.java similarity index 84% rename from HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/AuthenticationException.java rename to HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/AuthenticationException.java index 5c04fa722..e1b91d626 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/AuthenticationException.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/AuthenticationException.java @@ -1,4 +1,4 @@ -package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil; +package org.jackhuang.hellominecraft.launcher.utils.auth; public class AuthenticationException extends Exception { 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 207fd8b08..1a4cd93cb 100644 --- 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 @@ -16,6 +16,7 @@ */ package org.jackhuang.hellominecraft.launcher.utils.auth; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; @@ -32,7 +33,7 @@ public final class BestLogin extends IAuthenticator { } @Override - public UserProfileProvider login(LoginInfo info) { + public UserProfileProvider login(LoginInfo info) throws AuthenticationException { try { String request = "bl:l:" + info.username + ":" + DigestUtils.sha1Hex(info.password); @@ -42,34 +43,25 @@ public final class BestLogin extends IAuthenticator { os.write(request.getBytes()); UserProfileProvider lr = new UserProfileProvider(); - lr.setSuccess(false); InputStream is = socket.getInputStream(); int code = is.read(); switch (code) { case -1: - lr.setErrorReason("internet error."); - break; + throw new AuthenticationException("internet error."); case 200: - lr.setErrorReason("server restarting."); - break; + throw new AuthenticationException("server restarting."); case 255: - lr.setErrorReason("unknown error"); - break; + throw new AuthenticationException("unknown error"); case 3: - lr.setErrorReason("unregistered."); - break; + throw new AuthenticationException("unregistered."); case 50: - lr.setErrorReason("please update your launcher and act your account."); - break; + throw new AuthenticationException("please update your launcher and act your account."); case 2: - lr.setErrorReason("wrong password."); - break; + throw new AuthenticationException("wrong password."); case 100: - lr.setErrorReason("server reloading."); - break; + throw new AuthenticationException("server reloading."); case 0: - lr.setSuccess(true); byte[] b = new byte[64]; is.read(b, 0, b.length); String[] ss = new String(b).split(":"); @@ -81,11 +73,8 @@ public final class BestLogin extends IAuthenticator { } lr.setUserType("Legacy"); return lr; - } catch (Throwable t) { - UserProfileProvider lr = new UserProfileProvider(); - lr.setSuccess(false); - lr.setErrorReason(t.getMessage()); - return lr; + } catch (IOException t) { + throw new AuthenticationException(t); } } 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 95941e84c..8950dabd5 100644 --- 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 @@ -58,8 +58,9 @@ public abstract class IAuthenticator { * @param info username & password * * @return login result + * @throws org.jackhuang.hellominecraft.launcher.utils.auth.AuthenticationException */ - public abstract UserProfileProvider login(LoginInfo info); + public abstract UserProfileProvider login(LoginInfo info) throws AuthenticationException; /** * @@ -84,7 +85,7 @@ public abstract class IAuthenticator { } - public abstract UserProfileProvider loginBySettings(); + public abstract UserProfileProvider loginBySettings() throws AuthenticationException; public abstract void logout(); } 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 77a572f2a..a0b1edd8b 100644 --- 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 @@ -31,16 +31,16 @@ public final class OfflineAuthenticator extends IAuthenticator { } @Override - public UserProfileProvider login(LoginInfo info) { + public UserProfileProvider login(LoginInfo info) throws AuthenticationException { + if(StrUtils.isBlank(info.username)) + throw new AuthenticationException(C.i18n("login.no_Player007")); UserProfileProvider result = new UserProfileProvider(); - result.setSuccess(StrUtils.isNotBlank(info.username)); result.setUserName(info.username); String uuid = getUUIDFromUserName(info.username); result.setSession(uuid); result.setUserId(uuid); result.setAccessToken(uuid); result.setUserType("Legacy"); - result.setErrorReason(C.i18n("login.no_Player007")); return result; } 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 116da30bc..a2f402baa 100644 --- 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 @@ -37,21 +37,15 @@ public final class SkinmeAuthenticator extends IAuthenticator { } public String getCharacter(String user, String hash, String $char) throws Exception { - if ($char == null) - return NetUtils.doGet( - "http://www.skinme.cc/api/login.php?user=" + user + "&hash=" + hash); - else - return NetUtils.doGet( - "http://www.skinme.cc/api/login.php?user=" + user + "&hash=" + hash + "&char=" + $char); + return NetUtils.get( + "http://www.skinme.cc/api/login.php?user=" + user + "&hash=" + hash + (($char == null) ? "" : ("&char=" + $char))); } @Override - public UserProfileProvider login(LoginInfo info) { + public UserProfileProvider login(LoginInfo info) throws AuthenticationException { UserProfileProvider req = new UserProfileProvider(); if (info.username == null || !info.username.contains("@")) { - req.setSuccess(false); - req.setErrorReason(C.i18n("login.not_email")); - return req; + throw new AuthenticationException(C.i18n("login.not_email")); } try { String usr = info.username.toLowerCase(); @@ -64,13 +58,10 @@ public final class SkinmeAuthenticator extends IAuthenticator { if (null != sl[0]) switch (sl[0]) { case "0": - req.setSuccess(false); if (sl[1].contains("No Valid Character")) sl[1] = C.i18n("login.no_valid_character"); - req.setErrorReason(sl[1]); - break; + throw new AuthenticationException(sl[1]); case "1": { - req.setSuccess(true); String[] s = parseType1(sl[1]); req.setUserName(s[0]); req.setSession(s[1]); @@ -79,7 +70,6 @@ public final class SkinmeAuthenticator extends IAuthenticator { break; } case "2": { - req.setSuccess(true); String[] charators = sl[1].split(";"); int len = charators.length; String[] $char = new String[len]; @@ -93,8 +83,7 @@ public final class SkinmeAuthenticator extends IAuthenticator { Selector s = new Selector(null, user, C.i18n("login.choose_charactor")); s.setVisible(true); if (s.sel == Selector.failedToSel) { - req.setSuccess(false); - req.setErrorReason(C.i18n("message.cancelled")); + throw new AuthenticationException(C.i18n("message.cancelled")); } else { int index = s.sel; String character = $char[index]; @@ -112,13 +101,7 @@ public final class SkinmeAuthenticator extends IAuthenticator { req.setUserType("Legacy"); return req; } catch (Exception e) { - HMCLog.warn("Failed to login skinme.", e); - - req.setUserName(info.username); - req.setSuccess(false); - req.setUserType("Legacy"); - req.setErrorReason(e.getMessage()); - return req; + throw new AuthenticationException(e); } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/UserProfileProvider.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/UserProfileProvider.java index 5c034c013..b482044aa 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/UserProfileProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/UserProfileProvider.java @@ -51,17 +51,10 @@ public final class UserProfileProvider { } public void setAccessToken(String accessToken) { + if (accessToken == null) accessToken = "0"; this.accessToken = accessToken; } - public boolean isSuccessful() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } - public String getErrorReason() { return error; } @@ -114,7 +107,6 @@ public final class UserProfileProvider { private String userId = ""; private String session = ""; private String accessToken = ""; - private boolean success = false; private String error = ""; private String userProperties = "{}"; private String userPropertyMap = "{}"; 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 2c9f7e0ce..a2d2d9cb4 100644 --- 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 @@ -17,11 +17,10 @@ package org.jackhuang.hellominecraft.launcher.utils.auth; import com.google.gson.GsonBuilder; -import java.net.Proxy; import java.util.Map; import javax.swing.JOptionPane; import org.jackhuang.hellominecraft.C; -import org.jackhuang.hellominecraft.HMCLog; +import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.utils.ArrayUtils; import org.jackhuang.hellominecraft.views.Selector; import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.GameProfile; @@ -39,46 +38,34 @@ public final class YggdrasilAuthenticator extends IAuthenticator { public YggdrasilAuthenticator(String clientToken) { super(clientToken); - ua = new YggdrasilAuthentication(Proxy.NO_PROXY, clientToken); + ua = new YggdrasilAuthentication(Main.PROXY, clientToken); } @Override - public UserProfileProvider login(LoginInfo info) { - if (ua.canPlayOnline()) { - UserProfileProvider result = new UserProfileProvider(); - result.setUserName(info.username); - result.setSuccess(true); - result.setUserId(UUIDTypeAdapter.fromUUID(ua.getSelectedProfile().id)); - result.setUserProperties(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.LegacySerializer()).create().toJson(ua.getUserProperties())); - result.setUserPropertyMap(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer()).create().toJson(ua.getUserProperties())); - result.setAccessToken(ua.getAuthenticatedToken()); - result.setSession(ua.getAuthenticatedToken()); - result.setUserType("mojang"); - return result; - } + public UserProfileProvider login(LoginInfo info) throws AuthenticationException { UserProfileProvider result = new UserProfileProvider(); - String usr = info.username; - if (info.username == null || !info.username.contains("@")) { - result.setSuccess(false); - result.setErrorReason(C.i18n("login.not_email")); - return result; - } - String pwd = info.password; + result.setUserType("mojang"); + if (ua.canPlayOnline()) { + result.setUserName(info.username); + result.setUserId(UUIDTypeAdapter.fromUUID(ua.getSelectedProfile().id)); + } else { + String usr = info.username; + if (info.username == null || !info.username.contains("@")) + throw new AuthenticationException(C.i18n("login.not_email")); + String pwd = info.password; - if (!ua.isLoggedIn()) - ua.setPassword(pwd); - ua.setUsername(usr); - try { + if (!ua.isLoggedIn()) + ua.setPassword(pwd); + ua.setUsername(usr); ua.logIn(); if (!ua.isLoggedIn()) - throw new Exception(C.i18n("login.wrong_password")); + throw new AuthenticationException(C.i18n("login.wrong_password")); GameProfile selectedProfile = ua.getSelectedProfile(); GameProfile[] profiles = ua.getAvailableProfiles(); - String[] names; String username; if (selectedProfile == null) if (ArrayUtils.isNotEmpty(profiles)) { - names = new String[profiles.length]; + String[] names = new String[profiles.length]; for (int i = 0; i < profiles.length; i++) names[i] = profiles[i].name; Selector s = new Selector(null, names, C.i18n("login.choose_charactor")); @@ -90,23 +77,12 @@ public final class YggdrasilAuthenticator extends IAuthenticator { else username = selectedProfile.name; result.setUserName(username); - result.setSuccess(true); result.setUserId(selectedProfile == null ? OfflineAuthenticator.getUUIDFromUserName(username) : UUIDTypeAdapter.fromUUID(selectedProfile.id)); - result.setUserProperties(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.LegacySerializer()).create().toJson(ua.getUserProperties())); - result.setUserPropertyMap(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer()).create().toJson(ua.getUserProperties())); - String authToken = ua.getAuthenticatedToken(); - if (authToken == null) - authToken = "0"; - result.setAccessToken(authToken); - result.setSession(authToken); - } catch (Exception ex) { - result.setErrorReason(ex.getMessage()); - result.setSuccess(false); - result.setUserName(ua.getUserID()); - - HMCLog.err("Failed to login by yggdrasil authentication.", ex); } - result.setUserType("mojang"); + result.setUserProperties(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.LegacySerializer()).create().toJson(ua.getUserProperties())); + result.setUserPropertyMap(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer()).create().toJson(ua.getUserProperties())); + result.setAccessToken(ua.getAuthenticatedToken()); + result.setSession(ua.getAuthenticatedToken()); return result; } @@ -131,23 +107,19 @@ public final class YggdrasilAuthenticator extends IAuthenticator { } @Override - public UserProfileProvider loginBySettings() { - UserProfileProvider info = new UserProfileProvider(); - try { - ua.logIn(); - if (!ua.isLoggedIn()) - throw new Exception(C.i18n("login.wrong_password")); - GameProfile profile = ua.getSelectedProfile(); - info.setUserName(profile.name); - info.setSuccess(true); - info.setUserId(profile.id.toString()); - info.setAccessToken(ua.getAuthenticatedToken()); - } catch (Exception ex) { - info.setErrorReason(ex.getMessage()); - info.setSuccess(false); - info.setUserName(ua.getUserID()); - } - return info; + public UserProfileProvider loginBySettings() throws AuthenticationException { + UserProfileProvider result = new UserProfileProvider(); + ua.logIn(); + if (!ua.isLoggedIn()) + throw new AuthenticationException(C.i18n("login.wrong_password")); + GameProfile profile = ua.getSelectedProfile(); + result.setUserName(profile.name); + result.setUserId(profile.id.toString()); + result.setUserProperties(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.LegacySerializer()).create().toJson(ua.getUserProperties())); + result.setUserPropertyMap(new GsonBuilder().registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer()).create().toJson(ua.getUserProperties())); + result.setAccessToken(ua.getAuthenticatedToken()); + result.setSession(ua.getAuthenticatedToken()); + return result; } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/GameProfile.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/GameProfile.java index d6012d52f..211dc44e5 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/GameProfile.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/GameProfile.java @@ -31,6 +31,7 @@ public class GameProfile { @Override public boolean equals(Object o) { + System.out.println("hello?"); if (this == o) return true; if (o == null || getClass() != o.getClass()) @@ -43,13 +44,6 @@ public class GameProfile { return name != null ? name.equals(that.name) : that.name == null; } - @Override - public int hashCode() { - int result = id != null ? id.hashCode() : 0; - result = 31 * result + (name != null ? name.hashCode() : 0); - return result; - } - public static class GameProfileSerializer implements JsonSerializer, JsonDeserializer { @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/Response.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/Response.java index 73c6488ba..a84a8097c 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/Response.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/Response.java @@ -1,7 +1,5 @@ package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil; -import org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil.GameProfile; - public class Response { public String accessToken, clientToken; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/YggdrasilAuthentication.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/YggdrasilAuthentication.java index ed511a472..58c0a7a76 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/YggdrasilAuthentication.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/auth/yggdrasil/YggdrasilAuthentication.java @@ -1,5 +1,6 @@ package org.jackhuang.hellominecraft.launcher.utils.auth.yggdrasil; +import org.jackhuang.hellominecraft.launcher.utils.auth.AuthenticationException; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; @@ -62,65 +63,22 @@ public class YggdrasilAuthentication { this.password = password; } - protected String getUsername() { - return this.username; - } - - protected String getPassword() { - return this.password; - } - - protected void setSelectedProfile(GameProfile selectedProfile) { - this.selectedProfile = selectedProfile; - } - public GameProfile getSelectedProfile() { return this.selectedProfile; } - public String getUserID() { + public String getUserId() { return this.userid; } public PropertyMap getUserProperties() { - if (isLoggedIn()) { - PropertyMap result = new PropertyMap(); - result.putAll(getModifiableUserProperties()); - return result; - } + if (isLoggedIn()) + return (PropertyMap) userProperties.clone(); return new PropertyMap(); } - protected PropertyMap getModifiableUserProperties() { - return this.userProperties; - } - - protected void updateUserProperties(User user) { - if (user != null && user.properties != null) - getModifiableUserProperties().putAll(user.properties); - } - - protected void setUserId(String userid) { - this.userid = userid; - } - - public Proxy getProxy() { - return this.proxy; - } - - public String getClientToken() { - return this.clientToken; - } - public GameProfile[] getAvailableProfiles() { - return this.profiles; - } - - @Deprecated - public String getSessionToken() { - if (isLoggedIn() && getSelectedProfile() != null && canPlayOnline()) - return String.format("token:%s:%s", new Object[] {getAuthenticatedToken(), getSelectedProfile().id}); - return null; + return profiles; } public String getAuthenticatedToken() { @@ -134,7 +92,7 @@ public class YggdrasilAuthentication { } public boolean canLogIn() { - return !canPlayOnline() && StrUtils.isNotBlank(getUsername()) && (StrUtils.isNotBlank(getPassword()) || StrUtils.isNotBlank(getAuthenticatedToken())); + return !canPlayOnline() && StrUtils.isNotBlank(username) && (StrUtils.isNotBlank(password) || StrUtils.isNotBlank(getAuthenticatedToken())); } public boolean isLoggedIn() { @@ -142,69 +100,62 @@ public class YggdrasilAuthentication { } public void logIn() throws AuthenticationException { - if (StrUtils.isBlank(getUsername())) + if (StrUtils.isBlank(username)) throw new AuthenticationException(C.i18n("login.invalid_username")); - if (StrUtils.isNotBlank(getAuthenticatedToken())) - logInWithToken(); - else if (StrUtils.isNotBlank(getPassword())) - logInWithPassword(); + if (StrUtils.isNotBlank(getAuthenticatedToken())) { + if (StrUtils.isBlank(getUserId())) + if (StrUtils.isNotBlank(username)) + userid = username; + else + throw new AuthenticationException(C.i18n("login.invalid_uuid_and_username")); + + loggedIn(ROUTE_REFRESH, new RefreshRequest(getAuthenticatedToken(), clientToken)); + } else if (StrUtils.isNotBlank(password)) + loggedIn(ROUTE_AUTHENTICATE, new AuthenticationRequest(username, password, clientToken)); else throw new AuthenticationException(C.i18n("login.invalid_password")); } + + private void loggedIn(URL url, Object input) throws AuthenticationException { + try { + String jsonResult = input == null ? NetUtils.get(url) : NetUtils.post(url, GSON.toJson(input), "application/json", proxy); + Response response = (Response) GSON.fromJson(jsonResult, Response.class); - private void logInWithPassword() throws AuthenticationException { - Response response = request(ROUTE_AUTHENTICATE, new AuthenticationRequest(getUsername(), getPassword(), clientToken)); - if (!response.clientToken.equals(clientToken)) - throw new AuthenticationException(C.i18n("login.changed_client_token")); + if (StrUtils.isNotBlank(response.error)) + throw new AuthenticationException("Request error: " + response.errorMessage); - User user = response.user; - setUserId(user != null && user.id != null ? user.id : getUsername()); + if (!clientToken.equals(response.clientToken)) + throw new AuthenticationException(C.i18n("login.changed_client_token")); - this.isOnline = true; - this.accessToken = response.accessToken; + User user = response.user; + userid = user != null && user.id != null ? user.id : username; - this.profiles = response.availableProfiles; - setSelectedProfile(response.selectedProfile); - getModifiableUserProperties().clear(); + isOnline = true; + profiles = response.availableProfiles; + selectedProfile = response.selectedProfile; + userProperties.clear(); + this.accessToken = response.accessToken; - updateUserProperties(user); - } - - protected void logInWithToken() throws AuthenticationException { - if (StrUtils.isBlank(getUserID())) - if (StrUtils.isBlank(getUsername())) - setUserId(getUsername()); - else - throw new AuthenticationException(C.i18n("login.invalid_uuid_and_username")); - - Response response = request(ROUTE_REFRESH, new RefreshRequest(getAuthenticatedToken(), getClientToken())); - if (!clientToken.equals(response.clientToken)) - throw new AuthenticationException(C.i18n("login.changed_client_token")); - - setUserId(response.user != null && response.user.id != null ? response.user.id : getUsername()); - - this.isOnline = true; - this.accessToken = response.accessToken; - this.profiles = response.availableProfiles; - setSelectedProfile(response.selectedProfile); - getModifiableUserProperties().clear(); - - updateUserProperties(response.user); + if (user != null && user.properties != null) + userProperties.putAll(user.properties); + } catch (IOException | IllegalStateException | JsonParseException e) { + throw new AuthenticationException(C.i18n("login.failed.connect_authentication_server"), e); + } } public void logOut() { - this.password = null; - this.userid = null; - setSelectedProfile(null); - getModifiableUserProperties().clear(); + password = null; + userid = null; + selectedProfile = null; + userProperties.clear(); - this.accessToken = null; - this.profiles = null; - this.isOnline = false; + accessToken = null; + profiles = null; + isOnline = false; } - // + // // public void loadFromStorage(Map credentials) { logOut(); @@ -212,18 +163,18 @@ public class YggdrasilAuthentication { setUsername((String) credentials.get(STORAGE_KEY_USER_NAME)); if (credentials.containsKey(STORAGE_KEY_USER_ID)) - this.userid = (String) credentials.get(STORAGE_KEY_USER_ID); + userid = (String) credentials.get(STORAGE_KEY_USER_ID); else - this.userid = this.username; + userid = username; if (credentials.containsKey(STORAGE_KEY_USER_PROPERTIES)) - getModifiableUserProperties().fromList((List>) credentials.get(STORAGE_KEY_USER_PROPERTIES)); + userProperties.fromList((List>) credentials.get(STORAGE_KEY_USER_PROPERTIES)); if ((credentials.containsKey(STORAGE_KEY_PROFILE_NAME)) && (credentials.containsKey(STORAGE_KEY_PROFILE_ID))) { GameProfile profile = new GameProfile(UUIDTypeAdapter.fromString((String) credentials.get(STORAGE_KEY_PROFILE_ID)), (String) credentials.get(STORAGE_KEY_PROFILE_NAME)); if (credentials.containsKey(STORAGE_KEY_PROFILE_PROPERTIES)) profile.properties.fromList((List>) credentials.get(STORAGE_KEY_PROFILE_PROPERTIES)); - setSelectedProfile(profile); + selectedProfile = profile; } this.accessToken = (String) credentials.get(STORAGE_KEY_ACCESS_TOKEN); @@ -232,10 +183,10 @@ public class YggdrasilAuthentication { public Map saveForStorage() { Map result = new HashMap<>(); - if (getUsername() != null) - result.put(STORAGE_KEY_USER_NAME, getUsername()); - if (getUserID() != null) - result.put(STORAGE_KEY_USER_ID, getUserID()); + if (username != null) + result.put(STORAGE_KEY_USER_NAME, username); + if (getUserId() != null) + result.put(STORAGE_KEY_USER_ID, getUserId()); if (!getUserProperties().isEmpty()) result.put(STORAGE_KEY_USER_PROPERTIES, getUserProperties().list()); @@ -255,20 +206,4 @@ public class YggdrasilAuthentication { } // - protected Response request(URL url, Object input) throws AuthenticationException { - try { - String jsonResult = input == null ? NetUtils.doGet(url) : NetUtils.post(url, GSON.toJson(input), "application/json", proxy); - Response result = (Response) GSON.fromJson(jsonResult, Response.class); - - if (result == null) - return null; - - if (StrUtils.isNotBlank(result.error)) - throw new AuthenticationException("InvalidCredentials " + result.errorMessage); - - return result; - } catch (IOException | IllegalStateException | JsonParseException e) { - throw new AuthenticationException(C.i18n("login.failed.connect_authentication_server"), e); - } - } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/bmcl/ForgeBMCLVersionList.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/bmcl/ForgeBMCLVersionList.java index 958c77dc8..8736184a4 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/bmcl/ForgeBMCLVersionList.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/bmcl/ForgeBMCLVersionList.java @@ -58,7 +58,7 @@ public class ForgeBMCLVersionList extends InstallerVersionList { for (String x : neededVersions) { if (versionMap.containsKey(x)) continue; - String s = NetUtils.doGet("http://bmclapi2.bangbang93.com/forge/minecraft/" + x); + String s = NetUtils.get("http://bmclapi2.bangbang93.com/forge/minecraft/" + x); if (s == null) continue; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/vanilla/MinecraftForgeVersionList.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/vanilla/MinecraftForgeVersionList.java index 20499e71f..f51950ad5 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/vanilla/MinecraftForgeVersionList.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/vanilla/MinecraftForgeVersionList.java @@ -48,7 +48,7 @@ public class MinecraftForgeVersionList extends InstallerVersionList { @Override public void refreshList(String[] needed) throws Exception { - String s = NetUtils.doGet(Settings.getInstance().getDownloadSource().getProvider().getParsedLibraryDownloadURL(C.URL_FORGE_LIST)); + String s = NetUtils.get(Settings.getInstance().getDownloadSource().getProvider().getParsedLibraryDownloadURL(C.URL_FORGE_LIST)); if (root != null) return; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/liteloader/LiteLoaderVersionList.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/liteloader/LiteLoaderVersionList.java index 78f7078c1..c52987998 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/liteloader/LiteLoaderVersionList.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/liteloader/LiteLoaderVersionList.java @@ -50,7 +50,7 @@ public class LiteLoaderVersionList extends InstallerVersionList { @Override public void refreshList(String[] needed) throws Exception { - String s = NetUtils.doGet(C.URL_LITELOADER_LIST); + String s = NetUtils.get(C.URL_LITELOADER_LIST); if (root != null) return; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/bmcl/OptiFineBMCLVersionList.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/bmcl/OptiFineBMCLVersionList.java index 85b9bfa8f..d5e81c6a9 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/bmcl/OptiFineBMCLVersionList.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/bmcl/OptiFineBMCLVersionList.java @@ -51,7 +51,7 @@ public class OptiFineBMCLVersionList extends InstallerVersionList { @Override public void refreshList(String[] needed) throws Exception { - String s = NetUtils.doGet("http://bmclapi.bangbang93.com/optifine/versionlist"); + String s = NetUtils.get("http://bmclapi.bangbang93.com/optifine/versionlist"); versionMap = new HashMap<>(); versions = new ArrayList<>(); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/vanilla/OptiFineDownloadFormatter.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/vanilla/OptiFineDownloadFormatter.java index c5ddc228a..50bd096f5 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/vanilla/OptiFineDownloadFormatter.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/vanilla/OptiFineDownloadFormatter.java @@ -38,7 +38,7 @@ public class OptiFineDownloadFormatter extends Task implements PreviousResult(); 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 2a725a691..053fb7711 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainFrame.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainFrame.java @@ -373,7 +373,7 @@ public final class MainFrame extends DraggableFrame { } public void invokeUpdate() { - defaultTitle = defaultTitle + C.i18n("update.found"); + defaultTitle = Main.makeTitle() + C.i18n("update.found"); if (!isShowedMessage) { windowTitle.setText(defaultTitle); windowTitle.setForeground(Color.red); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java index 2104c6497..95101f552 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/CollectionUtils.java @@ -33,7 +33,7 @@ public final class CollectionUtils { p.accept(t); } - public static Collection sortOut(Collection coll, Predicate p) { + public static ArrayList map(Collection coll, Predicate p) { ArrayList newColl = new ArrayList<>(); forEach(coll, t -> { if (p.apply(t)) diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/NetUtils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/NetUtils.java index 302d638c9..800f9aac9 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/NetUtils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/NetUtils.java @@ -16,7 +16,6 @@ */ package org.jackhuang.hellominecraft.utils; -import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -26,7 +25,6 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.Proxy; import java.net.URL; -import java.net.URLConnection; import java.util.Map; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.utils.system.IOUtils; @@ -63,64 +61,23 @@ public final class NetUtils { return sb.toString(); } - public static String doGet(String url, String encoding) throws IOException { + public static String get(String url, String encoding) throws IOException { return getStreamContent(new URL(url).openConnection().getInputStream()); } - public static String doGet(String url) throws IOException { - return doGet(url, DEFAULT_CHARSET); + public static String get(String url) throws IOException { + return get(url, DEFAULT_CHARSET); } - public static String doGet(URL url) throws IOException { - return doGet(url, Proxy.NO_PROXY); + public static String get(URL url) throws IOException { + return get(url, Proxy.NO_PROXY); } - public static String doGet(URL url, Proxy proxy) throws IOException { + public static String get(URL url, Proxy proxy) throws IOException { return getStreamContent(url.openConnection(proxy).getInputStream()); } - /** - * Sends an HTTP GET request to a url - * - * @param endpoint - The URL of the server. (Example: " - * http://www.yahoo.com/search") - * @param requestParameters - all the request parameters (Example: - * "param1=val1¶m2=val2"). Note: This method will add the question mark - * (?) to the request - DO NOT add it yourself - * - * @return - The response from the end point - */ - public static String sendGetRequest(String endpoint, - String requestParameters) { - String result = null; - if (endpoint.startsWith("http://")) - // Send a GET request to the servlet - try { - // Construct data - StringBuilder data = new StringBuilder(); - // Send data - String urlStr = endpoint; - if (requestParameters != null && requestParameters.length() > 0) - urlStr += "?" + requestParameters; - URL url = new URL(urlStr); - URLConnection conn = url.openConnection(); - - // Get the response - InputStreamReader r = new InputStreamReader(conn.getInputStream()); - StringBuffer sb; - BufferedReader rd = new BufferedReader(r); - sb = new StringBuffer(); - String line; - while ((line = rd.readLine()) != null) - sb.append(line); - result = sb.toString(); - } catch (Exception e) { - HMCLog.warn("Failed to send get request.", e); - } - return result; - } - - public static String post(URL u, Map params) { + public static String post(URL u, Map params) throws IOException { StringBuilder sb = new StringBuilder(); if (params != null) { for (Map.Entry e : params.entrySet()) { @@ -134,54 +91,49 @@ public final class NetUtils { return post(u, sb.toString()); } - public static String post(URL u, String post) { + public static String post(URL u, String post) throws IOException { return post(u, post, "application/x-www-form-urlencoded"); } - public static String post(URL u, String post, String contentType) { + public static String post(URL u, String post, String contentType) throws IOException { return post(u, post, contentType, Proxy.NO_PROXY); } - public static String post(URL u, String post, String contentType, Proxy proxy) { + public static String post(URL u, String post, String contentType, Proxy proxy) throws IOException { + HttpURLConnection con = (HttpURLConnection) u.openConnection(proxy); + con.setRequestMethod("POST"); + con.setDoOutput(true); + con.setDoInput(true); + con.setUseCaches(false); + con.setConnectTimeout(15000); + con.setReadTimeout(15000); + con.setRequestProperty("Content-Type", contentType + "; charset=utf-8"); + con.setRequestProperty("Content-Length", "" + post.getBytes(DEFAULT_CHARSET).length); + OutputStream os = null; try { - HttpURLConnection con = (HttpURLConnection) u.openConnection(proxy); - con.setRequestMethod(METHOD_POST); - con.setDoOutput(true); - con.setDoInput(true); - con.setUseCaches(false); - con.setConnectTimeout(15000); - con.setReadTimeout(15000); - con.setRequestProperty("Content-Type", contentType + "; charset=utf-8"); - con.setRequestProperty("Content-Length", "" + post.getBytes(DEFAULT_CHARSET).length); - OutputStream os = null; - try { - os = con.getOutputStream(); - IOUtils.write(post, os, DEFAULT_CHARSET); - } finally { - if (os != null) - IOUtils.closeQuietly(os); - } - - String result = null; - InputStream is = null; - try { - is = con.getInputStream(); - result = getStreamContent(is); - } catch (IOException ex) { - if (is != null) - IOUtils.closeQuietly(is); - is = con.getErrorStream(); - result = getStreamContent(is); - } - - con.disconnect(); - return result; - } catch (Exception e) { - HMCLog.warn("Failed to post.", e); - return null; + os = con.getOutputStream(); + IOUtils.write(post, os, DEFAULT_CHARSET); + } finally { + if (os != null) + IOUtils.closeQuietly(os); } + + String result; + InputStream is = null; + try { + is = con.getInputStream(); + result = getStreamContent(is); + } catch (IOException ex) { + if (is != null) + IOUtils.closeQuietly(is); + is = con.getErrorStream(); + result = getStreamContent(is); + } + + con.disconnect(); + return result; } - private static final String METHOD_POST = "POST"; + private static final String DEFAULT_CHARSET = "UTF-8"; public static URL constantURL(String url) { diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/UpdateChecker.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/UpdateChecker.java index 593be318c..d84c93505 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/UpdateChecker.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/UpdateChecker.java @@ -47,7 +47,7 @@ public final class UpdateChecker extends Thread { public void run() { try { - versionString = NetUtils.doGet("http://huangyuhui.duapp.com/info.php?type=" + type); + versionString = NetUtils.get("http://huangyuhui.duapp.com/info.php?type=" + type); } catch (Exception e) { HMCLog.warn("Failed to get update url.", e); return; @@ -75,7 +75,7 @@ public final class UpdateChecker extends Thread { new Thread(() -> { if (download_link == null) try { - download_link = C.gson.fromJson(NetUtils.doGet("http://huangyuhui.duapp.com/update_link.php?type=" + type), Map.class); + download_link = C.gson.fromJson(NetUtils.get("http://huangyuhui.duapp.com/update_link.php?type=" + type), Map.class); } catch (Exception e) { HMCLog.warn("Failed to get update link.", e); } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/JavaProcessMonitor.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/JavaProcessMonitor.java index 959f117a5..c28cb4814 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/JavaProcessMonitor.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/system/JavaProcessMonitor.java @@ -69,7 +69,7 @@ public class JavaProcessMonitor { void processThreadStopped(ProcessThread t, boolean forceTermintate) { al.remove(t); - al.removeAll(CollectionUtils.sortOut(al, t1 -> !t1.isAlive())); + al.removeAll(CollectionUtils.map(al, t1 -> !t1.isAlive())); if (al.isEmpty() || forceTermintate) { for (Thread a : al) a.interrupt(); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.form b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.form index 99e2a6305..6a903e52d 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.form +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.form @@ -4,7 +4,7 @@ - + @@ -83,7 +83,7 @@ - + @@ -93,7 +93,7 @@ - + @@ -103,7 +103,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -146,7 +146,7 @@ - + diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java index 0e4d4b437..1d2191ab1 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/LogWindow.java @@ -16,7 +16,6 @@ */ package org.jackhuang.hellominecraft.views; -import java.awt.Color; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; @@ -80,28 +79,28 @@ public class LogWindow extends javax.swing.JFrame { txtLog = new javax.swing.JTextPane(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setTitle(C.I18N.getString("logwindow.title")); // NOI18N + setTitle(C.i18n("logwindow.title")); // NOI18N addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosed(java.awt.event.WindowEvent evt) { formWindowClosed(evt); } }); - btnClear.setText(C.I18N.getString("ui.button.clear")); // NOI18N + btnClear.setText(C.i18n("ui.button.clear")); // NOI18N btnClear.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnClearActionPerformed(evt); } }); - btnClose.setText(C.I18N.getString("ui.button.close")); // NOI18N + btnClose.setText(C.i18n("ui.button.close")); // NOI18N btnClose.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCloseActionPerformed(evt); } }); - btnCopy.setText(C.I18N.getString("ui.button.copy")); // NOI18N + btnCopy.setText(C.i18n("ui.button.copy")); // NOI18N btnCopy.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnCopyActionPerformed(evt); @@ -117,7 +116,7 @@ public class LogWindow extends javax.swing.JFrame { } }); - btnTieBa.setText(C.I18N.getString("logwindow.tieba")); // NOI18N + btnTieBa.setText(C.i18n("logwindow.tieba")); // NOI18N btnTieBa.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnTieBaActionPerformed(evt); @@ -131,7 +130,7 @@ public class LogWindow extends javax.swing.JFrame { } }); - btnTerminateGame.setText(C.I18N.getString("logwindow.terminate_game")); // NOI18N + btnTerminateGame.setText(C.i18n("logwindow.terminate_game")); // NOI18N btnTerminateGame.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnTerminateGameActionPerformed(evt); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/Selector.form b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/Selector.form index a43542b6e..fb4adb695 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/Selector.form +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/Selector.form @@ -40,7 +40,7 @@ - + @@ -54,7 +54,7 @@ - + @@ -77,14 +77,14 @@ - + - + diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/Selector.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/Selector.java index 9a87d7a34..68ac63219 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/Selector.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/views/Selector.java @@ -49,6 +49,11 @@ public class Selector extends javax.swing.JDialog { for (String s : selList) jComboBox1.addItem(s); } + + public int getChoice() { + setVisible(true); + return sel; + } /** * This method is called from within the constructor to initialize the form. @@ -61,7 +66,7 @@ public class Selector extends javax.swing.JDialog { jLabel1 = new javax.swing.JLabel(); jComboBox1 = new javax.swing.JComboBox(); - jButton1 = new javax.swing.JButton(); + btnOK = new javax.swing.JButton(); btnCancel = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); @@ -69,10 +74,10 @@ public class Selector extends javax.swing.JDialog { java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/jackhuang/hellominecraft/launcher/I18N"); // NOI18N jLabel1.setText(bundle.getString("selector.choose")); // NOI18N - jButton1.setText(bundle.getString("button.ok")); // NOI18N - jButton1.addActionListener(new java.awt.event.ActionListener() { + btnOK.setText(bundle.getString("button.ok")); // NOI18N + btnOK.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton1ActionPerformed(evt); + btnOKActionPerformed(evt); } }); @@ -100,7 +105,7 @@ public class Selector extends javax.swing.JDialog { .addContainerGap(212, Short.MAX_VALUE) .addComponent(btnCancel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jButton1) + .addComponent(btnOK) .addContainerGap()) ); layout.setVerticalGroup( @@ -112,7 +117,7 @@ public class Selector extends javax.swing.JDialog { .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jButton1) + .addComponent(btnOK) .addComponent(btnCancel)) .addContainerGap()) ); @@ -125,14 +130,14 @@ public class Selector extends javax.swing.JDialog { this.dispose(); }//GEN-LAST:event_btnCancelActionPerformed - private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOKActionPerformed sel = jComboBox1.getSelectedIndex(); this.dispose(); - }//GEN-LAST:event_jButton1ActionPerformed + }//GEN-LAST:event_btnOKActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnCancel; - private javax.swing.JButton jButton1; + private javax.swing.JButton btnOK; private javax.swing.JComboBox jComboBox1; private javax.swing.JLabel jLabel1; // End of variables declaration//GEN-END:variables diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/cbplugins/PluginManager.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/cbplugins/PluginManager.java index 4b9afb6ff..68e6477be 100644 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/cbplugins/PluginManager.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/cbplugins/PluginManager.java @@ -48,7 +48,7 @@ public class PluginManager { } public static List getPlugins() throws Exception { - String result = NetUtils.doGet("http://api.bukget.org/3//plugins?fields=slug,plugin_name,description,versions.version,versions.game_versions"); + String result = NetUtils.get("http://api.bukget.org/3//plugins?fields=slug,plugin_name,description,versions.version,versions.game_versions"); Gson gson = new Gson(); List list = gson.fromJson(result, new TypeToken>() { }.getType()); @@ -61,7 +61,7 @@ public class PluginManager { CATEGORY_GENERAL = "General", CATEGORY_ANTI_GRIEFING_TOOLS = "Anti Griefing Tools", CATEGORY_MECHAICS = "Mechanics", - CATEGORY_Fixes = "Fixes", + CATEGORY_FIXES = "Fixes", CATEGORY_ROLE_PLAYING = "Role Playing", CATEGORY_WORLD_EDITING_AND_MANAGEMENT = "World Editing and Management", CATEGORY_TELEPORTATION = "Teleportation", @@ -73,7 +73,7 @@ public class PluginManager { CATEGORY_WEBSITE_ADMINISTRATION = "Website Administration"; public static List getPluginsByCategory(String category) throws Exception { - String result = NetUtils.doGet("http://api.bukget.org/3//categories/" + category + "?fields=slug,plugin_name,description,versions.version,versions.game_versions"); + String result = NetUtils.get("http://api.bukget.org/3//categories/" + category + "?fields=slug,plugin_name,description,versions.version,versions.game_versions"); Gson gson = new Gson(); List list = gson.fromJson(result, new TypeToken>() { }.getType()); @@ -81,7 +81,7 @@ public class PluginManager { } public static List getCategories() throws Exception { - String result = NetUtils.doGet("http://api.bukget.org/3//categories/"); + String result = NetUtils.get("http://api.bukget.org/3//categories/"); Gson gson = new Gson(); List list = gson.fromJson(result, new TypeToken>() { }.getType()); @@ -90,7 +90,7 @@ public class PluginManager { public static PluginInfo getPluginInfo(String slug) throws Exception { if (StrUtils.isNotBlank(slug)) { - String result = NetUtils.doGet("http://api.bukget.org/3//plugins/bukkit/" + slug.toLowerCase()); + String result = NetUtils.get("http://api.bukget.org/3//plugins/bukkit/" + slug.toLowerCase()); if (StrUtils.isNotBlank(result)) if (!result.equals("null")) { PluginInfo info = new Gson().fromJson(result, PluginInfo.class); diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/utils/IPGet.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/utils/IPGet.java index aa97a5c92..7e7c0f6c2 100644 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/utils/IPGet.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/utils/IPGet.java @@ -40,7 +40,7 @@ public class IPGet extends Thread { Elements iframe = d.getElementsByTag("iframe"); if (iframe.size() > 0) { String url = iframe.get(0).attr("src"); - String s = NetUtils.doGet(url, "GBK"); + String s = NetUtils.get(url, "GBK"); Pattern p = Pattern.compile("\\[(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])){3}\\]"); Matcher m = p.matcher(s); s = "";