diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/EntityCollection.java b/src/main/java/com/massivecraft/factions/zcore/persist/EntityCollection.java index 6c19bcad..46ff0023 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/EntityCollection.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/EntityCollection.java @@ -1,15 +1,15 @@ package com.massivecraft.factions.zcore.persist; +import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.zcore.util.DiscUtil; import com.massivecraft.factions.zcore.util.TextUtil; +import com.massivecraft.factions.zcore.util.UUIDFetcher; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.libs.com.google.gson.Gson; import java.io.File; import java.lang.reflect.Type; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; import java.util.logging.Level; @@ -221,6 +221,34 @@ public abstract class EntityCollection { } Type type = this.getMapType(); + if (type.toString().contains("FPlayer")) { + Map data = this.gson.fromJson(content, type); + // Convert any leftover player names in this file + ArrayList list = new ArrayList(); + for (String value : data.keySet()) { + if (value.matches("[a-z0-9_]{2,16}")) { + list.add(value); + } + } + if (list.size() > 0) { + UUIDFetcher fetcher = new UUIDFetcher(list); + try { + Map response = fetcher.call(); + for (String value : response.keySet()) { + String id = response.get(value).toString(); + + FPlayer player = data.get(value); + data.remove(value); // Out with the old... + data.put(response.get(value).toString(), player); // And in with the new + player.setId(id); // Update the object so it knows + } + } catch (Exception e) { + e.printStackTrace(); + } + Bukkit.getLogger().log(Level.INFO, "Converted " + list.size() + " old player names to UUID"); + } + return (Map) data; + } try { return this.gson.fromJson(content, type); } catch (Exception ex) { diff --git a/src/main/java/com/massivecraft/factions/zcore/util/UUIDFetcher.java b/src/main/java/com/massivecraft/factions/zcore/util/UUIDFetcher.java new file mode 100644 index 00000000..79fae04b --- /dev/null +++ b/src/main/java/com/massivecraft/factions/zcore/util/UUIDFetcher.java @@ -0,0 +1,85 @@ +package com.massivecraft.factions.zcore.util; + +import com.google.common.collect.ImmutableList; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; +import org.json.simple.parser.JSONParser; + +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.Callable; + +/** + * @author evilmidget38 + */ + +public class UUIDFetcher implements Callable> { + private static final int MAX_SEARCH = 100; + private static final String PROFILE_URL = "https://api.mojang.com/profiles/page/"; + private static final String AGENT = "minecraft"; + private final JSONParser jsonParser = new JSONParser(); + private final List names; + public UUIDFetcher(List names) { + this.names = ImmutableList.copyOf(names); + } + + public Map call() throws Exception { + Map uuidMap = new HashMap(); + String body = buildBody(names); + for (int i = 1; i < MAX_SEARCH; i++) { + HttpURLConnection connection = createConnection(i); + writeBody(connection, body); + JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(connection.getInputStream())); + JSONArray array = (JSONArray) jsonObject.get("profiles"); + Number count = (Number) jsonObject.get("size"); + if (count.intValue() == 0) { + break; + } + for (Object profile : array) { + JSONObject jsonProfile = (JSONObject) profile; + String id = (String) jsonProfile.get("id"); + String name = (String) jsonProfile.get("name"); + UUID uuid = UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id.substring(16, 20) + "-" +id.substring(20, 32)); + uuidMap.put(name, uuid); + } + } + return uuidMap; + } + + private static void writeBody(HttpURLConnection connection, String body) throws Exception { + DataOutputStream writer = new DataOutputStream(connection.getOutputStream()); + writer.write(body.getBytes()); + writer.flush(); + writer.close(); + } + + private static HttpURLConnection createConnection(int page) throws Exception { + URL url = new URL(PROFILE_URL+page); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setUseCaches(false); + connection.setDoInput(true); + connection.setDoOutput(true); + return connection; + } + @SuppressWarnings("unchecked") + private static String buildBody(List names) { + List lookups = new ArrayList(); + for (String name : names) { + JSONObject obj = new JSONObject(); + obj.put("name", name); + obj.put("agent", AGENT); + lookups.add(obj); + } + return JSONValue.toJSONString(lookups); + } +} \ No newline at end of file