diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java index cd9bdf9d..30a45340 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; @@ -14,6 +15,7 @@ import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -25,6 +27,7 @@ import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.permissions.Permissible; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; @@ -194,15 +197,28 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI { } /** - * Send all players with the nocheatplus.admin.notify permission a message. - * This is likely to be more efficient than iterating over all players and - * checking their permissions. However this only updates permissions with - * login and world changes currently. + * Send all players with the nocheatplus.admin.notify permission a message.
+ * This will act according to configuration (stored permissions or permission subscriptions). * * @param message * @return Number of players messaged. */ public static int sendAdminNotifyMessage(final String message){ + if (ConfigManager.getConfigFile().getBoolean(ConfPaths.LOGGING_USESUBSCRIPTIONS)){ + // TODO: Might respect console settings, or add extra config section (e.g. notifications). + return sendAdminNotifyMessageSubscriptions(message); + } + else{ + return sendAdminNotifyMessageStored(message); + } + } + + /** + * Send notification to players with stored notify-permission (world changes, login, permissions are not re-checked here). + * @param message + * @return + */ + public static int sendAdminNotifyMessageStored(final String message){ final Set names = nameSetPerms.getPlayers(Permissions.ADMINISTRATION_NOTIFY); if (names == null) return 0; int done = 0; @@ -215,6 +231,37 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI { } return done; } + + /** + * Send notification to all CommandSenders found in permission subscriptions for the notify-permission as well as players that have stored permissions (those get re-checked here). + * @param message + * @return + */ + public static int sendAdminNotifyMessageSubscriptions(final String message){ + final Set permissibles = Bukkit.getPluginManager().getPermissionSubscriptions(Permissions.ADMINISTRATION_NOTIFY); + final Set names = nameSetPerms.getPlayers(Permissions.ADMINISTRATION_NOTIFY); + final Set done = new HashSet(permissibles.size() + (names == null ? 0 : names.size())); + for (final Permissible permissible : permissibles){ + if (permissible instanceof CommandSender && permissible.hasPermission(Permissions.ADMINISTRATION_NOTIFY)){ + final CommandSender sender = (CommandSender) permissible; + sender.sendMessage(message); + done.add(sender.getName()); + } + } + // Fall-back checking for players. + if (names != null){ + for (final String name : names){ + if (!done.contains(name)){ + final Player player = DataManager.getPlayerExact(name); + if (player != null && player.hasPermission(Permissions.ADMINISTRATION_NOTIFY)){ + player.sendMessage(message); + done.add(name); + } + } + } + } + return done.size(); + } /** The event listeners. */ private final List listeners = new ArrayList(); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/ConfPaths.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/ConfPaths.java index 7cf833b3..c67727bb 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/ConfPaths.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/ConfPaths.java @@ -34,6 +34,7 @@ public abstract class ConfPaths { public static final String LOGGING_FILE = LOGGING + "file"; public static final String LOGGING_FILENAME = LOGGING + "filename"; public static final String LOGGING_INGAMECHAT = LOGGING + "ingamechat"; + public static final String LOGGING_USESUBSCRIPTIONS = LOGGING + "usesubscriptions"; /* * e e ,e, 888 888 @@ -51,10 +52,7 @@ public abstract class ConfPaths { public static final String MISCELLANEOUS_UPDATETIMEOUT = MISCELLANEOUS + "updatetimeout"; public static final String MISCELLANEOUS_REPORTTOMETRICS = MISCELLANEOUS + "reporttometrics"; public static final String MISCELLANEOUS_MANAGELISTENERS = MISCELLANEOUS + "managelisteners"; - private static final String MISCELLANEOUS_NOMOVEDTOOQUICKLY = MISCELLANEOUS + "nomovedtooquickly."; - public static final String MISCELLANEOUS_NOMOVEDTOOQUICKLY_ENABLED = MISCELLANEOUS_NOMOVEDTOOQUICKLY + "enabled"; - public static final String MISCELLANEOUS_NOMOVEDTOOQUICKLY_USEPROXY = MISCELLANEOUS_NOMOVEDTOOQUICKLY + "useproxy"; - + /** TEMP: hidden flag to disable all lag adaption with one flag. */ public static final String MISCELLANEOUS_LAG = MISCELLANEOUS + "lag"; diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java index 2f3d6dd8..3e4d05e2 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java @@ -55,6 +55,9 @@ public class DefaultConfig extends ConfigFile { set(ConfPaths.LOGGING_FILE, true); set(ConfPaths.LOGGING_FILENAME, "nocheatplus.log"); set(ConfPaths.LOGGING_INGAMECHAT, true); + + // Notifications settings. + set(ConfPaths.LOGGING_USESUBSCRIPTIONS, false); /* * e e ,e, 888 888