package tv.mineinthebox.essentials.managers; import java.io.File; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.UUID; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import tv.mineinthebox.essentials.xEssentials; import tv.mineinthebox.essentials.instances.xEssentialsOfflinePlayer; import tv.mineinthebox.essentials.instances.xEssentialsPlayer; import tv.mineinthebox.essentials.interfaces.XOfflinePlayer; import tv.mineinthebox.essentials.interfaces.XPlayer; public class xEssentialsPlayerManager { private final HashMap<String, XPlayer> players = new HashMap<String, XPlayer>(); private final xEssentials pl; public xEssentialsPlayerManager(xEssentials pl) { this.pl = pl; } /** * @author xize * @param name - returns the player. * @return xEssentialsPlayer * @throws NullPointerException when the player is not found. */ public XPlayer getPlayerExact(String name) { if(players.containsKey(name.toLowerCase())) { return players.get(name.toLowerCase()); } throw new NullPointerException("xEssentialsPlayer: " + name + " is not online!"); } /** * @author xize * @param name - returns the player. * @return xEssentialsPlayer * @throws NullPointerException when the player is not found. */ public XPlayer getPlayer(String name) { for(String a : players.keySet()) { if(a.startsWith(name.toLowerCase())) { return players.get(a.toLowerCase()); } } throw new NullPointerException("xEssentialsPlayer: " + name + " is not online!"); } /** * returns the offline player from uuid * * @author xize * @param id - the uuid * @return XOfflinePlayer */ public XOfflinePlayer getOfflinePlayer(UUID id) { File f = new File(pl.getDataFolder() + File.separator + "players" + File.separator + id.toString().replace("-", "") + ".yml"); if(f.exists()) { FileConfiguration con = YamlConfiguration.loadConfiguration(f); String user = con.getString("user"); return getOfflinePlayer(user); } return null; } /** * @author xize * @param adds the player into our list. * @param name - the players name * @param xp - the xEssentialsPlayer instance. */ public void addPlayer(String name, XPlayer xp) { players.put(name.toLowerCase(), xp); } /** * @author xize * @param removes the player * @param player - the players name */ public void removePlayer(String player) { if(players.containsKey(player.toLowerCase())) { players.remove(player.toLowerCase()); } } /** * @author xize * @param gets all the xEssentialsPlayers in a array * @return xEssentialsPlayer[] */ public XPlayer[] getPlayers() { XPlayer[] users = new XPlayer[players.size()]; int i = 0; for(XPlayer xp : players.values()) { users[i] = xp; i++; } return users; } /** * @author xize * @param get all the offline players in a array * @return xEssentialsOfflinePlayer[] */ public XOfflinePlayer[] getOfflinePlayers() { File dir = new File(pl.getDataFolder() + File.separator + "players"); File[] list = dir.listFiles(); Arrays.sort(list, new Comparator<File>() { @Override public int compare(File o1, File o2) { if(o1.lastModified() > o2.lastModified()) { return -1; } else if(o1.lastModified() < o2.lastModified()) { return +1; } else { return 0; } } }); int playerSize = (list.length < pl.getConfiguration().getPlayerConfig().getOfflineCache() ? list.length : pl.getConfiguration().getPlayerConfig().getOfflineCache()); int index = 0; XOfflinePlayer[] offliners = new XOfflinePlayer[playerSize]; for(int i = 0; i < list.length; i++) { if(index != playerSize) { File f = list[i]; FileConfiguration con = YamlConfiguration.loadConfiguration(f); if(con.contains("user")) { String user = con.getString("user"); if(!players.containsKey(user)) { offliners[index] = getOfflinePlayer(user); index++; } } } else { break; } } return offliners; } /** * @author xize * @param player - the name of the player * @return xEssentialsOfflinePlayer */ public XOfflinePlayer getOfflinePlayer(String player) { try { if(isOnline(player)) { return getPlayer(player); } else { File dir = new File(pl.getDataFolder() + File.separator + "players"); if(dir.isDirectory()) { File[] list = dir.listFiles(); for(File f : list) { FileConfiguration con = YamlConfiguration.loadConfiguration(f); if(con.contains("user")) { if(con.getString("user").equalsIgnoreCase(player)) { if(players.containsKey(con.getString("user"))) { return players.get(con.getString("user")); } else { xEssentialsOfflinePlayer off = new xEssentialsOfflinePlayer(con.getString("user"), pl); return off; } } } } } } } catch(Exception e) { e.printStackTrace(); } return null; } /** * @author xize * @param player - returns the file of the desired name * @return File * @throws NullPointerException when the file is null */ public File getOfflinePlayerFile(String player) { try { File dir = new File(pl.getDataFolder() + File.separator + "players"); if(dir.isDirectory()) { File[] list = dir.listFiles(); for(File f : list) { FileConfiguration con = YamlConfiguration.loadConfiguration(f); if(con.isSet("user")) { if(con.getString("user").equalsIgnoreCase(player)) { return f; } } } } } catch(Exception e) { e.printStackTrace(); } return null; } /** * @author xize * @param name - the name of the possible player * @return boolean */ public boolean isEssentialsPlayer(String name) { XOfflinePlayer off = getOfflinePlayer(name); if(off instanceof XOfflinePlayer) { return true; } return false; } /** * @author xize * @param returns true if the player is online. * @param player - the name * @return Boolean */ public boolean isOnline(String player) { return players.containsKey(player.toLowerCase()); } /** * @author xize * @param clears the player list. */ public void clear() { players.clear(); } /** * @author xize * @param reloads all user input for onEnable * @return void */ public void reloadPlayerBase() { for(XPlayer xp : pl.getManagers().getPlayerManager().getPlayers()) { xp.save(); } players.clear(); for(Player p : pl.getOnlinePlayers()) { XPlayer xp = new xEssentialsPlayer(p, pl.getManagers().getPlayerManager().getOfflinePlayer(p.getName()).getUniqueId().toString().replaceAll("-", ""), pl); players.put(p.getName().toLowerCase(), xp); } } }