Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
at develop 128 lines 4.6 kB view raw
1package com.legacyminecraft.poseidon.util; 2 3import com.legacyminecraft.poseidon.PoseidonConfig; 4import org.json.simple.JSONObject; 5import org.json.simple.parser.JSONParser; 6import org.json.simple.parser.ParseException; 7 8import java.io.*; 9import java.net.URL; 10import java.net.URLEncoder; 11import java.nio.charset.Charset; 12import java.util.UUID; 13import java.util.regex.Pattern; 14 15import static com.projectposeidon.johnymuffin.UUIDManager.generateOfflineUUID; 16 17public class GetUUIDFetcher { 18 19 public static class UUIDAndUsernameResult { 20 private UUIDResult uuidResult; 21 private String returnedUsername; 22 23 public UUIDAndUsernameResult(UUIDResult uuidResult, String returnedUsername) { 24 this.uuidResult = uuidResult; 25 this.returnedUsername = returnedUsername; 26 } 27 28 public UUIDResult getUuidResult() { 29 return uuidResult; 30 } 31 32 public String getReturnedUsername() { 33 return returnedUsername; 34 } 35 } 36 37 38 public static UUIDAndUsernameResult getUUID(String username) { 39 try { 40 String url = PoseidonConfig.getInstance().getString("settings.uuid-fetcher.get.value", "https://api.minecraftservices.com/minecraft/profile/lookup/name/{username}"); 41 url = url.replace("{username}", encode(username)); 42 43 JSONObject jsonObject = readJsonFromUrl(url); 44 UUIDResult uuidResult; 45 String returnedUsername = null; 46 47 if (!jsonObject.containsKey("id")) { 48 uuidResult = new UUIDResult(generateOfflineUUID(username), UUIDResult.ReturnType.OFFLINE); 49 } else { 50 UUID uuid = toUUIDWithDashes(String.valueOf(jsonObject.get("id"))); 51 if (uuid == null) { 52 uuidResult = new UUIDResult(null, UUIDResult.ReturnType.API_OFFLINE); 53 } else { 54 returnedUsername = String.valueOf(jsonObject.get("name")); 55 uuidResult = new UUIDResult(uuid, UUIDResult.ReturnType.ONLINE); 56 } 57 } 58 59 return new UUIDAndUsernameResult(uuidResult, returnedUsername); 60 61 } catch (Exception exception) { 62 UUIDResult uuidResult = null; 63 if (exception == null || exception instanceof FileNotFoundException || exception.getMessage() == null) { 64 // This is a hacky solution to tell if the API is offline, or the user is cracked. 65 uuidResult = new UUIDResult(generateOfflineUUID(username), UUIDResult.ReturnType.OFFLINE); 66 } else { 67 uuidResult = new UUIDResult(null, UUIDResult.ReturnType.API_OFFLINE); 68 uuidResult.setException(exception); 69 } 70 return new UUIDAndUsernameResult(uuidResult, null); 71 } 72 } 73 74 75 public static String encode(String string) { 76 try { 77 return URLEncoder.encode(string, "UTF-8"); 78 } catch (UnsupportedEncodingException e) { 79 return string; 80 } 81 } 82 83 public static UUID toUUIDWithDashes(String uuid) { 84 return UUID.fromString(uuid.replaceFirst("(\\p{XDigit}{8})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}+)", "$1-$2-$3-$4-$5")); 85 } 86 87 public static boolean verifyJSONArguments(JSONObject jsonObject, String... arguments) { 88 for (String s : arguments) { 89 if (!jsonObject.containsKey(s)) return false; 90 } 91 return true; 92 } 93 94 public static boolean isURL(String url) { 95 try { 96 new URL(url); 97 return true; 98 } catch (Exception e) { 99 return false; 100 } 101 } 102 103 public static boolean validUUID(String uuid) { 104 return Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$").matcher(uuid).matches(); 105 } 106 107 private static String readAll(Reader rd) throws IOException { 108 StringBuilder sb = new StringBuilder(); 109 int cp; 110 while ((cp = rd.read()) != -1) { 111 sb.append((char) cp); 112 } 113 return sb.toString(); 114 } 115 116 private static JSONObject readJsonFromUrl(String url) throws IOException, ParseException { 117 InputStream is = new URL(url).openStream(); 118 try { 119 BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 120 String jsonText = readAll(rd); 121 JSONParser jsp = new JSONParser(); 122 JSONObject json = (JSONObject) jsp.parse(jsonText); 123 return json; 124 } finally { 125 is.close(); 126 } 127 } 128}