diff --git a/pom.xml b/pom.xml
index 8718454..b72c7f2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
eu.endermite
CommandWhitelist
- 1.6.0
+ 1.7.0
jar
CommandWhitelist
diff --git a/src/main/java/eu/endermite/commandwhitelist/spigot/CommandWhitelist.java b/src/main/java/eu/endermite/commandwhitelist/spigot/CommandWhitelist.java
index dd54f92..6e84897 100644
--- a/src/main/java/eu/endermite/commandwhitelist/spigot/CommandWhitelist.java
+++ b/src/main/java/eu/endermite/commandwhitelist/spigot/CommandWhitelist.java
@@ -2,15 +2,13 @@ package eu.endermite.commandwhitelist.spigot;
import eu.endermite.commandwhitelist.spigot.command.MainCommand;
import eu.endermite.commandwhitelist.spigot.config.ConfigCache;
-import eu.endermite.commandwhitelist.spigot.listeners.LegacyPlayerTabChatCompleteListener;
-import eu.endermite.commandwhitelist.spigot.listeners.PlayerCommandPreProcessListener;
-import eu.endermite.commandwhitelist.spigot.listeners.PlayerCommandSendListener;
-import eu.endermite.commandwhitelist.spigot.listeners.TabCompleteBlockerListener;
+import eu.endermite.commandwhitelist.spigot.listeners.*;
import eu.endermite.commandwhitelist.spigot.metrics.BukkitMetrics;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
+import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
public class CommandWhitelist extends JavaPlugin {
@@ -28,12 +26,20 @@ public class CommandWhitelist extends JavaPlugin {
reloadPluginConfig();
- getServer().getPluginManager().registerEvents(new PlayerCommandPreProcessListener(), this);
+ Plugin protocollib = getServer().getPluginManager().getPlugin("ProtocolLib");
+
+ getServer().getPluginManager().registerEvents(new PlayerCommandSendListener(), this);
if (!isLegacy) {
- getServer().getPluginManager().registerEvents(new PlayerCommandSendListener(), this);
+ if (!getConfigCache().isUseProtocolLib() || protocollib == null || !protocollib.isEnabled()) {
+ getServer().getPluginManager().registerEvents(new PlayerCommandPreProcessListener(), this);
+ } else {
+ PacketCommandSendListener.protocol(this);
+ getLogger().info(ChatColor.AQUA+"Using ProtocolLib for command filter!");
+ }
+
} else {
getLogger().info(ChatColor.AQUA+"Running in legacy mode...");
- if (getServer().getPluginManager().getPlugin("ProtocolLib") != null) {
+ if (protocollib != null) {
LegacyPlayerTabChatCompleteListener.protocol(this);
} else {
getLogger().info(ChatColor.YELLOW+"ProtocolLib is required for tab completion blocking!");
diff --git a/src/main/java/eu/endermite/commandwhitelist/spigot/config/ConfigCache.java b/src/main/java/eu/endermite/commandwhitelist/spigot/config/ConfigCache.java
index 6210f4c..adde974 100644
--- a/src/main/java/eu/endermite/commandwhitelist/spigot/config/ConfigCache.java
+++ b/src/main/java/eu/endermite/commandwhitelist/spigot/config/ConfigCache.java
@@ -17,6 +17,7 @@ public class ConfigCache {
private final String prefix, commandDenied, noPermission, noSubCommand, configReloaded, whitelistedCommand,
removedWhitelistedCommand, noSuchGroup, subCommandDenied;
private final List commandDeniedList;
+ private boolean useProtocolLib;
public ConfigCache(FileConfiguration config) {
@@ -33,6 +34,8 @@ public class ConfigCache {
removedWhitelistedCommand = config.getString("messages.removed-from-whitelist", "&eRemoved command &6%s &efrom permission &6%s");
noSuchGroup = config.getString("messages.group-doesnt-exist", "&cGroup %s doesn't exist");
+ useProtocolLib = config.getBoolean("use-protocollib-to-detect-commands", false);
+
Set perms = config.getConfigurationSection("commands").getKeys(false);
for (String s : perms) {
this.permList.put(s, config.getStringList("commands."+s));
@@ -99,4 +102,7 @@ public class ConfigCache {
public String getSubCommandDenied() {
return subCommandDenied;
}
+ public boolean isUseProtocolLib() {
+ return useProtocolLib;
+ }
}
\ No newline at end of file
diff --git a/src/main/java/eu/endermite/commandwhitelist/spigot/listeners/PacketCommandSendListener.java b/src/main/java/eu/endermite/commandwhitelist/spigot/listeners/PacketCommandSendListener.java
new file mode 100644
index 0000000..5cc03b3
--- /dev/null
+++ b/src/main/java/eu/endermite/commandwhitelist/spigot/listeners/PacketCommandSendListener.java
@@ -0,0 +1,68 @@
+package eu.endermite.commandwhitelist.spigot.listeners;
+
+import com.comphenix.protocol.PacketType;
+import com.comphenix.protocol.ProtocolLibrary;
+import com.comphenix.protocol.ProtocolManager;
+import com.comphenix.protocol.events.ListenerPriority;
+import com.comphenix.protocol.events.PacketAdapter;
+import com.comphenix.protocol.events.PacketContainer;
+import com.comphenix.protocol.events.PacketEvent;
+import eu.endermite.commandwhitelist.api.CommandsList;
+import eu.endermite.commandwhitelist.api.RandomStuff;
+import eu.endermite.commandwhitelist.spigot.CommandWhitelist;
+import eu.endermite.commandwhitelist.spigot.config.ConfigCache;
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.Plugin;
+import java.util.List;
+import java.util.Map;
+
+public class PacketCommandSendListener {
+
+ public static void protocol(CommandWhitelist plugin) {
+ ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
+ commandExecListener(protocolManager, plugin);
+ }
+
+ public static void commandExecListener(ProtocolManager protocolManager, Plugin plugin) {
+ protocolManager.addPacketListener(new PacketAdapter(plugin, ListenerPriority.HIGHEST, PacketType.Play.Client.CHAT) {
+ @Override
+ public void onPacketReceiving(PacketEvent event) {
+ PacketContainer packet = event.getPacket();
+ String string = packet.getStrings().read(0);
+ if (!string.startsWith("/"))
+ return;
+ Player player = event.getPlayer();
+ if (player.hasPermission("commandwhitelist.bypass"))
+ return;
+ String cmd = string.replace("/", "");
+ String[] split = cmd.split("\\s+");
+ String command = split[0].toLowerCase();
+ for (Map.Entry> s : CommandWhitelist.getConfigCache().getPermList().entrySet()) {
+ if (!player.hasPermission("commandwhitelist.commands." + s.getKey()))
+ continue;
+ for (String comm : s.getValue()) {
+ comm = comm.toLowerCase();
+ if (command.equalsIgnoreCase(comm) || command.startsWith(comm + " ")) {
+ List bannedSubCommands = CommandsList.getSuggestions(player);
+ for (String bannedSubCommand : bannedSubCommands) {
+ if (cmd.startsWith(bannedSubCommand)) {
+ event.setCancelled(true);
+ ConfigCache config = CommandWhitelist.getConfigCache();
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getPrefix() + RandomStuff.getMessage(config.getCommandDeniedList(), config.getSubCommandDenied())));
+ return;
+ }
+ }
+ return;
+ }
+ }
+ }
+
+ event.setCancelled(true);
+ ConfigCache config = CommandWhitelist.getConfigCache();
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getPrefix() + RandomStuff.getMessage(config.getCommandDeniedList(), config.getCommandDenied())));
+
+ }
+ });
+ }
+}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index cc3db0c..5830e94 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -9,6 +9,11 @@ messages:
removed-from-whitelist: "&eRemoved command &6%s &efrom permission &6%s"
group-doesnt-exist: "&cGroup doesn't exist or error occured"
+# To cover the 1% of plugins that don't register their commands and/or aliases properly.
+# Do not enable if you don't have issues with aliased commands.
+# This requires server restart to take effect.
+use-protocollib-to-detect-commands: false
+
commands:
# Permissions that control what commands players can use
# you can add unlimited amount of whitelists