From 34c3825205b76a5faa4545f629658158e3c15741 Mon Sep 17 00:00:00 2001 From: SemvdH Date: Sun, 19 Oct 2025 12:36:09 +0200 Subject: [PATCH] Add parsing of add command --- .../commands/AddCoordinateCommandHandler.java | 99 ++++++++++++++++++- .../commands/CoordinatesCommand.java | 10 +- .../interestingcorner/db/MinecraftColor.java | 25 ++++- install_and_jar.sh | 4 + 4 files changed, 130 insertions(+), 8 deletions(-) create mode 100755 install_and_jar.sh diff --git a/ic_plugin/src/main/java/nl/interestingcorner/commands/AddCoordinateCommandHandler.java b/ic_plugin/src/main/java/nl/interestingcorner/commands/AddCoordinateCommandHandler.java index 473f5b0..811b7b3 100644 --- a/ic_plugin/src/main/java/nl/interestingcorner/commands/AddCoordinateCommandHandler.java +++ b/ic_plugin/src/main/java/nl/interestingcorner/commands/AddCoordinateCommandHandler.java @@ -1,5 +1,9 @@ package nl.interestingcorner.commands; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.Command; @@ -7,6 +11,9 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.ComponentStyle; +import net.md_5.bungee.api.chat.TextComponent; import nl.interestingcorner.db.Coordinate; import nl.interestingcorner.db.DatabaseManager; import nl.interestingcorner.db.MinecraftColor; @@ -18,12 +25,43 @@ public class AddCoordinateCommandHandler implements CoordinatesCommandHandler { */ private final int MIN_ARGS = 4; + private CommandSender sender; + @Override public boolean handleCommand(CommandSender sender, String[] args) { if (args.length < MIN_ARGS) { return false; } + this.sender = sender; + + List argsWithoutFirstCommand = removeFirstArg(args); + if (argsWithoutFirstCommand.isEmpty()) + { + return false; + } + + List parsedArgs = parseArgs(argsWithoutFirstCommand.toArray(String[]::new)); + if (parsedArgs.isEmpty()) + { + return false; + } + + sender.sendMessage("Args after parsing:"); + sender.sendMessage("0:" + parsedArgs.get(0)); + sender.sendMessage("1:" + parsedArgs.get(1)); + sender.sendMessage("2:" + parsedArgs.get(2)); + + if (!MinecraftColor.isValidColor(parsedArgs.get(2))) + { + TextComponent errorMessage = new TextComponent(); + ComponentStyle messageStyle = new ComponentStyle(); + messageStyle.setColor(ChatColor.DARK_RED); + errorMessage.setStyle(messageStyle); + errorMessage.setText("Color " + parsedArgs.get(2) + " is not a valid color!"); + return false; + } + if (sender instanceof Player player) { Location playerLocation = player.getLocation(); if (playerLocation == null) { @@ -35,18 +73,73 @@ public class AddCoordinateCommandHandler implements CoordinatesCommandHandler { return false; } + return DatabaseManager.INSTANCE - .addCoordinate(args[1], // name - args[2], // description + .addCoordinate(parsedArgs.get(0), // name + parsedArgs.get(1), // description new Coordinate.Position(playerLocation.getBlockX(), playerLocation.getBlockY(), playerLocation.getBlockZ()), // position playerWorld.getEnvironment().equals(World.Environment.NETHER), // nether playerWorld.getName(), // world - MinecraftColor.fromString(args[3]) // color + MinecraftColor.fromString(parsedArgs.get(2)) // color ); } return true; } + private List removeFirstArg(String[] args) { + List onlyArgs = new ArrayList<>(); + + sender.sendMessage("removeFirstArg: size of args is " + String.valueOf(args.length)); + for (int i = 1; i < args.length; i++) { + onlyArgs.add(args[i]); + } + + sender.sendMessage("removeFirstArg: size of onlyArgs is " + String.valueOf(onlyArgs.size())); + return onlyArgs; + } + + private List parseArgs(String[] args) { + List res = new ArrayList<>(); + StringBuilder currentArg = new StringBuilder(); + boolean inQuotes = false; + + for (String arg : args) { + if (inQuotes) { + if (arg.endsWith("\"")) { + // end of quoted entry + // add final arg to result + String replaced = arg.replace("\"", ""); + currentArg.append(" ").append(replaced); + res.add(currentArg.toString()); + + // clear current arg + currentArg.setLength(0); + inQuotes = false; + } else { + currentArg.append(" ").append(arg); + } + } else { + if (arg.startsWith("\"")) { + String replaced = arg.replace("\"", ""); + + if (arg.endsWith("\"")) { + // if the current arg starts and ends with a ", just add the arg to the result + res.add(replaced); + } else { + // if the current arg doesn't end with a ", it is quoted and we need to handle + // the remainder + inQuotes = true; + currentArg.append(replaced); + } + } else { + res.add(arg); + } + } + } + + return res; + } + } diff --git a/ic_plugin/src/main/java/nl/interestingcorner/commands/CoordinatesCommand.java b/ic_plugin/src/main/java/nl/interestingcorner/commands/CoordinatesCommand.java index feda2b2..650b8ff 100644 --- a/ic_plugin/src/main/java/nl/interestingcorner/commands/CoordinatesCommand.java +++ b/ic_plugin/src/main/java/nl/interestingcorner/commands/CoordinatesCommand.java @@ -10,12 +10,16 @@ public class CoordinatesCommand implements CommandExecutor{ @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - TextComponent textComponent = new TextComponent("Got command " + command.getName() + " label " + label + " and args "); + StringBuilder sb = new StringBuilder("Got command " + command.getName() + " label " + label + " and args "); for (String string : args) { - textComponent.addExtra(string); + sb.append(" "); + sb.append(string); + sb.append(" "); } - sender.sendMessage(textComponent.getText()); + sender.sendMessage("Args length: " + String.valueOf(args.length)); + sender.sendMessage(sb.toString()); + return switch (args[0]) { case "get" -> new GetCoordinatesCommandHandler().handleCommand(sender, args); diff --git a/ic_plugin/src/main/java/nl/interestingcorner/db/MinecraftColor.java b/ic_plugin/src/main/java/nl/interestingcorner/db/MinecraftColor.java index 9476f9d..932b360 100644 --- a/ic_plugin/src/main/java/nl/interestingcorner/db/MinecraftColor.java +++ b/ic_plugin/src/main/java/nl/interestingcorner/db/MinecraftColor.java @@ -41,7 +41,7 @@ public enum MinecraftColor { */ public static MinecraftColor fromString(String name) { if (name == null) { - return null; + return WHITE; } for (MinecraftColor color : MinecraftColor.values()) { @@ -49,6 +49,27 @@ public enum MinecraftColor { return color; } } - return null; + return WHITE; + } + + /** + * Checks if a given name is a valid color value. + * @param name the name to check + * @return true if it's a valid color value, false otherwise + */ + public static boolean isValidColor(String name) + { + if (name == null) + { + return false; + } + + for (MinecraftColor color : values()) { + if (color.equalsName(name)) { + return true; + } + } + + return false; } } diff --git a/install_and_jar.sh b/install_and_jar.sh new file mode 100755 index 0000000..c85a6a9 --- /dev/null +++ b/install_and_jar.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +mvn install -f "/home/sem/Development/Minecraft/mc-ic-server/ic_plugin/pom.xml" +mvn jar:jar -f "/home/sem/Development/Minecraft/mc-ic-server/ic_plugin/pom.xml"