package com.earth2me.essentials; import com.google.common.base.Function; import com.google.common.collect.MapMaker; import java.io.File; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentMap; import org.bukkit.entity.Player; public class UserMap implements Function, IConf { private final transient IEssentials ess; private final transient ConcurrentMap users = new MapMaker().softValues().makeComputingMap(this); public UserMap(final IEssentials ess) { this.ess = ess; loadAllUsersAsync(ess); } private void loadAllUsersAsync(final IEssentials ess) { ess.scheduleAsyncDelayedTask(new Runnable() { @Override public void run() { final File userdir = new File(ess.getDataFolder(), "userdata"); if (!userdir.exists()) { return; } for (String string : userdir.list()) { if (!string.endsWith(".yml")) { continue; } final String name = string.substring(0, string.length() - 4); try { users.get(name.toLowerCase()); } catch (NullPointerException ex) { // Ignore these } } } }); } public boolean userExists(final String name) { return users.containsKey(name.toLowerCase()); } public User getUser(final String name) throws NullPointerException { return users.get(name.toLowerCase()); } @Override public User apply(final String name) { for (Player player : ess.getServer().getOnlinePlayers()) { if (player.getName().equalsIgnoreCase(name)) { return new User(player, ess); } } final File userFolder = new File(ess.getDataFolder(), "userdata"); final File userFile = new File(userFolder, Util.sanitizeFileName(name) + ".yml"); if (userFile.exists()) { return new User(new OfflinePlayer(name, ess), ess); } return null; } @Override public void reloadConfig() { for (User user : users.values()) { user.reloadConfig(); } } public void removeUser(final String name) { users.remove(name.toLowerCase()); } public Set getAllUsers() { final Set userSet = new HashSet(); for (String name : users.keySet()) { userSet.add(users.get(name)); } return userSet; } public int getUniqueUsers() { return users.size(); } }