diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/cat/freya/cbl/ChatManager.java | 38 | ||||
| -rw-r--r-- | src/main/java/cat/freya/cbl/CommandBlockListener.java | 34 | ||||
| -rw-r--r-- | src/main/java/cat/freya/cbl/Main.java | 61 | ||||
| -rw-r--r-- | src/main/java/cat/freya/cbl/command/Toggle.java | 33 | ||||
| -rw-r--r-- | src/main/java/cat/freya/cbl/command/util/CommandGroup.java | 179 | ||||
| -rw-r--r-- | src/main/java/cat/freya/cbl/command/util/ICommand.java | 20 | ||||
| -rw-r--r-- | src/main/java/cat/freya/cbl/util/Pair.java | 21 | ||||
| -rw-r--r-- | src/main/java/cat/freya/cbl/util/Tuple.java | 27 | ||||
| -rw-r--r-- | src/main/resources/plugin.yml | 16 |
9 files changed, 429 insertions, 0 deletions
diff --git a/src/main/java/cat/freya/cbl/ChatManager.java b/src/main/java/cat/freya/cbl/ChatManager.java new file mode 100644 index 0000000..ffca479 --- /dev/null +++ b/src/main/java/cat/freya/cbl/ChatManager.java @@ -0,0 +1,38 @@ + +package cat.freya.cbl; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +public class ChatManager { + + private final Set<UUID> enabledPlayers = new HashSet<>(); + + public void sendNotification(Location location, String command) { + for (UUID uuid : enabledPlayers) { + Player player = Bukkit.getPlayer(uuid); + if (player == null) continue; + + player.sendMessage(String.format("%s[%s%s%s,%s%s%s,%s%s%s] %s%s", + ChatColor.GRAY, + ChatColor.AQUA, location.getX(), ChatColor.WHITE, + ChatColor.AQUA, location.getY(), ChatColor.WHITE, + ChatColor.AQUA, location.getZ(), ChatColor.GRAY, + ChatColor.WHITE, command)); + } + } + + public void toggleUUID(UUID uuid) { + if (enabledPlayers.contains(uuid)) { + enabledPlayers.remove(uuid); + } else { + enabledPlayers.add(uuid); + } + } +} diff --git a/src/main/java/cat/freya/cbl/CommandBlockListener.java b/src/main/java/cat/freya/cbl/CommandBlockListener.java new file mode 100644 index 0000000..59788da --- /dev/null +++ b/src/main/java/cat/freya/cbl/CommandBlockListener.java @@ -0,0 +1,34 @@ +package cat.freya.cbl; + +import org.bukkit.block.Block; +import org.bukkit.command.BlockCommandSender; +import org.bukkit.command.CommandSender; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.server.ServerCommandEvent; + +public class CommandBlockListener implements Listener { + + private ChatManager chatManager; + + public CommandBlockListener(ChatManager chatManager) { + this.chatManager = chatManager; + } + + @EventHandler + public void onServerCommand(ServerCommandEvent event) { + String command = event.getCommand(); + if (command == null) return; + + CommandSender sender = event.getSender(); + if (sender == null) return; + + if (sender instanceof BlockCommandSender) { + BlockCommandSender blockSender = (BlockCommandSender) sender; + Block block = blockSender.getBlock(); + if (block == null) return; + + this.chatManager.sendNotification(block.getLocation(), command); + } + } +} diff --git a/src/main/java/cat/freya/cbl/Main.java b/src/main/java/cat/freya/cbl/Main.java new file mode 100644 index 0000000..fe1a3f8 --- /dev/null +++ b/src/main/java/cat/freya/cbl/Main.java @@ -0,0 +1,61 @@ +package cat.freya.cbl; + +import java.util.ArrayList; + +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import cat.freya.cbl.command.Toggle; +import cat.freya.cbl.command.util.CommandGroup; + +public class Main extends JavaPlugin { + + public static Main instance; + public final ChatManager chatManager; + public final CommandBlockListener commandBlockListener; + public final CommandGroup commandGroup; + + public static final String MESSAGE_PREFIX = "CBL > "; + public static final String ERROR_PREFIX = "Error > "; + + Main() { + Main.instance = this; + this.chatManager = new ChatManager(); + this.commandBlockListener = new CommandBlockListener(this.chatManager); + this.commandGroup = new CommandGroup("cbl", + new Toggle() + ); + } + + @Override + public void onEnable() { + this.registerListener(this.commandBlockListener); + } + + private void registerListener(Listener listener) { + Bukkit.getPluginManager().registerEvents(listener, this); + } + + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage(ERROR_PREFIX + "Commands may only be run by players"); + return true; + } + commandGroup.handleCommand((Player)sender, args); + return true; + } + + public java.util.List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage(ERROR_PREFIX + "Commands may only be run by players"); + return new ArrayList<>(); + } + return commandGroup.handleTabComplete((Player)sender, args); + } + +} diff --git a/src/main/java/cat/freya/cbl/command/Toggle.java b/src/main/java/cat/freya/cbl/command/Toggle.java new file mode 100644 index 0000000..ae82efd --- /dev/null +++ b/src/main/java/cat/freya/cbl/command/Toggle.java @@ -0,0 +1,33 @@ +package cat.freya.cbl.command; + +import java.util.List; + +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import cat.freya.cbl.Main; +import cat.freya.cbl.command.util.ICommand; + +public class Toggle implements ICommand { + + public void execute(Player sender, String[] args) { + Main.instance.chatManager.toggleUUID(sender.getUniqueId()); + } + + public String getLabel() { + return "toggle"; + } + + public String getUsage() { + return ""; + } + + public String getDescription() { + return "Toggles command block location for you"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return null; + } + +} diff --git a/src/main/java/cat/freya/cbl/command/util/CommandGroup.java b/src/main/java/cat/freya/cbl/command/util/CommandGroup.java new file mode 100644 index 0000000..f8183e4 --- /dev/null +++ b/src/main/java/cat/freya/cbl/command/util/CommandGroup.java @@ -0,0 +1,179 @@ +package cat.freya.cbl.command.util; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; + +import cat.freya.cbl.Main; +import cat.freya.cbl.util.Pair; +import cat.freya.cbl.util.Tuple; + +import java.util.*; +import java.util.stream.Collectors; + +public class CommandGroup { + + private final Map<String, Object> commandRegister; + private final String label; + + public CommandGroup(String label, Object... data) { + this.label = label; + this.commandRegister = new LinkedHashMap<>(); + for(Object o : data) { + registerCommand(o); + } + } + + public String getLabel() { + return label; + } + + private void registerCommand(Object object) { + if (object instanceof ICommand) { + ICommand command = (ICommand) object; + if (!commandRegister.containsKey(command.getLabel())) { + commandRegister.put(command.getLabel().toLowerCase(), command); + } + } else if(object instanceof CommandGroup) { + CommandGroup group = (CommandGroup) object; + if (!commandRegister.containsKey(group.getLabel())) { + commandRegister.put(group.getLabel().toLowerCase(), group); + } + } + } + + public void handleCommand(Player player, String[] args) { + + Tuple<ICommand, String, String[]> data = getCommand(args, this.getLabel()); + + if (data == null) { + player.sendMessage( + String.format("%s%sCommandBlockLocator %s(%s0.1.0%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY, ChatColor.WHITE, ChatColor.GRAY) + + String.format("%sAuthor: %s[KenshinEto]", ChatColor.GRAY, ChatColor.WHITE) + ); + return; + } + + ICommand command = data.getLeft(); + String permission = data.getCenter(); + String[] parameters = data.getRight(); + + if (!player.hasPermission(permission)) { + player.sendMessage(Main.ERROR_PREFIX + "You do not have permission to run this command!"); + return; + } + + int parameterCount = (int) Arrays.stream(command.getUsage().split(" ")).filter(p -> p.startsWith("<") && !p.startsWith("<*")).count(); + if(parameters.length < parameterCount) { + player.sendMessage(Main.ERROR_PREFIX + "Please pass in the correct amount of arguments"); + return; + } + + try { + command.execute(player, parameters); + } catch (Exception e) { + player.sendMessage(Main.ERROR_PREFIX + "An error has occurred."); + e.printStackTrace(); + } + } + + @Nullable + private Tuple<ICommand, String, String[]> getCommand(String[] args, String permission) { + if(args.length < 1) { + return null; + } + String invoke = args[0]; + if(commandRegister.containsKey(invoke)) { + Object o = commandRegister.get(invoke); + if (o instanceof CommandGroup) { + CommandGroup group = (CommandGroup) o; + return group.getCommand( + Arrays.copyOfRange(args, 1, args.length), + permission + "." + group.getLabel() + ); + } else if(o instanceof ICommand) { + ICommand command = (ICommand) o; + return new Tuple<>(command, permission + "." + command.getLabel(), Arrays.copyOfRange(args, 1, args.length)); + } + } + return null; + } + + public List<String> handleTabComplete(Player player, String[] args) { + return handleTabComplete(player, this.getLabel(), args); + } + + private List<String> handleTabComplete(Player player, String permission, String[] args) { + String invoke = args[0].toLowerCase(); + if (args.length == 1) { + return new ArrayList<>(commandRegister.keySet()) + .stream() + .filter(handle -> handle.toLowerCase().startsWith(invoke)) + .filter(handle -> { + Object object = commandRegister.get(handle); + if (object instanceof ICommand) { + ICommand command = (ICommand) object; + return player.hasPermission(permission + "." + command.getLabel()); + } else if (object instanceof CommandGroup) { + CommandGroup group = (CommandGroup) object; + return group.hasPermission(player, permission + "." + group.getLabel()); + } + return false; + }) + .collect(Collectors.toList()); + } else { + if (commandRegister.containsKey(invoke)) { + Object object = commandRegister.get(invoke); + if (object instanceof CommandGroup) { + CommandGroup group = (CommandGroup) object; + return group.handleTabComplete(player, permission + "." + group.getLabel(), Arrays.copyOfRange(args, 1, args.length)); + } else if (object instanceof ICommand) { + ICommand command = (ICommand) object; + String[] usage = command.getUsage().split(" "); + if (args.length - 2 < usage.length) { + String parameter = usage[args.length - 2]; + String name = parameter.replace("<", "").replace(">", ""); + List<String> list = command.autoComplete(name, args[args.length - 1]); + if (list != null) { + return list; + } + } + } + } + return new ArrayList<>(); + } + } + + private boolean hasPermission(Player player, String permission) { + for(Object object : commandRegister.values()) { + if(object instanceof ICommand) { + ICommand command = (ICommand) object; + if(player.hasPermission(permission + command.getLabel())) return true; + } else if(object instanceof CommandGroup) { + CommandGroup group = (CommandGroup) object; + if (group.hasPermission(player, permission + this.label + ".")) return true; + } + } + return false; + } + + public List<Pair<String, ICommand>> getCommands() { + return getCommands(this.getLabel()); + } + + private List<Pair<String, ICommand>> getCommands(String prefix) { + List<Pair<String, ICommand>> commands = new LinkedList<>(); + for(Object object : commandRegister.values()) { + if(object instanceof ICommand) { + ICommand command = (ICommand) object; + commands.add(new Pair<>(prefix+" "+command.getLabel(), command)); + } else if(object instanceof CommandGroup) { + CommandGroup group = (CommandGroup) object; + commands.addAll(group.getCommands(prefix+" "+group.getLabel())); + } + } + return commands; + } + + +} diff --git a/src/main/java/cat/freya/cbl/command/util/ICommand.java b/src/main/java/cat/freya/cbl/command/util/ICommand.java new file mode 100644 index 0000000..0308d77 --- /dev/null +++ b/src/main/java/cat/freya/cbl/command/util/ICommand.java @@ -0,0 +1,20 @@ +package cat.freya.cbl.command.util; + +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public interface ICommand { + + void execute(Player sender, String[] args); + + String getLabel(); + + String getUsage(); + + String getDescription(); + + List<String> autoComplete(@NotNull String parameter, @NotNull String typed); + +} diff --git a/src/main/java/cat/freya/cbl/util/Pair.java b/src/main/java/cat/freya/cbl/util/Pair.java new file mode 100644 index 0000000..bda14eb --- /dev/null +++ b/src/main/java/cat/freya/cbl/util/Pair.java @@ -0,0 +1,21 @@ +package cat.freya.cbl.util; + +public class Pair<L, R> { + + private final L left; + private final R right; + + public Pair(L left, R right) { + this.left = left; + this.right = right; + } + + public L getLeft() { + return left; + } + + public R getRight() { + return right; + } + +} diff --git a/src/main/java/cat/freya/cbl/util/Tuple.java b/src/main/java/cat/freya/cbl/util/Tuple.java new file mode 100644 index 0000000..6aef5a8 --- /dev/null +++ b/src/main/java/cat/freya/cbl/util/Tuple.java @@ -0,0 +1,27 @@ +package cat.freya.cbl.util; + +public class Tuple<L, C, R> { + + private final L left; + private final C center; + private final R right; + + public Tuple(L left, C center, R right) { + this.left = left; + this.center = center; + this.right = right; + } + + public L getLeft() { + return left; + } + + public C getCenter() { + return center; + } + + public R getRight() { + return right; + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..c400632 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,16 @@ +name: CommandBlockLocator +main: cat.freya.cbl.Main +version: 0.1.0 +author: KenshinEto +load: STARTUP +api-version: 1.13 +depend: [] +softdepend: [] +commands: + commandblocklocator: + description: Command Block Locator command + usage: /commandblocklocator [command] + aliases: cbl +permissions: + cbl.toggle: + default: op |