diff --git a/docs/source/changelog/v1.8.rst b/docs/source/changelog/v1.8.rst index e120974..8a1825a 100644 --- a/docs/source/changelog/v1.8.rst +++ b/docs/source/changelog/v1.8.rst @@ -16,12 +16,15 @@ Additions ``**bold**`` |br| ``~~strikethrough~~`` +* `Spec Confirm`_ - Updates the TP confirmation to allow for a configurable list of commands * `Dynmap Link Command`_ - Allows a user to get a link to dynmap pointing to their current location .. _Checkup Command: https://git.etztech.xyz/24CarrotCraft/QoL/pulls/33 .. _Discord Syntax: https://git.etztech.xyz/24CarrotCraft/QoL/pulls/36 +.. _Spec Confirm: https://git.etztech.xyz/24CarrotCraft/QoL/pulls/39 .. _Dynmap Link Command: https://git.etztech.xyz/24CarrotCraft/QoL/pulls/40 + Bug Fixes --------- None \ No newline at end of file diff --git a/docs/source/permissions.rst b/docs/source/permissions.rst index 1f3ba41..6137788 100644 --- a/docs/source/permissions.rst +++ b/docs/source/permissions.rst @@ -24,7 +24,7 @@ Permissions ``qol.auditor`` - Ability to bypass auditing when running commands on auditable -``qol.tpconfirm`` - Forces a player to confirm teleports when outside spectator mode +``qol.specconfirm`` - Forces a player to confirm a (configurable) command(s) when outside spectator mode ``qol.whitelist.bypass`` - Allows someone into the server when Whitelist mode is enabled diff --git a/src/main/java/xyz/etztech/qol/listeners/CommandPreprocessListener.java b/src/main/java/xyz/etztech/qol/listeners/CommandPreprocessListener.java index 685e310..d9566c6 100644 --- a/src/main/java/xyz/etztech/qol/listeners/CommandPreprocessListener.java +++ b/src/main/java/xyz/etztech/qol/listeners/CommandPreprocessListener.java @@ -1,30 +1,26 @@ package xyz.etztech.qol.listeners; +import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.TextComponent; import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.server.ServerCommandEvent; -import xyz.etztech.core.CoreUtils; +import org.dynmap.DynmapAPI; import xyz.etztech.core.web.CoreWeb; import xyz.etztech.qol.QoL; import xyz.etztech.qol.other.LinkCommand; -import org.dynmap.DynmapAPI; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import java.util.Collection; +import java.util.*; public class CommandPreprocessListener implements Listener { QoL plugin; - private Map confirmTpMap = new HashMap<>(); + private Map confirmMap = new HashMap<>(); private Map dynmapVisibleStatusMap = new HashMap<>(); public CommandPreprocessListener(QoL plugin) { @@ -73,27 +69,39 @@ public class CommandPreprocessListener implements Listener { visibleStatus = true; } - sender.spigot().sendMessage(new TextComponent(ChatColor.GREEN + message)); + TextComponent textComponent = new TextComponent(message); + textComponent.setColor(ChatColor.GREEN); + sender.spigot().sendMessage(textComponent); dynmap.setPlayerVisiblity(sender.getName(), visibleStatus); } - // Spec TP confirmation - if (sender.hasPermission("qol.tpconfirm")) { - //check if the command is a tp command - if (noSlash(base).equals("tp") || noSlash(base).toLowerCase().startsWith("tele") || noSlash(command).toLowerCase().startsWith("lagg tpchunk")) { - //If the user is in the confirm tp map, remove them and let the command run - if (command.equals(confirmTpMap.get(sender.getUniqueId()))) { - confirmTpMap.remove(sender.getUniqueId()); + // Spec confirmation + List specConfirm = plugin.getConfig().getStringList("spec-confirm"); + if (sender.hasPermission("qol.specconfirm")) { + boolean confirm = false; + for (String confirmable : specConfirm) { + // If the player command either starts with a confirmable command and space (meaning confirmation is needed regardless of arguments) + // Or the player command is a full match to the confirmable command + if (noSlash(command).toLowerCase().startsWith(confirmable.toLowerCase() + " ") || noSlash(command).toLowerCase().equals(confirmable.toLowerCase())) { + confirm = true; } - //If the user is running the tp command for the first time outside of spec + } + //check if the command is a spec confirm command + if (confirm) { + //If the user is in the confirm map, remove them and let the command run + if (command.equals(confirmMap.get(sender.getUniqueId()))) { + confirmMap.remove(sender.getUniqueId()); + } + //If the user is running the command for the first time outside of spec else if (sender.getGameMode() != GameMode.SPECTATOR) { //Cancel the command event.setCancelled(true); - //Add the user to the tp confirm map - confirmTpMap.put(sender.getUniqueId(), command); + //Add the user to the spec confirm map + confirmMap.put(sender.getUniqueId(), command); - TextComponent message = new TextComponent(ChatColor.GREEN + "You are TPing out of spec, run command again to confirm."); + TextComponent message = new TextComponent("You are running this command out of spec, run again to confirm."); + message.setColor(ChatColor.GREEN); sender.spigot().sendMessage(message); } } @@ -114,7 +122,8 @@ public class CommandPreprocessListener implements Listener { for (LinkCommand linkCommand : QoL.getLinks()) { if (base.equalsIgnoreCase(linkCommand.getCommand())) { event.setCancelled(true); - TextComponent link = new TextComponent(ChatColor.GREEN + linkCommand.getMessage()); + TextComponent link = new TextComponent(linkCommand.getMessage()); + link.setColor(ChatColor.GREEN); link.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, linkCommand.getUrl())); sender.spigot().sendMessage(link); return; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 4d15912..16d55d5 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -94,6 +94,12 @@ disable-fire: view-distances: world: 2 +# A list of commands to confirm before using if the user isn't in spectator mode +spec-confirm: + - "tp" + - "checkup" + - "lagg tpchunk" + # Dynmap link # Leave url blank to disable dynmap: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 5dbc176..3e54995 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -97,8 +97,8 @@ permissions: qol.auditor: description: Ability to bypass auditing when running commands on auditable default: op - qol.tpconfirm: - description: Makes the user confirm they want to TP out of spec + qol.specconfirm: + description: Makes the user confirm they want to run (configurable) command(s) out of spec default: op qol.griefalert: description: Alerts the user when monitored actions are encountered