blob: b931efc9426ce071f99bbbc53838403c9a2ce250 [file] [log] [blame] [raw]
package net.glowstone.util.bans;
import net.glowstone.entity.meta.profile.GlowPlayerProfile;
import net.glowstone.entity.meta.profile.ProfileCache;
import net.glowstone.util.UuidUtils;
import org.bukkit.OfflinePlayer;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;
/**
* Common management for whitelist and ops list files.
*/
public final class UuidListFile extends JsonListFile {
private Map<UUID, Entry> entriesByUuid = new ConcurrentHashMap<>();
@Override
public void load() {
super.load();
for (BaseEntry entry : entries) {
entriesByUuid.put(((Entry) entry).uuid, (Entry) entry);
}
}
public UuidListFile(File file) {
super(file);
}
/**
* Returns a {@link GlowPlayerProfile} for each player whose UUID is in the list file.
*
* @return a list of {@link GlowPlayerProfile} instances
*/
public List<GlowPlayerProfile> getProfiles() {
return entries
.stream()
.parallel()
.map(entry -> {
try {
return ProfileCache.getProfile(((Entry) entry).uuid).get();
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList());
}
/**
* Searches for a UUID.
*
* @param uuid the UUID to search for
* @return true if the UUID is present; false otherwise
*/
public boolean containsUuid(UUID uuid) {
return entriesByUuid.containsKey(uuid);
}
/**
* Checks whether the player with a given UUID is in this list.
*
* @param profile the player whose UUID will be looked up
* @return whether the player is on this list
*/
public boolean containsProfile(GlowPlayerProfile profile) {
return containsUuid(profile.getId());
}
/**
* If the given player is not already on this list, adds that player and saves the change to
* disk.
*
* @param player the player to add
*/
public void add(OfflinePlayer player) {
UUID playerUuid = player.getUniqueId();
if (!containsUuid(playerUuid)) {
Entry newEntry = new Entry(playerUuid, player.getName());
entries.add(newEntry);
entriesByUuid.put(playerUuid, newEntry);
save();
}
}
/**
* If the given player is on this list, removes that player and saves the change to disk.
*
* @param profile the player to remove
*/
public void remove(GlowPlayerProfile profile) {
UUID playerUuid = profile.getId();
entriesByUuid.remove(playerUuid);
// FIXME: Unnecessary linear time
Iterator<BaseEntry> iter = entries.iterator();
boolean modified = false;
while (iter.hasNext()) {
if (((Entry) iter.next()).uuid.equals(playerUuid)) {
iter.remove();
modified = true;
}
}
if (modified) {
save();
}
}
@Override
protected BaseEntry readEntry(Map<String, String> map) {
return new Entry(UuidUtils.fromString(map.get("uuid")), map.get("name"));
}
private static class Entry implements BaseEntry {
private final UUID uuid;
private final String fallbackName;
private Entry(UUID uuid, String fallbackName) {
this.uuid = uuid;
this.fallbackName = fallbackName;
}
@Override
public Map<String, String> write() {
GlowPlayerProfile profile = ProfileCache.getProfile(uuid).join();
String name = profile.getName() != null ? profile.getName() : fallbackName;
Map<String, String> result = new HashMap<>(2);
result.put("uuid", UuidUtils.toString(uuid));
result.put("name", name);
return result;
}
}
}