From ee400b75253f0b4642e02183bdfca78565b53d4a Mon Sep 17 00:00:00 2001 From: asofold Date: Tue, 26 Feb 2013 00:39:48 +0100 Subject: [PATCH] Keep track of online players for performance reasons. Due to Server.getPlayerExact iterating over all online players, DataManager will now keep track of online players and allow lookup by exact name and lower-case name. --- .../neatmonster/nocheatplus/NoCheatPlus.java | 7 +- .../checks/moving/MovingListener.java | 5 +- .../command/actions/BanCommand.java | 3 +- .../command/actions/KickCommand.java | 4 +- .../command/actions/TellCommand.java | 4 +- .../command/actions/TempKickCommand.java | 4 +- .../command/admin/ExemptCommand.java | 4 +- .../command/admin/ExemptionsCommand.java | 4 +- .../command/admin/InfoCommand.java | 4 +- .../command/admin/RemovePlayerCommand.java | 3 +- .../command/admin/UnexemptCommand.java | 4 +- .../nocheatplus/players/DataManager.java | 64 ++++++++++++++++++- .../nocheatplus/utilities/TickTask.java | 2 +- 13 files changed, 86 insertions(+), 26 deletions(-) diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java index e69f4ccd..cd9bdf9d 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java @@ -14,7 +14,6 @@ import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Server; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -207,9 +206,8 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI { final Set names = nameSetPerms.getPlayers(Permissions.ADMINISTRATION_NOTIFY); if (names == null) return 0; int done = 0; - final Server server = Bukkit.getServer(); for (final String name : names){ - final Player player = server.getPlayerExact(name); + final Player player = DataManager.getPlayerExact(name); if (player != null){ player.sendMessage(message); done ++; @@ -488,6 +486,9 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI { // Initialize BlockProperties initBlockProperties(config); + + // Initialize data manager. + dataMan.onEnable(); // Allow entries to TickTask (just in case). TickTask.setLocked(false); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java index 1352f1d9..36fa20f5 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java @@ -11,7 +11,6 @@ import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Server; import org.bukkit.entity.Entity; import org.bukkit.entity.Pig; import org.bukkit.entity.Player; @@ -57,6 +56,7 @@ import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; import fr.neatmonster.nocheatplus.logging.DebugUtil; import fr.neatmonster.nocheatplus.logging.LogUtil; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.utilities.BlockCache; import fr.neatmonster.nocheatplus.utilities.BlockProperties; import fr.neatmonster.nocheatplus.utilities.CheckUtils; @@ -1141,7 +1141,6 @@ public class MovingListener extends CheckListener implements TickListener, IRemo // Hover checks ! // TODO: Change to ordering such that smallest hover time comes first ? if (hoverTicks.isEmpty()) return; // Seldom or not ? - final Server server = Bukkit.getServer(); final MoveInfo info; if (parkedInfo.isEmpty()) info = new MoveInfo(mcAccess); else info = parkedInfo.remove(parkedInfo.size() - 1); @@ -1149,7 +1148,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo for (final String playerName : hoverTicks){ // TODO: put players into the set (+- one tick would not matter ?) // TODO: might add an online flag to data ! - final Player player = server.getPlayerExact(playerName); + final Player player = DataManager.getPlayerExact(playerName); if (player == null || !player.isOnline()){ rem.add(playerName); continue; diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/BanCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/BanCommand.java index b1feaea6..4abfca93 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/BanCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/BanCommand.java @@ -10,6 +10,7 @@ import fr.neatmonster.nocheatplus.NoCheatPlus; import fr.neatmonster.nocheatplus.command.DelayableCommand; import fr.neatmonster.nocheatplus.logging.LogUtil; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; public class BanCommand extends DelayableCommand { @@ -36,7 +37,7 @@ public class BanCommand extends DelayableCommand { } void ban(CommandSender sender, String name, String reason) { - Player player = Bukkit.getPlayerExact(name); + Player player = DataManager.getPlayer(name); if (player != null) player.kickPlayer(reason); OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(name); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/KickCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/KickCommand.java index c9ba8cb0..dd382c78 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/KickCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/KickCommand.java @@ -1,6 +1,5 @@ package fr.neatmonster.nocheatplus.command.actions; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -9,6 +8,7 @@ import fr.neatmonster.nocheatplus.NoCheatPlus; import fr.neatmonster.nocheatplus.command.DelayableCommand; import fr.neatmonster.nocheatplus.logging.LogUtil; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; public class KickCommand extends DelayableCommand { @@ -35,7 +35,7 @@ public class KickCommand extends DelayableCommand { } void kick(CommandSender sender, String name, String reason) { - Player player = Bukkit.getPlayerExact(name); + Player player = DataManager.getPlayer(name); if (player == null) return; player.kickPlayer(reason); LogUtil.logInfo("[NoCheatPlus] (" + sender.getName() + ") Kicked " + player.getName() + " : " + reason); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TellCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TellCommand.java index 0045fa11..338cf71d 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TellCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TellCommand.java @@ -1,6 +1,5 @@ package fr.neatmonster.nocheatplus.command.actions; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -8,6 +7,7 @@ import org.bukkit.entity.Player; import fr.neatmonster.nocheatplus.NoCheatPlus; import fr.neatmonster.nocheatplus.command.DelayableCommand; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.utilities.ColorUtil; /** @@ -37,7 +37,7 @@ public class TellCommand extends DelayableCommand { } private void tell(String name, String message) { - Player player = Bukkit.getServer().getPlayerExact(name); + Player player = DataManager.getPlayer(name); if (player != null) player.sendMessage(ColorUtil.replaceColors(message)); } diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TempKickCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TempKickCommand.java index 99d899cb..c88496c9 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TempKickCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TempKickCommand.java @@ -1,6 +1,5 @@ package fr.neatmonster.nocheatplus.command.actions; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -9,6 +8,7 @@ import fr.neatmonster.nocheatplus.NoCheatPlus; import fr.neatmonster.nocheatplus.command.DelayableCommand; import fr.neatmonster.nocheatplus.logging.LogUtil; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; public class TempKickCommand extends DelayableCommand { @@ -47,7 +47,7 @@ public class TempKickCommand extends DelayableCommand { protected void tempKick(CommandSender sender, String name, long duration, String reason){ - Player player = Bukkit.getPlayerExact(name); + Player player = DataManager.getPlayer(name); NoCheatPlus.denyLogin(name, duration); if (player == null) return; player.kickPlayer(reason); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptCommand.java index b001d70d..2df35a48 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptCommand.java @@ -3,7 +3,6 @@ package fr.neatmonster.nocheatplus.command.admin; import java.util.Arrays; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -14,6 +13,7 @@ import fr.neatmonster.nocheatplus.command.CommandUtil; import fr.neatmonster.nocheatplus.command.NCPCommand; import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.utilities.StringUtil; public class ExemptCommand extends NCPCommand { @@ -40,7 +40,7 @@ public class ExemptCommand extends NCPCommand { } else checkType = CheckType.ALL; - final Player player = Bukkit.getPlayerExact(playerName); + final Player player = DataManager.getPlayer(playerName); if (player == null){ sender.sendMessage(TAG + "Player not online: " + playerName); return true; diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptionsCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptionsCommand.java index 4c5331a5..76a30753 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptionsCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptionsCommand.java @@ -3,7 +3,6 @@ package fr.neatmonster.nocheatplus.command.admin; import java.util.LinkedList; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -13,6 +12,7 @@ import fr.neatmonster.nocheatplus.checks.CheckType; import fr.neatmonster.nocheatplus.command.NCPCommand; import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.utilities.StringUtil; public class ExemptionsCommand extends NCPCommand { @@ -26,7 +26,7 @@ public class ExemptionsCommand extends NCPCommand { String label, String[] args) { if (args.length != 2) return false; String playerName = args[1].trim(); - Player player = Bukkit.getPlayerExact(playerName); + Player player = DataManager.getPlayer(playerName); if (player != null) playerName = player.getName(); final List entries = new LinkedList(); for (CheckType type : CheckType.values()){ diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/InfoCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/InfoCommand.java index dfedcd83..0ac0f056 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/InfoCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/InfoCommand.java @@ -4,7 +4,6 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -15,6 +14,7 @@ import fr.neatmonster.nocheatplus.checks.ViolationHistory; import fr.neatmonster.nocheatplus.checks.ViolationHistory.ViolationLevel; import fr.neatmonster.nocheatplus.command.NCPCommand; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; public class InfoCommand extends NCPCommand { @@ -40,7 +40,7 @@ public class InfoCommand extends NCPCommand { * @return true, if successful */ private void handleInfoCommand(final CommandSender sender, String playerName) { - final Player player = Bukkit.getPlayerExact(playerName); + final Player player = DataManager.getPlayer(playerName); if (player != null) playerName = player.getName(); final ViolationHistory history = ViolationHistory.getHistory(playerName, false); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/RemovePlayerCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/RemovePlayerCommand.java index dc8c703e..c1cb8e83 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/RemovePlayerCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/RemovePlayerCommand.java @@ -3,7 +3,6 @@ package fr.neatmonster.nocheatplus.command.admin; import java.util.Arrays; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -48,7 +47,7 @@ public class RemovePlayerCommand extends NCPCommand { return true; } - final Player player = Bukkit.getPlayerExact(playerName); + final Player player = DataManager.getPlayer(playerName); if (player != null) playerName = player.getName(); ViolationHistory hist = ViolationHistory.getHistory(playerName, false); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/UnexemptCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/UnexemptCommand.java index edc05498..1d11c5c5 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/UnexemptCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/UnexemptCommand.java @@ -3,7 +3,6 @@ package fr.neatmonster.nocheatplus.command.admin; import java.util.Arrays; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -14,6 +13,7 @@ import fr.neatmonster.nocheatplus.command.CommandUtil; import fr.neatmonster.nocheatplus.command.NCPCommand; import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.utilities.StringUtil; public class UnexemptCommand extends NCPCommand { @@ -47,7 +47,7 @@ public class UnexemptCommand extends NCPCommand { return true; } // Find player. - final Player player = Bukkit.getPlayerExact(playerName); + final Player player = DataManager.getPlayer(playerName); if (player != null) playerName = player.getName(); NCPExemptionManager.unexempt(playerName, checkType); sender.sendMessage(TAG + "Player " + playerName + " will not be exempted from: " + checkType); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java index 0aaeb5a5..70957596 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -66,6 +67,14 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon */ private final Map lastLogout = new LinkedHashMap(50, 0.75f, true); + /** + * Keeping track of online players.
+ * Mappings: + *
  • exact player name -> Player instance
  • + *
  • lower case player name -> Player instance
  • + */ + protected final Map onlinePlayers = new LinkedHashMap(100); + /** * IRemoveData instances. * // TODO: might use a map for those later (extra or not). @@ -131,7 +140,8 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon public void onPlayerJoin(final PlayerJoinEvent event){ final Player player = event.getPlayer(); lastLogout.remove(player.getName()); - CombinedData.getData(player).lastJoinTime = System.currentTimeMillis(); + CombinedData.getData(player).lastJoinTime = System.currentTimeMillis(); + addOnlinePlayer(player); } @EventHandler(priority = EventPriority.MONITOR) @@ -152,8 +162,9 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon final long now = System.currentTimeMillis(); lastLogout.put(player.getName(), now); CombinedData.getData(player).lastLogoutTime = now; + removeOnlinePlayer(player); } - + @Override public void onReload() { // present. @@ -312,6 +323,23 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon MovingConfig.clear(); } + /** + * This gets an online player by exact player name or lower-case player name only [subject to change]. + * @param playerName + * @return + */ + public static Player getPlayerExact(final String playerName){ + return instance.onlinePlayers.get(playerName); + } + + /** + * This gets the online player with the exact name, but transforms the input to lower case. + * @param playerName + * @return + */ + public static Player getPlayer(final String playerName){ + return instance.onlinePlayers.get(playerName.toLowerCase()); + } @Override public boolean addComponent(Object obj) { @@ -336,6 +364,36 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon } } + /** + * Initializing with online players. + */ + public void onEnable(){ + final Player[] players = Bukkit.getOnlinePlayers(); + for (final Player player : players){ + addOnlinePlayer(player); + } + } + + /** + * Add mappings for player names variations. + * @param player + */ + private void addOnlinePlayer(final Player player){ + final String name = player.getName(); + onlinePlayers.put(name, player); + onlinePlayers.put(name.toLowerCase(), player); + } + + /** + * Remove mappings for player names variations. + * @param player + */ + private void removeOnlinePlayer(final Player player){ + final String name = player.getName(); + onlinePlayers.remove(name); + onlinePlayers.remove(name.toLowerCase()); + } + /** * Cleanup method, removes all data and config, but does not call ConfigManager.cleanup. */ @@ -348,10 +406,12 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon clearConfigs(); lastLogout.clear(); executionHistories.clear(); + onlinePlayers.clear(); } @Override public String getComponentName() { return "NoCheatPlus_DataManager"; } + } diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/utilities/TickTask.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/utilities/TickTask.java index 91b65381..9811d2d4 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/utilities/TickTask.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/utilities/TickTask.java @@ -127,7 +127,7 @@ public class TickTask implements Runnable { permissionUpdates.clear(); } for (final PermissionUpdateEntry entry : copyPermissions){ - final Player player = Bukkit.getPlayerExact(entry.playerName); + final Player player = DataManager.getPlayer(entry.playerName); // Might use exact name by contract. if (player == null || !player.isOnline()) continue; final String[] perms = entry.checkType.getConfigFactory().getConfig(player).getCachePermissions(); if (perms == null) continue;