diff --git a/pom.xml b/pom.xml index aa017f0..b9f5a1b 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ eu.endermite CommandWhitelist - 1.1.0 + 1.2.0 jar CommandWhitelist @@ -71,5 +71,11 @@ 1.16.1-R0.1-SNAPSHOT provided + + net.md-5 + bungeecord-api + 1.15-SNAPSHOT + provided + diff --git a/src/main/java/eu/endermite/commandwhitelist/CommandWhitelistBungee.java b/src/main/java/eu/endermite/commandwhitelist/CommandWhitelistBungee.java new file mode 100644 index 0000000..d79b2c6 --- /dev/null +++ b/src/main/java/eu/endermite/commandwhitelist/CommandWhitelistBungee.java @@ -0,0 +1,68 @@ +package eu.endermite.commandwhitelist; + +import com.google.common.io.ByteStreams; +import eu.endermite.commandwhitelist.config.BungeeConfigCache; +import eu.endermite.commandwhitelist.listeners.BungeeChatEventListener; +import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; + +public final class CommandWhitelistBungee extends Plugin { + + private static eu.endermite.commandwhitelist.CommandWhitelistBungee plugin; + private static BungeeConfigCache configCache; + + @Override + public void onEnable() { + + plugin = this; + + loadConfig(); + + this.getProxy().getPluginManager().registerListener(this, new BungeeChatEventListener()); + + } + + public static eu.endermite.commandwhitelist.CommandWhitelistBungee getPlugin() { + return plugin; + } + + public static BungeeConfigCache getConfigCache() { + return configCache; + } + + + public void loadConfig() { + try { + if (!getDataFolder().exists()) { + getDataFolder().mkdir(); + } + + File file = new File(getDataFolder(), "config.yml"); + + if (!file.exists()) { + file.createNewFile(); + try (InputStream in = getResourceAsStream("bungeeconfig.yml"); + OutputStream out = new FileOutputStream(file)) { + ByteStreams.copy(in, out); + } + } + final Configuration config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(file); + ConfigurationProvider.getProvider(YamlConfiguration.class).save(config, new File(getDataFolder(), "config.yml")); + configCache = new BungeeConfigCache(config); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void loadConfigAsync() { + getProxy().getScheduler().runAsync(this, this::loadConfig); + } + +} diff --git a/src/main/java/eu/endermite/commandwhitelist/config/BungeeConfigCache.java b/src/main/java/eu/endermite/commandwhitelist/config/BungeeConfigCache.java new file mode 100644 index 0000000..cd308e7 --- /dev/null +++ b/src/main/java/eu/endermite/commandwhitelist/config/BungeeConfigCache.java @@ -0,0 +1,38 @@ +package eu.endermite.commandwhitelist.config; + +import net.md_5.bungee.config.Configuration; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; + +public class BungeeConfigCache { + + private HashMap> permList = new HashMap<>(); + private String prefix, commandDenied, noPermission, noSubCommand, configReloaded; + + public BungeeConfigCache(Configuration config) { + + prefix = config.getString("messages.prefix"); + commandDenied = config.getString("messages.command-denied"); + noPermission = config.getString("messages.no-permission"); + noSubCommand = config.getString("messages.no-such-subcommand"); + configReloaded = config.getString("messages.config-reloaded"); + + Collection perms = config.getSection("commands").getKeys(); + for (String s : perms) { + this.permList.put(s, config.getStringList("commands."+s)); + } + } + + public HashMap> getPermList() { + return permList; + } + + public String getPrefix() {return prefix;} + public String getCommandDenied() {return commandDenied;} + public String getNoPermission() {return noPermission;} + public String getNoSubCommand() {return noSubCommand;} + public String getConfigReloaded() {return configReloaded;} + +} diff --git a/src/main/java/eu/endermite/commandwhitelist/listeners/BungeeChatEventListener.java b/src/main/java/eu/endermite/commandwhitelist/listeners/BungeeChatEventListener.java new file mode 100644 index 0000000..9882df4 --- /dev/null +++ b/src/main/java/eu/endermite/commandwhitelist/listeners/BungeeChatEventListener.java @@ -0,0 +1,54 @@ +package eu.endermite.commandwhitelist.listeners; + +import eu.endermite.commandwhitelist.CommandWhitelistBungee; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; + +import java.util.List; +import java.util.Map; + +public class BungeeChatEventListener implements Listener { + + + @EventHandler + public void onChatEvent(net.md_5.bungee.api.event.ChatEvent event) { + + if (!event.isCancelled() && event.getSender() instanceof ProxiedPlayer) { + ProxiedPlayer player = (ProxiedPlayer) event.getSender(); + if (event.isProxyCommand()) { + if (player.hasPermission("commandwhitelist.bypass")) { + return; + } + String command = event.getMessage().toLowerCase(); + boolean found = false; + for (Map.Entry> s : CommandWhitelistBungee.getConfigCache().getPermList().entrySet()) { + if (player.hasPermission("commandwhitelist.commands." + s.getKey())) { + for (String comm : s.getValue()) { + comm = comm.toLowerCase(); + if (command.equalsIgnoreCase("/"+comm)) { + found = true; + break; + } + else if (command.startsWith("/" + comm + " ")) { + found = true; + break; + } + } + } + } + if (!found) { + event.setCancelled(true); + player.sendMessage(ChatColor.translateAlternateColorCodes('&', CommandWhitelistBungee.getConfigCache().getPrefix() + CommandWhitelistBungee.getConfigCache().getCommandDenied())); + } + + } + + + + } + + } + +} diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml new file mode 100644 index 0000000..4fa6dca --- /dev/null +++ b/src/main/resources/bungee.yml @@ -0,0 +1,4 @@ +name: CommandWhitelistBungee +version: ${project.version} +main: eu.endermite.commandwhitelist.CommandWhitelistBungee +author: YouHaveTrouble diff --git a/src/main/resources/bungeeconfig.yml b/src/main/resources/bungeeconfig.yml new file mode 100644 index 0000000..5d565a1 --- /dev/null +++ b/src/main/resources/bungeeconfig.yml @@ -0,0 +1,20 @@ +# This is bungeecord version of the config. +messages: + prefix: "CommandWhitelist > " + command-denied: "No such command." + no-permission: "&cYou don't have permission to do this." + no-such-subcommand: "&cNo subcommand by that name." + config-reloaded: "&eConfiguration reloaded." + +commands: + # Permissions that control what commands players can use + # you can add unlimited amount of whitelists + + # commandwhitelist.commands.default + # this will be automatically given to players by default + default: + - glist + - server + # commandwhitelist.commands.example + example: + - example \ No newline at end of file