Last active
October 6, 2017 12:14
-
-
Save Jofkos/efaaff2afb645898adc3 to your computer and use it in GitHub Desktop.
UUIDFetcher (Java 7)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.BufferedReader; | |
import java.io.InputStreamReader; | |
import java.net.HttpURLConnection; | |
import java.net.URL; | |
import java.util.HashMap; | |
import java.util.Map; | |
import java.util.UUID; | |
import java.util.concurrent.ExecutorService; | |
import java.util.concurrent.Executors; | |
import org.bukkit.craftbukkit.libs.com.google.gson.Gson; | |
import org.bukkit.craftbukkit.libs.com.google.gson.GsonBuilder; | |
import com.mojang.util.UUIDTypeAdapter; | |
public class UUIDFetcher { | |
/** | |
* Date when name changes were introduced | |
* @see UUIDFetcher#getUUIDAt(String, long) | |
*/ | |
public static final long FEBRUARY_2015 = 1422748800000L; | |
private static Gson gson = new GsonBuilder().registerTypeAdapter(UUID.class, new UUIDTypeAdapter()).create(); | |
private static final String UUID_URL = "https://api.mojang.com/users/profiles/minecraft/%s?at=%d"; | |
private static final String NAME_URL = "https://api.mojang.com/user/profiles/%s/names"; | |
private static Map<String, UUID> uuidCache = new HashMap<String, UUID>(); | |
private static Map<UUID, String> nameCache = new HashMap<UUID, String>(); | |
private static ExecutorService pool = Executors.newCachedThreadPool(); | |
private String name; | |
private UUID id; | |
/** | |
* Fetches the uuid asynchronously and passes it to the consumer | |
* | |
* @param name The name | |
* @param action Do what you want to do with the uuid her | |
*/ | |
public static void getUUID(final String name, Consumer<UUID> action) { | |
pool.execute(new Acceptor<UUID>(action) { | |
@Override | |
public UUID getValue() { | |
return getUUID(name); | |
} | |
}); | |
} | |
/** | |
* Fetches the uuid synchronously and returns it | |
* | |
* @param name The name | |
* @return The uuid | |
*/ | |
public static UUID getUUID(String name) { | |
return getUUIDAt(name, System.currentTimeMillis()); | |
} | |
/** | |
* Fetches the uuid synchronously for a specified name and time and passes the result to the consumer | |
* | |
* @param name The name | |
* @param timestamp Time when the player had this name in milliseconds | |
* @param action Do what you want to do with the uuid her | |
*/ | |
public static void getUUIDAt(final String name, final long timestamp, Consumer<UUID> action) { | |
pool.execute(new Acceptor<UUID>(action) { | |
@Override | |
public UUID getValue() { | |
return getUUIDAt(name, timestamp); | |
} | |
}); | |
} | |
/** | |
* Fetches the uuid synchronously for a specified name and time | |
* | |
* @param name The name | |
* @param timestamp Time when the player had this name in milliseconds | |
* @see UUIDFetcher#FEBRUARY_2015 | |
*/ | |
public static UUID getUUIDAt(String name, long timestamp) { | |
name = name.toLowerCase(); | |
if (uuidCache.containsKey(name)) { | |
return uuidCache.get(name); | |
} | |
try { | |
HttpURLConnection connection = (HttpURLConnection) new URL(String.format(UUID_URL, name, timestamp/1000)).openConnection(); | |
connection.setReadTimeout(5000); | |
UUIDFetcher data = gson.fromJson(new BufferedReader(new InputStreamReader(connection.getInputStream())), UUIDFetcher.class); | |
uuidCache.put(name, data.id); | |
nameCache.put(data.id, data.name); | |
return data.id; | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
return null; | |
} | |
/** | |
* Fetches the name asynchronously and passes it to the consumer | |
* | |
* @param uuid The uuid | |
* @param action Do what you want to do with the name her | |
*/ | |
public static void getName(final UUID uuid, Consumer<String> action) { | |
pool.execute(new Acceptor<String>(action) { | |
@Override | |
public String getValue() { | |
return getName(uuid); | |
} | |
}); | |
} | |
/** | |
* Fetches the name synchronously and returns it | |
* | |
* @param uuid The uuid | |
* @return The name | |
*/ | |
public static String getName(UUID uuid) { | |
if (nameCache.containsKey(uuid)) { | |
return nameCache.get(uuid); | |
} | |
try { | |
HttpURLConnection connection = (HttpURLConnection) new URL(String.format(NAME_URL, UUIDTypeAdapter.fromUUID(uuid))).openConnection(); | |
connection.setReadTimeout(5000); | |
UUIDFetcher[] nameHistory = gson.fromJson(new BufferedReader(new InputStreamReader(connection.getInputStream())), UUIDFetcher[].class); | |
UUIDFetcher currentNameData = nameHistory[nameHistory.length - 1]; | |
uuidCache.put(currentNameData.name.toLowerCase(), uuid); | |
nameCache.put(uuid, currentNameData.name); | |
return currentNameData.name; | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
return null; | |
} | |
public static interface Consumer<T> { | |
void accept(T t); | |
} | |
public static abstract class Acceptor<T> implements Runnable { | |
private Consumer<T> consumer; | |
public Acceptor(Consumer<T> consumer) { | |
this.consumer = consumer; | |
} | |
public abstract T getValue(); | |
@Override | |
public void run() { | |
consumer.accept(getValue()); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment