diff --git a/src/main/java/com/rsscripting/rstaxi/commands/CabCommand.java b/src/main/java/com/rsscripting/rstaxi/commands/CabCommand.java index 328ea49..14da11e 100644 --- a/src/main/java/com/rsscripting/rstaxi/commands/CabCommand.java +++ b/src/main/java/com/rsscripting/rstaxi/commands/CabCommand.java @@ -196,14 +196,66 @@ public final class CabCommand implements CommandExecutor { return checkPermission(sender, "rs-cab.edit"); } + private boolean handleRemove( CommandSender sender, String[] args ) { - return checkPermission(sender, "rs-cab.delete"); + if (!sender.hasPermission("rs-cab.delete")) { + sender.sendMessage( + plugin.getLanguageManager() + .getMessage("general.no-permission") + ); + return true; + } + + if (args.length < 2) { + sender.sendMessage( + plugin.getLanguageManager() + .getMessage("general.invalid-usage") + ); + return true; + } + + String name = String.join( + " ", + java.util.Arrays.copyOfRange(args, 1, args.length) + ).trim(); + + try { + if (stopManager.delete(name)) { + sender.sendMessage( + plugin.getLanguageManager().getMessage( + "stop.deleted", + Map.of("stop", name) + ) + ); + } else { + sender.sendMessage( + plugin.getLanguageManager().getMessage( + "general.unknown-stop", + Map.of("stop", name) + ) + ); + } + } catch (SQLException e) { + plugin.getLogger().log( + java.util.logging.Level.SEVERE, + "Failed to delete taxi stop: " + name, + e + ); + + sender.sendMessage( + plugin.getLanguageManager() + .getMessage("stop.creation-error") + ); + } + + return true; } + private boolean handleList(CommandSender sender) { if (!sender.hasPermission("rs-cab.use")) { sender.sendMessage( diff --git a/src/main/java/com/rsscripting/rstaxi/commands/CabSearchCommand.java b/src/main/java/com/rsscripting/rstaxi/commands/CabSearchCommand.java index 91224eb..b05db37 100644 --- a/src/main/java/com/rsscripting/rstaxi/commands/CabSearchCommand.java +++ b/src/main/java/com/rsscripting/rstaxi/commands/CabSearchCommand.java @@ -27,38 +27,25 @@ public final class CabSearchCommand { return true; } - if (args.length < 2) { + if (args.length < 3) { sendUsage(sender); return true; } - String query = String.join(" ", args) - .substring(args[0].length() + 1) - .trim(); + String searchType = args[1].toLowerCase(Locale.ROOT); + String value = String.join( + " ", + java.util.Arrays.copyOfRange(args, 2, args.length) + ).trim(); - if (query.isBlank()) { - sendUsage(sender); - return true; - } - - String lowerQuery = query.toLowerCase(Locale.ROOT); - boolean iconSearch = lowerQuery.startsWith("icon:"); - boolean textSearch = lowerQuery.startsWith("text:"); - - if (!iconSearch && !textSearch) { - sendUsage(sender); - return true; - } - - String value = query.substring(query.indexOf(':') + 1).trim(); - - if (value.isBlank()) { + if ((!searchType.equals("icon") && !searchType.equals("text")) + || value.isBlank()) { sendUsage(sender); return true; } try { - var stops = iconSearch + var stops = searchType.equals("icon") ? stopManager.searchByIcon(value) : stopManager.searchByName(value); diff --git a/src/main/java/com/rsscripting/rstaxi/commands/CabTabCompleter.java b/src/main/java/com/rsscripting/rstaxi/commands/CabTabCompleter.java index d789be8..e9b5333 100644 --- a/src/main/java/com/rsscripting/rstaxi/commands/CabTabCompleter.java +++ b/src/main/java/com/rsscripting/rstaxi/commands/CabTabCompleter.java @@ -32,106 +32,120 @@ public final class CabTabCompleter implements TabCompleter { ) { List suggestions = new ArrayList<>(); - if (args.length == 1) { - String input = args[0].toLowerCase(Locale.ROOT); + try { + // /cab + if (args.length == 1) { + if (!sender.hasPermission("rs-cab.use")) { + return suggestions; + } - // Management commands first, in the requested order. - if (sender.hasPermission("rs-cab.add") - && "add".startsWith(input)) { - suggestions.add("add"); - } + String input = args[0].toLowerCase(Locale.ROOT); - if (sender.hasPermission("rs-cab.use") - && "search".startsWith(input)) { - suggestions.add("search"); - } - - if (sender.hasPermission("rs-cab.delete") - && "remove".startsWith(input)) { - suggestions.add("remove"); - } - - // Destinations follow the management commands. - if (sender.hasPermission("rs-cab.use")) { - try { - List stops = - stopManager.getAllStops(); - - stops.sort(Comparator.comparing( - StopManager.StopEntry::name, - String.CASE_INSENSITIVE_ORDER - )); - - for (StopManager.StopEntry stop : stops) { - String name = stop.name(); - - if (name.toLowerCase(Locale.ROOT) - .startsWith(input) - && !isReservedCommand(name)) { - suggestions.add(name); - } + for (StopManager.StopEntry stop : getSortedStops()) { + if (stop.name().toLowerCase(Locale.ROOT) + .startsWith(input)) { + suggestions.add(stop.name()); } - } catch (SQLException e) { - plugin.getLogger().log( - Level.WARNING, - "Failed to load taxi destinations for tab completion.", - e - ); - } - } - - return suggestions; - } - - // Preserve search prefix and icon suggestions. - if (args[0].equalsIgnoreCase("search") - && sender.hasPermission("rs-cab.use")) { - - String input = String.join(" ", args) - .substring(args[0].length() + 1); - - String lowerInput = input.toLowerCase(Locale.ROOT); - - if (args.length == 2 - && !lowerInput.startsWith("icon:")) { - if ("text:".startsWith(lowerInput)) { - suggestions.add("text:"); - } - - if ("icon:".startsWith(lowerInput)) { - suggestions.add("icon:"); } return suggestions; } - if (lowerInput.startsWith("icon:")) { - String iconPrefix = input.substring("icon:".length()) - .toLowerCase(Locale.ROOT); + // /cab remove + if (args[0].equalsIgnoreCase("remove")) { + if (!sender.hasPermission("rs-cab.delete")) { + return suggestions; + } + + String input = String.join( + " ", + java.util.Arrays.copyOfRange(args, 1, args.length) + ).toLowerCase(Locale.ROOT); + + for (StopManager.StopEntry stop : getSortedStops()) { + if (stop.name().toLowerCase(Locale.ROOT) + .startsWith(input)) { + suggestions.add(stop.name()); + } + } + + return suggestions; + } + + // /cab search ... + if (args[0].equalsIgnoreCase("search")) { + if (!sender.hasPermission("rs-cab.use")) { + return suggestions; + } + + // /cab search + if (args.length == 2) { + String input = args[1].toLowerCase(Locale.ROOT); + + if ("icon".startsWith(input)) { + suggestions.add("icon"); + } + + if ("text".startsWith(input)) { + suggestions.add("text"); + } + + return suggestions; + } + + // /cab search icon + if (args.length >= 3 + && args[1].equalsIgnoreCase("icon")) { + String input = args[2].toLowerCase(Locale.ROOT); - try { for (String icon : stopManager.getUsedIcons()) { if (icon.toLowerCase(Locale.ROOT) - .startsWith(iconPrefix)) { - suggestions.add("icon:" + icon); + .startsWith(input)) { + suggestions.add(icon); } } - } catch (SQLException e) { - plugin.getLogger().log( - Level.WARNING, - "Failed to load taxi icons for tab completion.", - e - ); + + return suggestions; + } + + // /cab search text + if (args.length >= 3 + && args[1].equalsIgnoreCase("text")) { + String input = String.join( + " ", + java.util.Arrays.copyOfRange(args, 2, args.length) + ).toLowerCase(Locale.ROOT); + + for (StopManager.StopEntry stop : getSortedStops()) { + if (stop.name().toLowerCase(Locale.ROOT) + .contains(input)) { + suggestions.add(stop.name()); + } + } + + return suggestions; } } + } catch (SQLException e) { + plugin.getLogger().log( + Level.WARNING, + "Failed to load taxi suggestions.", + e + ); } + return suggestions; } - private boolean isReservedCommand(String name) { - return name.equalsIgnoreCase("add") - || name.equalsIgnoreCase("remove") - || name.equalsIgnoreCase("search") - || name.equalsIgnoreCase("list"); + private List getSortedStops() + throws SQLException { + List stops = stopManager.getAllStops(); + + stops.sort(Comparator.comparing( + StopManager.StopEntry::name, + String.CASE_INSENSITIVE_ORDER + )); + + return stops; } } diff --git a/src/main/java/com/rsscripting/rstaxi/stops/StopManager.java b/src/main/java/com/rsscripting/rstaxi/stops/StopManager.java index 5b46520..b7419dc 100644 --- a/src/main/java/com/rsscripting/rstaxi/stops/StopManager.java +++ b/src/main/java/com/rsscripting/rstaxi/stops/StopManager.java @@ -36,6 +36,18 @@ public final class StopManager { } } + public boolean delete(String name) throws SQLException { + String sql = "DELETE FROM stops WHERE name = ?"; + + try (PreparedStatement statement = connection() + .prepareStatement(sql)) { + + statement.setString(1, name); + return statement.executeUpdate() == 1; + } + } + + public boolean add( String name, String icon, diff --git a/target/RS-Taxi-0.1.0.jar b/target/RS-Taxi-0.1.0.jar index 3d1cf48..a7a7e30 100644 Binary files a/target/RS-Taxi-0.1.0.jar and b/target/RS-Taxi-0.1.0.jar differ diff --git a/target/classes/com/rsscripting/rstaxi/commands/CabCommand.class b/target/classes/com/rsscripting/rstaxi/commands/CabCommand.class index eac9cc7..17e0fd1 100644 Binary files a/target/classes/com/rsscripting/rstaxi/commands/CabCommand.class and b/target/classes/com/rsscripting/rstaxi/commands/CabCommand.class differ diff --git a/target/classes/com/rsscripting/rstaxi/stops/StopManager.class b/target/classes/com/rsscripting/rstaxi/stops/StopManager.class index a42af0e..e05fe44 100644 Binary files a/target/classes/com/rsscripting/rstaxi/stops/StopManager.class and b/target/classes/com/rsscripting/rstaxi/stops/StopManager.class differ