summaryrefslogtreecommitdiff
path: root/src/main/java/cat/freya
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2026-03-19 21:47:24 -0400
committerFreya Murphy <freya@freyacat.org>2026-03-19 21:49:57 -0400
commit9eaadd57b8b66409a39402a3f395336bd351a006 (patch)
tree6928fd9f12c53870e21797013ecaf7abcb55738a /src/main/java/cat/freya
downloadcommandblocklocator-9eaadd57b8b66409a39402a3f395336bd351a006.tar.gz
commandblocklocator-9eaadd57b8b66409a39402a3f395336bd351a006.tar.bz2
commandblocklocator-9eaadd57b8b66409a39402a3f395336bd351a006.zip
initial 0.1.0HEADmain
Diffstat (limited to 'src/main/java/cat/freya')
-rw-r--r--src/main/java/cat/freya/cbl/ChatManager.java38
-rw-r--r--src/main/java/cat/freya/cbl/CommandBlockListener.java34
-rw-r--r--src/main/java/cat/freya/cbl/Main.java61
-rw-r--r--src/main/java/cat/freya/cbl/command/Toggle.java33
-rw-r--r--src/main/java/cat/freya/cbl/command/util/CommandGroup.java179
-rw-r--r--src/main/java/cat/freya/cbl/command/util/ICommand.java20
-rw-r--r--src/main/java/cat/freya/cbl/util/Pair.java21
-rw-r--r--src/main/java/cat/freya/cbl/util/Tuple.java27
8 files changed, 413 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;
+ }
+
+}