Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
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}