From 874693ea7c413be65b0202275104ffafe2849c3f Mon Sep 17 00:00:00 2001 From: aappleton8 Date: Mon, 13 May 2019 22:24:18 +0100 Subject: [PATCH] Add Ban Restrictions - Fix typos. - Give the plugin the ability to restrict ops and permanent ops being banned. - Update README.md. --- Jar/OpPermissions_v1.0.2.2_1.7-1.13.jar | Bin 17679 -> 0 bytes Jar/OpPermissions_v1.0.3.1_1.7.6-1.14.0.jar | Bin 0 -> 19885 bytes LICENSE | 2 +- OpPermissions/plugin.yml | 108 +++++++++++--- OpPermissions/src/config.yml | 11 ++ .../me/OpPermissions/MyPlayerListener.java | 124 ++++++++++++++++ .../OpPermissions/OpPermissionsCommands.java | 140 ++++++++++++------ .../OpPermissions/OpPermissionsMainClass.java | 3 +- README.md | 35 ++++- 9 files changed, 355 insertions(+), 68 deletions(-) delete mode 100644 Jar/OpPermissions_v1.0.2.2_1.7-1.13.jar create mode 100644 Jar/OpPermissions_v1.0.3.1_1.7.6-1.14.0.jar diff --git a/Jar/OpPermissions_v1.0.2.2_1.7-1.13.jar b/Jar/OpPermissions_v1.0.2.2_1.7-1.13.jar deleted file mode 100644 index 350e3f7eb7d1acfd5a5ca03bb5ed7ab3adf05d55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17679 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 RMQW9PrXXb{BQ7ZM=%4P+ghl`W literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE index 485cb40..9236780 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 aappleton8 +Copyright (c) 2018 - 2019 aappleton8 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/OpPermissions/plugin.yml b/OpPermissions/plugin.yml index 1123410..d1bce16 100644 --- a/OpPermissions/plugin.yml +++ b/OpPermissions/plugin.yml @@ -1,12 +1,12 @@ name: OpPermissions main: me.OpPermissions.OpPermissionsMainClass -version: 1.0.2.2 +version: 1.0.3.1 description: A plugin helping with op permissions author: aappleton3 database: false commands: opset: - description: Add or remove someone to the list of permenant ops + description: Add or remove someone to the list of permanent ops usage: /opset add|remove|list|version|{help [all|config] [1|2|3]}|check|{config [field]} [playername|data] permission-message: You do not have the required permissions to perform this command oppermissions: @@ -25,9 +25,13 @@ commands: description: The command to add and remove blocked commands usage: /opcommand {add|remove|check }|list permission-message: You do not have the required permissions to perform this command + opbancommands: + description: The command to add and remove blocked ban commands for ops + usage: /opbancommands {add|remove|check }|list + permission-message: You do not have the required permissions to perform this command permissions: oppermissions.*: - description: Add or remove players to the permenant ops list + description: Add or remove players to the permanent ops list default: false children: oppermissions.read.*: true @@ -42,23 +46,25 @@ permissions: oppermissions.seepluginmessages: true oppermissions.commands.*: true oppermissions.showopattempts: true + oppermissions.ban.*: true + oppermissions.opbancommands.*: true oppermissions.read.*: - description: List and check the permenant ops + description: List and check the permanent ops default: op children: oppermissions.read.list: true oppermissions.read.check: true oppermissions.read.list: - description: List the permenant ops + description: List the permanent ops default: op oppermissions.read.check: - description: Check if a player is a permenant op + description: Check if a player is a permanent op default: op oppermissions.add: - description: Add a permenant op to the list + description: Add a permanent op to the list default: false oppermissions.remove: - description: Remove a permenant op from the list + description: Remove a permanent op from the list default: false oppermissions.config.*: description: Change the config file @@ -89,6 +95,9 @@ permissions: oppermissions.config.set.permanentopsusecommands: true oppermissions.config.set.showopattempts: true oppermissions.config.set.showcommanduse: true + oppermissions.config.set.bannableops: true + oppermissions.config.set.bannablepermanentops: true + oppermissions.config.set.deoponban: true oppermissions.config.set.opscanop: description: Set the value of the opscanop field of the config file default: false @@ -139,6 +148,26 @@ permissions: default: false children: oppermissions.config.seedetailedsethelp: true + oppermissions.config.set.bannableops: + description: Let the player ban ops + default: false + children: + oppermissions.config.seedetailedsethelp: true + oppermissions.config.set.bannablepermanentops: + description: Let the player ban permanent ops + default: false + children: + oppermissions.config.seedetailedsethelp: true + oppermissions.config.set.deoponban: + description: Make the plugin deop ops who get banned + default: false + children: + oppermissions.config.seedetailedsethelp: true + oppermissions.config.set.showbanattempts: + description: Let the player see op ban attempts, even if they are unsuccessful + default: false + children: + oppermissions.config.seedetailedsethelp: true oppermissions.showallhelp: description: Can see help for commands the player does not have permission to use default: op @@ -188,29 +217,66 @@ permissions: default: false children: oppermissions.commands.add: true - oppermissions.command.remove: true - oppermissions.command.list: true - oppermissions.command.check: true - oppermissions.command.command: true - oppermissions.command.show: true - oppermissions.command.add: - description: Add a enw blocked command - default: false - oppermissions.command.remove: + oppermissions.commands.remove: true + oppermissions.commands.list: true + oppermissions.commands.check: true + oppermissions.commands.command: true + oppermissions.commands.show: true + oppermissions.commands.add: + description: Add a new blocked command + default: false + oppermissions.commands.remove: description: remove a blocked command default: false - oppermissions.command.list: + oppermissions.commands.list: description: List the blocked commands default: false - oppermissions.command.check: + oppermissions.commands.check: description: Check if a command is blocked default: false - oppermissions.command.command: + oppermissions.commands.command: description: Perform the blocked commands default: false - oppermissions.command.show: + oppermissions.commands.show: description: Be notified every time someone tries to use (even if unsuccessfully) one of the commands on the blocked command list default: false oppermissions.showopattempts: description: Be notified every time someone tries to use (even if unsuccessfully) the /op or /deop command default: false + oppermissions.ban.*: + description: Ban all ops and permanent ops, depending non the config file + default: false + children: + oppermissions.ban.permanentops: true + oppermissions.ban.show: true + oppermissions.ban.permanentops: + description: Ban permanent ops depending on the config file + default: false + children: + oppermissions.ban.ops: true + oppermissions.ban.ops: + description: Ban ops depending on the config file + default: false + oppermissions.ban.show: + description: Be notified every time someone tries to use (even if unsuccessfully) one of the ban commands on an op + default: false + oppermissions.opbancommands.*: + description: The root command to add and remove blocked commands + default: false + children: + oppermissions.opbancommands.add: true + oppermissions.opbancommands.remove: true + oppermissions.opbancommands.list: true + oppermissions.opbancommands.check: true + oppermissions.opbancommands.add: + description: Add a new watched ban command + default: false + oppermissions.opbancommands.remove: + description: Remove a watched ban command + default: false + oppermissions.opbancommands.list: + description: List the watched ban commands + default: false + oppermissions.opbancommands.check: + description: Check if a command is watched ban command + default: false diff --git a/OpPermissions/src/config.yml b/OpPermissions/src/config.yml index 7b776b0..2fa52c8 100644 --- a/OpPermissions/src/config.yml +++ b/OpPermissions/src/config.yml @@ -8,6 +8,17 @@ announceops: no showopattempts: true permanentopsusecommands: true showcommanduse: true +bannableops: default +bannablepermanentops: default +deoponban: false +showbanattempts: true ops: [] commands: [] +opbancommands: + - ban + - tempban + - kick + - blacklist + - ip-ban + - ban-ip diff --git a/OpPermissions/src/me/OpPermissions/MyPlayerListener.java b/OpPermissions/src/me/OpPermissions/MyPlayerListener.java index 2a2ea78..61d7fec 100644 --- a/OpPermissions/src/me/OpPermissions/MyPlayerListener.java +++ b/OpPermissions/src/me/OpPermissions/MyPlayerListener.java @@ -74,6 +74,7 @@ public void onPlayerJoin(PlayerJoinEvent event) { } } + @SuppressWarnings("deprecation") @EventHandler (ignoreCancelled = false, priority = EventPriority.MONITOR) public void onAllPlayerCommands(PlayerCommandPreprocessEvent event) { if (plugin.getConfig().getBoolean("showopattempts")) { @@ -92,12 +93,27 @@ public void onAllPlayerCommands(PlayerCommandPreprocessEvent event) { Bukkit.broadcast(ChatColor.BLUE + plugin.formattedPluginName + event.getPlayer().getName() + " tried to use '" + event.getMessage() + "' with a success status of: " + String.valueOf(!event.isCancelled()), "oppermissions.command.show"); } } + if (plugin.getConfig().getBoolean("showbanattempts")) { + List banCommands = plugin.getConfig().getStringList("opbancommands"); + String[] command = event.getMessage().replace("/", "").toLowerCase().split(" "); + if (command.length > 1) { + if (banCommands.contains(command[0])) { + if (Bukkit.getOfflinePlayer(command[1]) != null) { + if (Bukkit.getOfflinePlayer(command[1]).isOp()) { + Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.BLUE + plugin.formattedPluginName + event.getPlayer().getName() + " tried to use '" + event.getMessage() + "' with a success status of: " + String.valueOf(!event.isCancelled())); + Bukkit.broadcast(ChatColor.BLUE + plugin.formattedPluginName + event.getPlayer().getName() + " tried to use '" + event.getMessage() + "' with a success status of: " + String.valueOf(!event.isCancelled()), "oppermissions.ban.show"); + } + } + } + } + } } @SuppressWarnings("deprecation") @EventHandler (ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onPlayerCommand(PlayerCommandPreprocessEvent event) { boolean canDeop = true; + boolean checkBanCommand = false; if (event.getMessage().startsWith("/op") || event.getMessage().startsWith("/deop")) { String[] rawArgs = event.getMessage().replace("/", "").split(" "); if ((rawArgs.length == 2) && (rawArgs[0].equalsIgnoreCase("op") || rawArgs[0].equalsIgnoreCase("deop"))) { @@ -150,6 +166,7 @@ else if (opSetting.equalsIgnoreCase("no") || opSetting.equalsIgnoreCase("false") } else { List blockedCommands = plugin.getConfig().getStringList("commands"); + List banCommands = plugin.getConfig().getStringList("opbancommands"); if (blockedCommands.contains(event.getMessage().replace("/", "").toLowerCase())) { if (event.getPlayer().hasPermission("oppermissions.command.command")) { // No action required @@ -175,6 +192,10 @@ else if (plugin.getConfig().getBoolean("permanentopsusecommands")) { plugin.noPermission((CommandSender) event.getPlayer()); } } + String[] commandWord = event.getMessage().split(" "); + if (banCommands.contains(commandWord[0].replace("/", "").toLowerCase()) && (event.isCancelled() == false) && (commandWord.length > 1)) { + checkBanCommand = true; + } } if ((event.getMessage().startsWith("/deop")) && (canDeop == true)) { String[] rawArgs = event.getMessage().replace("/", "").split(" "); @@ -204,6 +225,109 @@ else if (event.getPlayer().hasPermission("oppermissions.remove")) { } } } + if (checkBanCommand == true) { + String playerNameToBan = event.getMessage().split(" ")[1]; + Boolean playerToBanOnList = false; + Boolean playerOnList = false; + if (Bukkit.getOfflinePlayer(playerNameToBan).isOp()) { + if (plugin.getConfig().getBoolean("useuuids") == false) { + if (plugin.getConfig().getStringList("ops").contains(playerNameToBan)) { + playerToBanOnList = true; + } + if (plugin.getConfig().getStringList("ops").contains(event.getPlayer().getName())) { + playerOnList = true; + } + } + else { + String playerToBan = Bukkit.getPlayer(playerNameToBan).getUniqueId().toString(); + if (plugin.getConfig().getStringList("ops").contains(playerToBan)) { + playerToBanOnList = true; + } + if (plugin.getConfig().getStringList("ops").contains(event.getPlayer().getUniqueId().toString())) { + playerOnList = true; + } + } + String bannableOps = plugin.getConfig().getString("bannableops"); + String bannablePermanentOps = plugin.getConfig().getString("bannablepermanentops"); + // Handle ops + if (bannableOps.equalsIgnoreCase("default")) { + // No acton required + } + else if (bannableOps.equalsIgnoreCase("no") || bannableOps.equalsIgnoreCase("false")) { + event.setCancelled(true); + event.getPlayer().sendMessage(ChatColor.RED + "Only the console can punish ops "); + } + else if (bannableOps.equalsIgnoreCase("op")) { + if (event.getPlayer().isOp() == false) { + event.setCancelled(true); + event.getPlayer().sendMessage(ChatColor.RED + "You must be an op to punish an op "); + } + } + else if (bannableOps.equalsIgnoreCase("permanent")) { + if (playerOnList == false) { + event.setCancelled(true); + event.getPlayer().sendMessage(ChatColor.RED + "You must be a permanent op to ban an op "); + } + } + else if (bannableOps.equalsIgnoreCase("permission")) { + if (event.getPlayer().hasPermission("oppermissions.ban.ops") == false) { + event.setCancelled(true); + event.getPlayer().sendMessage(ChatColor.RED + "You need the permission 'oppermissions.ban.ops' to ban an op "); + } + } + else { + event.getPlayer().sendMessage(ChatColor.RED + "The " + plugin.getName() + " plugin config has an invalid value in the 'bannableops' field and as such this command has been disallowed "); + plugin.logger.warning(plugin.formattedPluginName + "The config has an invalid value in the 'bannableops' field (it should be 'op', 'permission', 'permanent', 'default', 'false' or 'no'"); + event.setCancelled(true); + } + // Handle permanent ops + if ((event.isCancelled() == false) && (playerToBanOnList == true)) { + if (bannablePermanentOps.equalsIgnoreCase("default")) { + // No action required + } + else if (bannablePermanentOps.equalsIgnoreCase("no") || bannablePermanentOps.equalsIgnoreCase("false")) { + event.setCancelled(true); + event.getPlayer().sendMessage(ChatColor.RED + "Only the console can punish permanent ops "); + } + else if (bannablePermanentOps.equalsIgnoreCase("op")) { + if (event.getPlayer().isOp() == false) { + event.setCancelled(true); + event.getPlayer().sendMessage(ChatColor.RED + "You must be an op to punish a permanent op "); + } + } + else if (bannablePermanentOps.equalsIgnoreCase("permanent")) { + if (playerOnList == false) { + event.setCancelled(true); + event.getPlayer().sendMessage(ChatColor.RED + "You must be a permanent op to punish a permanent op "); + } + } + else if (bannablePermanentOps.equalsIgnoreCase("permission")) { + if (event.getPlayer().hasPermission("oppermissions.ban.permanentops") == false) { + event.setCancelled(true); + event.getPlayer().sendMessage(ChatColor.RED + "You need the permission 'oppermissions.ban.permanentops' to ban a permanent op "); + } + } + else { + event.getPlayer().sendMessage(ChatColor.RED + "The " + plugin.getName() + " plugin config has an invalid value in the 'bannablepermanentops' field and as such this command has been disallowed "); + plugin.logger.warning(plugin.formattedPluginName + "The config has an invalid value in the 'bannablepermanentops' field (it should be 'op', 'permission', 'permanent', 'default', 'false' or 'no'"); + event.setCancelled(true); + } + } + if (event.isCancelled() == false) { + if (plugin.getConfig().getBoolean("deoponban")) { + if (plugin.getConfig().getBoolean("useuuids") == true) { + playerNameToBan = Bukkit.getOfflinePlayer(playerNameToBan).getUniqueId().toString(); + } + if (playerToBanOnList) { + List ops = plugin.getConfig().getStringList("ops"); + ops.remove(playerNameToBan); + plugin.getConfig().set("ops", ops); + plugin.saveConfig(); + } + } + } + } + } } @SuppressWarnings("deprecation") diff --git a/OpPermissions/src/me/OpPermissions/OpPermissionsCommands.java b/OpPermissions/src/me/OpPermissions/OpPermissionsCommands.java index 179ded2..249026b 100644 --- a/OpPermissions/src/me/OpPermissions/OpPermissionsCommands.java +++ b/OpPermissions/src/me/OpPermissions/OpPermissionsCommands.java @@ -93,18 +93,30 @@ else if (page == 2) { } else { s.sendMessage(ChatColor.DARK_AQUA + "The commands for the " + ChatColor.AQUA + plugin.getName() + ChatColor.DARK_AQUA + " plugin are: "); - if (s.hasPermission("oppermissions.command.add") || showAll) { + if (s.hasPermission("oppermissions.commands.add") || showAll) { s.sendMessage(ChatColor.DARK_PURPLE + "/opcommands add " + ChatColor.AQUA + "- Block a new command "); } - if (s.hasPermission("oppermissions.command.remove") || showAll) { + if (s.hasPermission("oppermissions.commands.remove") || showAll) { s.sendMessage(ChatColor.DARK_PURPLE + "/opcommands remove " + ChatColor.AQUA + "- Unblock a command "); } - if (s.hasPermission("oppermissions.command.check") || showAll) { + if (s.hasPermission("oppermissions.commands.check") || showAll) { s.sendMessage(ChatColor.DARK_PURPLE + "/opcommands check " + ChatColor.AQUA + "- Check to see if a command is blocked "); } - if (s.hasPermission("oppermissions.command.list") || showAll) { + if (s.hasPermission("oppermissions.commands.list") || showAll) { s.sendMessage(ChatColor.DARK_PURPLE + "/opcommands list " + ChatColor.AQUA + "- List the blocked commands "); } + if (s.hasPermission("oppermissions.opbancommands.add") || showAll) { + s.sendMessage(ChatColor.DARK_PURPLE + "/opbancommands add " + ChatColor.AQUA + "- Add a new watched ban command "); + } + if (s.hasPermission("oppermissions.opbancommands.remove") || showAll) { + s.sendMessage(ChatColor.DARK_PURPLE + "/opbancommands remove " + ChatColor.AQUA + "- Unwatch a ban command "); + } + if (s.hasPermission("oppermissions.opbancommands.check") || showAll) { + s.sendMessage(ChatColor.DARK_PURPLE + "/opbancommands check " + ChatColor.AQUA + "- Check to see if a ban command is watched "); + } + if (s.hasPermission("oppermissions.opbancommands.list") || showAll) { + s.sendMessage(ChatColor.DARK_PURPLE + "/opbancommands list " + ChatColor.AQUA + "- List the watched ban commands "); + } } } @@ -120,6 +132,10 @@ private void helpConfigFields(CommandSender s) { s.sendMessage(ChatColor.DARK_PURPLE + "/opset config set permanentopsusecommands true|false " + ChatColor.AQUA + "- Set the permanentopsusecommands field "); s.sendMessage(ChatColor.DARK_PURPLE + "/opset config set showopattempts true|false " + ChatColor.AQUA + "- Set the showopattempts field "); s.sendMessage(ChatColor.DARK_PURPLE + "/opset config set showcommanduse true|false " + ChatColor.AQUA + "- Set the showcommanduse field "); + s.sendMessage(ChatColor.DARK_PURPLE + "/opset config set bannableops op|permanent|permission|default|no|false " + ChatColor.AQUA + "- Set the bannableops field "); + s.sendMessage(ChatColor.DARK_PURPLE + "/opset config set bannablepermanentops op|permanent|permission|default|no|false " + ChatColor.AQUA + "- Set the bannablepermanentops field "); + s.sendMessage(ChatColor.DARK_PURPLE + "/opset config set deoponban true|false " + ChatColor.AQUA + "- Set the deoponban field "); + s.sendMessage(ChatColor.DARK_PURPLE + "/opset config set showbanattempts true|false " + ChatColor.AQUA + "- Set the showbanattempts field "); } private void configUpdateMessage() { @@ -192,7 +208,7 @@ public boolean onCommand(CommandSender s, Command c, String l, String[] args) { } } else if (args[2].equalsIgnoreCase("allowrequests")) { - if (s.hasPermission("oppermissions.config.set.allowrequests") || (s instanceof ConsoleCommandSender)) { + if (s.hasPermission("oppermissions.config.set." + args[2].toLowerCase()) || (s instanceof ConsoleCommandSender)) { if (args[3].equalsIgnoreCase("op") || args[3].equalsIgnoreCase("permission") || args[3].equalsIgnoreCase("no") || args[3].equalsIgnoreCase("false") || args[3].equalsIgnoreCase("all") || args[3].equalsIgnoreCase("both")) { plugin.getConfig().set("allowrequests", args[3].toLowerCase()); configUpdateMessage(); @@ -206,7 +222,7 @@ else if (args[2].equalsIgnoreCase("allowrequests")) { } } else if (args[2].equalsIgnoreCase("useuuids")) { - if (s.hasPermission("oppermissions.config.set.useuuids") || (s instanceof ConsoleCommandSender)) { + if (s.hasPermission("oppermissions.config.set." + args[2].toLowerCase()) || (s instanceof ConsoleCommandSender)) { if (plugin.getConfig().getString("useuuids").equalsIgnoreCase(args[3])) { s.sendMessage(ChatColor.RED + "This config value is already " + args[3]); } @@ -226,7 +242,7 @@ else if (args[3].equalsIgnoreCase("false")) { plugin.noPermission(s); } } - else if (args[2].equalsIgnoreCase("updateonplayerjoins") || args[2].equalsIgnoreCase("onlyautoupdateonline") || args[2].equalsIgnoreCase("permanentopsusecommands") || args[2].equalsIgnoreCase("showopattempts") || args[2].equalsIgnoreCase("showcommanduse")) { + else if (args[2].equalsIgnoreCase("updateonplayerjoins") || args[2].equalsIgnoreCase("onlyautoupdateonline") || args[2].equalsIgnoreCase("permanentopsusecommands") || args[2].equalsIgnoreCase("showopattempts") || args[2].equalsIgnoreCase("showcommanduse") || args[2].equalsIgnoreCase("deoponban")) { if (s.hasPermission("oppermissions.config.set." + args[2].toLowerCase()) || (s instanceof ConsoleCommandSender)) { if (args[3].equalsIgnoreCase("true")) { plugin.getConfig().set(args[2], true); @@ -245,13 +261,27 @@ else if (args[3].equalsIgnoreCase("false")) { } } else if (args[2].equalsIgnoreCase("announceops")) { - if (s.hasPermission("oppermissions.config.set.announceops")) { + if (s.hasPermission("oppermissions.config.set." + args[2].toLowerCase()) || (s instanceof ConsoleCommandSender)) { if (args[3].equalsIgnoreCase("all") || args[3].equalsIgnoreCase("permanent") || args[3].equalsIgnoreCase("normal") || args[3].equalsIgnoreCase("no") || args[3].equalsIgnoreCase("false")) { plugin.getConfig().set("announceops", args[3].toLowerCase()); configUpdateMessage(); } else { - s.sendMessage(ChatColor.RED + "The value of the " + args[2] + " field must be 'all', 'permanent', 'normal', 'no' or 'falsel'"); + s.sendMessage(ChatColor.RED + "The value of the " + args[2] + " field must be 'all', 'permanent', 'normal', 'no' or 'false'"); + } + } + else { + plugin.noPermission(s); + } + } + else if (args[2].equalsIgnoreCase("bannableops") || args[2].equalsIgnoreCase("bannablepermanentops")) { + if (s.hasPermission("oppermissions.config.set." + args[2].toLowerCase()) || (s instanceof ConsoleCommandSender)) { + if (args[3].equalsIgnoreCase("default") || args[3].equalsIgnoreCase("permanent") || args[3].equalsIgnoreCase("op") || args[3].equalsIgnoreCase("permission") || args[3].equalsIgnoreCase("no") || args[3].equalsIgnoreCase("false")) { + plugin.getConfig().set(args[2].toLowerCase(), args[3].toLowerCase()); + configUpdateMessage(); + } + else { + s.sendMessage(ChatColor.RED + "The value of the " + args[2] + " field must be 'default', 'permanent', 'op', 'permission', 'no' or 'false'"); } } else { @@ -321,8 +351,8 @@ else if (args.length == 2) { ops.add(playerId); plugin.getConfig().set("ops", ops); p.setOp(true); - s.sendMessage(ChatColor.GREEN + args[1] + " added to the permenant ops list "); - Bukkit.broadcast(ChatColor.GREEN + plugin.formattedPluginName + args[1] + " was added to the permenant ops list", "oppermissions.seepluginmessages"); + s.sendMessage(ChatColor.GREEN + args[1] + " added to the permanent ops list "); + Bukkit.broadcast(ChatColor.GREEN + plugin.formattedPluginName + args[1] + " was added to the permanent ops list", "oppermissions.seepluginmessages"); } plugin.saveConfig(); } @@ -352,13 +382,13 @@ else if (args[0].equalsIgnoreCase("remove")) { } } if (containsId == false) { - s.sendMessage(ChatColor.RED + args[1] + " could not be found in the permenant ops list "); + s.sendMessage(ChatColor.RED + args[1] + " could not be found in the permanent ops list "); } else { ops.remove(playerId); plugin.getConfig().set("ops", ops); - s.sendMessage(ChatColor.GREEN + args[1] + " removed from the permenant ops list "); - Bukkit.broadcast(ChatColor.GREEN + plugin.formattedPluginName + args[1] + " was removed from the permenant ops list", "oppermissions.seepluginmessages"); + s.sendMessage(ChatColor.GREEN + args[1] + " removed from the permanent ops list "); + Bukkit.broadcast(ChatColor.GREEN + plugin.formattedPluginName + args[1] + " was removed from the permanent ops list", "oppermissions.seepluginmessages"); } plugin.saveConfig(); } @@ -378,10 +408,10 @@ else if (args[0].equalsIgnoreCase("check")) { playerId = Bukkit.getOfflinePlayer(args[1]).getUniqueId().toString(); } if (plugin.getConfig().getStringList("ops").contains(playerId)) { - s.sendMessage(args[1] + " is a permenant op "); + s.sendMessage(args[1] + " is a permanent op "); } else { - s.sendMessage(args[1] + " is not a permenant op "); + s.sendMessage(args[1] + " is not a permanent op "); } } } @@ -618,65 +648,89 @@ else if (canSeeMessage.equalsIgnoreCase("both")) { } } } - else if (l.equalsIgnoreCase("opcommand")) { + else if (l.equalsIgnoreCase("opcommand") || l.equalsIgnoreCase("opbancommands")) { + String section = l.equalsIgnoreCase("opbancommands") ? "opbancommands" : "commands"; if (args.length == 0) { return false; } else if (args.length == 1) { if (args[0].equalsIgnoreCase("list")) { - List blockedCommands = plugin.getConfig().getStringList("commands"); - if (blockedCommands.isEmpty()) { - s.sendMessage(ChatColor.RED + "There are no blocked commands"); + if (s.hasPermission("oppermissions." + section + ".list") || (s instanceof ConsoleCommandSender)) { + List blockedCommands = plugin.getConfig().getStringList(section); + if (blockedCommands.isEmpty()) { + s.sendMessage(ChatColor.RED + "There are no blocked commands"); + } + else { + s.sendMessage(blockedCommands.toString()); + } } else { - s.sendMessage(blockedCommands.toString()); + plugin.noPermission(s); } } else { return false; } } - else { + else if (l.equalsIgnoreCase("opcommand") || args.length == 2){ if (args[0].equalsIgnoreCase("add")) { - List blockedCommands = plugin.getConfig().getStringList("commands"); - String command = String.join(" ", args).split(" ", 2)[1]; - if (blockedCommands.contains(command)) { - s.sendMessage(ChatColor.RED + "'" + ChatColor.GRAY + command + ChatColor.RED + "' is already a blocked command "); + if (s.hasPermission("oppermissions." + section + ".add") || (s instanceof ConsoleCommandSender)) { + List blockedCommands = plugin.getConfig().getStringList(section); + String command = String.join(" ", args).split(" ", 2)[1]; + if (blockedCommands.contains(command)) { + s.sendMessage(ChatColor.RED + "'" + ChatColor.GRAY + command + ChatColor.RED + "' is already a blocked command "); + } + else { + blockedCommands.add(command); + plugin.getConfig().set(section, blockedCommands); + plugin.saveConfig(); + s.sendMessage(ChatColor.GREEN + "'" + ChatColor.GRAY + command + ChatColor.GREEN + "' is now blocked "); + } } else { - blockedCommands.add(command); - plugin.getConfig().set("commands", blockedCommands); - plugin.saveConfig(); - s.sendMessage(ChatColor.GREEN + "'" + ChatColor.GRAY + command + ChatColor.GREEN + "' is now blocked "); + plugin.noPermission(s); } } else if (args[0].equalsIgnoreCase("remove")) { - List blockedCommands = plugin.getConfig().getStringList("commands"); - String command = String.join(" ", args).split(" ", 2)[1]; - if (blockedCommands.contains(command)) { - blockedCommands.remove(command); - plugin.getConfig().set("commands", blockedCommands); - plugin.saveConfig(); - s.sendMessage(ChatColor.GREEN + "'" + ChatColor.GRAY + command + ChatColor.GREEN + "' is no longer blocked "); + if (s.hasPermission("oppermissions." + section + ".remove") || (s instanceof ConsoleCommandSender)) { + List blockedCommands = plugin.getConfig().getStringList(section); + String command = String.join(" ", args).split(" ", 2)[1]; + if (blockedCommands.contains(command)) { + blockedCommands.remove(command); + plugin.getConfig().set(section, blockedCommands); + plugin.saveConfig(); + s.sendMessage(ChatColor.GREEN + "'" + ChatColor.GRAY + command + ChatColor.GREEN + "' is no longer blocked "); + } + else { + s.sendMessage(ChatColor.RED + "'" + ChatColor.GRAY + command + ChatColor.RED + "' is not a blocked command so could not be unblocked "); + } } else { - s.sendMessage(ChatColor.RED + "'" + ChatColor.GRAY + command + ChatColor.RED + "' is not a blocked command so could not be unblocked "); + plugin.noPermission(s); } } else if (args[0].equalsIgnoreCase("check")) { - List blockedCommands = plugin.getConfig().getStringList("commands"); - String command = String.join(" ", args).split(" ", 2)[1]; - if (blockedCommands.contains(command)) { - s.sendMessage(ChatColor.GREEN + "'" + ChatColor.GRAY + command + ChatColor.GREEN + "' is a blocked command "); + if (s.hasPermission("oppermissions." + section + ".check") || (s instanceof ConsoleCommandSender)) { + List blockedCommands = plugin.getConfig().getStringList(section); + String command = String.join(" ", args).split(" ", 2)[1]; + if (blockedCommands.contains(command)) { + s.sendMessage(ChatColor.GREEN + "'" + ChatColor.GRAY + command + ChatColor.GREEN + "' is a blocked command "); + } + else { + s.sendMessage(ChatColor.GREEN + "'" + ChatColor.GRAY + command + ChatColor.GREEN + "' is not a blocked command "); + } } else { - s.sendMessage(ChatColor.GREEN + "'" + ChatColor.GRAY + command + ChatColor.GREEN + "' is not a blocked command "); + plugin.noPermission(s); } } else { return false; } } + else { + return false; + } } else { return false; diff --git a/OpPermissions/src/me/OpPermissions/OpPermissionsMainClass.java b/OpPermissions/src/me/OpPermissions/OpPermissionsMainClass.java index fc543dc..5ab828b 100644 --- a/OpPermissions/src/me/OpPermissions/OpPermissionsMainClass.java +++ b/OpPermissions/src/me/OpPermissions/OpPermissionsMainClass.java @@ -34,7 +34,8 @@ public void onEnable() { getCommand("oppermissions").setExecutor(opc); getCommand("oplist").setExecutor(opc); getCommand("oprequest").setExecutor(opc); - getCommand("opcommand").setExecutor(opc); + getCommand("opcommand").setExecutor(opc); + getCommand("opbancommands").setExecutor(opc); logger.info(formattedPluginName + descriptionFile.getName() + " " + descriptionFile.getVersion() + " has been enabled "); } diff --git a/README.md b/README.md index 08f98c4..8e6f253 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,10 @@ The terms 'username' and 'playername' are used interchangeably in this plugin an This plugin can use either playernames or player UUIDs. Although this plugin can convert between the two, errors are likely to occur (most commonly users' usernames becoming 'null') if the conversion operation is performed on an offline player. As such, the format to use should be chosen at the start and kept constant. If a conversion is necessary, setting the 'onlyautoupdateonline' config field to true will prevent the plugin updating offline players, avoiding errors. Setting the 'updateonplayerjoins' config field to true will make the plugin convert the players when they come online, however, the user may still appear as 'null' until then. It is recommended always to use player UUIDs. ## Versions: -The current plugin release version is 1.0.2.0. The compiled .jar file is available in the 'releases' section. The 'Jar' folder contains the most recently compiled plugin version that runs (currently version 1.0.2.2); this may be the same as the most recent release or it may be a development build. The development builds may be unstable. The current release of this plugin has been tested on Spigot servers running Minecraft versions 1.7.10, 1.8.9, 1.12.2 and 1.13.1. It is designed for Minecraft versions between 1.7.x and 1.13.x, and as such, any bug for any version between 1.7.6 and 1.14.0 will be fixed. This plugin is likely to work with many other Minecraft Spigot and Bukkit versions but this is untested and bugs found with these versions will not necessarily be fixed. +The current plugin release version is 1.0.2.3. The compiled .jar file is available in the 'releases' section. The 'Jar' folder contains the most recently compiled plugin version that runs (currently version 1.0.3.1); this may be the same as the most recent release or it may be a development build. The development builds may be unstable. The current release of this plugin has been tested on Spigot servers running Minecraft versions 1.7.10, 1.8.9, 1.12.2 and 1.13.1. It is designed for Minecraft versions between 1.7.6 and 1.14.0, and as such, any bug for any version between 1.7.6 and 1.14.0 will be fixed. This plugin is likely to work with many other Minecraft Spigot and Bukkit versions but this is untested and bugs found with these versions will not necessarily be fixed. ## License: -This plugin and its source code are released under the MIT license (see the [LICENSE file](https://github.com/aappleton8/OpPermissions/blob/master/LICENSE) for full details). This plugin is copyright (c) aappleton3/aappleton8, 2018. +This plugin and its source code are released under the MIT license (see the [LICENSE file](https://github.com/aappleton8/OpPermissions/blob/master/LICENSE) for full details). This plugin is copyright (c) aappleton3/aappleton8, 2018 - 2019. ## Build: This plugin is built using Eclipse. To build the plugin, the .classpath file firstly needs to be recreated using Eclipse, and the craftbukkit-1.12.2.jar file (or another version of craftbukkit) needs to be added as an external build dependency. @@ -26,6 +26,7 @@ The general command syntaxes are: - */oppermissions*. - */oprequest <message>*. - */opcommand <arguments>*. + - */opbancommand <arguments>*. Below, the individual commands are listed: - /oppermissions - Show the help screen @@ -59,6 +60,10 @@ Below, the individual commands are listed: - /opcommand remove <command> - Unblock a command - /opcommand check <command> - Check if a command is blocked - /opcommand list - List all the blocked commands + - /opbancommand add <command> - Watch a ban command + - /opbancommand remove <command> - Unwatch a ban command + - /opbancommand check <command> - Check if a ban command is watched + - /opbancommand list - List all the watched ban commands ## Permissions: - oppermissions.* : All below permissions | Default: false @@ -81,6 +86,10 @@ Below, the individual commands are listed: - oppermissions.config.set.permanentopsusecommands : The */opset config set permanentopsusecommands true|false* command | Default: false - oppermissions.config.set.showopattempts : The */opset config set showopattempts true|false* command | Default: false - oppermissions.config.set.showcommanduse : The */opset config set showcommanduse true|false* command | Default: false + - oppermissions.config.set.showbanattempts : The */opset config set showbanattempts true|false* command | Default: false + - oppermissions.config.set.bannableops : The */opset config set bannableops op|permanent|permission|default|no|false* command | Default: false + - oppermissions.config.set.bannablepermanentops : The */opset config set bannablepermanentops op|permanent|permission|default|no|false* command | Default: false + - oppermissions.config.set.deoponban : Thw */opset config set deoponban true|false* command | Default: false - oppermissions.config.seedetailedsethelp : The */opset help config* command | Default: false - oppermissions.config.verifylist : The */opset config updateplayeruuids* command | Default: false - oppermissions.op : Enable the use of the */op* command, depending on the config file | Default: false @@ -100,6 +109,15 @@ Below, the individual commands are listed: - oppermissions.command.command : Enable the player to use the blocked commands | Default: false - oppermissions.command.show : Let the player be notified every time someone tries to use one of the commands on the blocked command list, even if it is unsuccessful | Default: false - oppermissions.showopattempts : Let the player be notified every time someone tries to use the */op* or */deop* command, even if it is unsuccessful | Default: false + - oppermissions.ban.* : Let the player ban all ops and permanent ops, depending non the config file | Default: false + - oppermissions.ban.permanentops : Let the player ban permanent ops depending on the config file | Default: false + - oppermissions.ban.ops : Let the player ban ops depending on the config file | Default: false + - oppermissions.ban.show : Let the player be notified everytime someone tries to ban an op or a permanent op | Default: false + - oppermissions.opbancommands.* : The root command to add and remove blocked commands | Default: false + - oppermissions.opbancommands.add : Let the player watch a new ban command | Default: false + - oppermissions.opbancommands.remove : Stop watching a previously watched ban command | Default: false + - oppermissions.opbancommands.list : List the watched ban commands | Default: false + - oppermissions.opbancommands.check : Check if a command is a watched ban command | Default: false ## Config: All configurable options for this plugin are in the 'config.yml' file. This file contains the following fields. @@ -113,6 +131,9 @@ All configurable options for this plugin are in the 'config.yml' file. This file - showopattempts - Whether players with the permission *oppermissions.showopattempts* are notified every time someone tried to use the */op* or */deop* command, even if it is unsuccessful (true: players with the permission are notified; false: no-one is notified) - permanentopsusecommands - Sets whether permanent ops can use the blocked commands even if they don't have the *oppermissions.command.command* permission or not (true: permanent ops can use the commands; false: permanent ops are treated the same as everyone else) - showcommanduse - Whether players with the permission *oppermissions.command.show* are notified every time someone tries to use one of the commands on the blocked command list, even if it is unsuccessful (true: players with the permission are notified; false: no-one is notified) + - bannableops - Whether ops are prevented from being banned or not (default: the default action happens; op: only ops can ban ops; permanent: only permanent ops can ban ops; permission: the *oppermissions.ban.ops* permission is required to ban ops; no|false: the command can only be performed by the console) + - bannablepermanentops - Whether permanent ops are prevented from being banned or not (default: the default action happens; op: only ops can ban ops; permanent: only permanent ops can ban permanent ops; permission: the *oppermissions.ban.permanentops* permission is required to ban permanent ops; no|false: the command can only be performed by the console) + - deoponban - Whether ops who are banned should be deopped or not (true: banned ops are deopped; false: banned ops are not deopped) - ops - The list of permanent ops - commands - The list of blocked commands @@ -128,6 +149,9 @@ announceops: no showopattempts: true permanentopsusecommands: true showcommanduse: true +bannableops: default +bannablepermanentops: default +deoponban: false ops: - aappleton3 - Codefined @@ -135,6 +159,13 @@ commands: - stop - restart - reload +opbancommands: + - ban + - tempban + - kick + - blacklist + - ip-ban + - ban-ip ```