Initial Development

- /cab remove complete
- /cab search etc complete
This commit is contained in:
BigPappa committed 2026-10-11 14:14:10 -05:00
1 parent 9611dacc96
commit f1ab19f003
7 files changed
+174 -109

No files matched your search

@@ -196,13 +196,65 @@ public final class CabCommand implements CommandExecutor {
return checkPermission(sender, "rs-cab.edit"); return checkPermission(sender, "rs-cab.edit");
} }
private boolean handleRemove( private boolean handleRemove(
CommandSender sender, CommandSender sender,
String[] args 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) { private boolean handleList(CommandSender sender) {
if (!sender.hasPermission("rs-cab.use")) { if (!sender.hasPermission("rs-cab.use")) {
@@ -27,38 +27,25 @@ public final class CabSearchCommand {
return true; return true;
} }
if (args.length < 2) { if (args.length < 3) {
sendUsage(sender); sendUsage(sender);
return true; return true;
} }
String query = String.join(" ", args) String searchType = args[1].toLowerCase(Locale.ROOT);
.substring(args[0].length() + 1) String value = String.join(
.trim(); " ",
java.util.Arrays.copyOfRange(args, 2, args.length)
).trim();
if (query.isBlank()) { if ((!searchType.equals("icon") && !searchType.equals("text"))
sendUsage(sender); || value.isBlank()) {
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()) {
sendUsage(sender); sendUsage(sender);
return true; return true;
} }
try { try {
var stops = iconSearch var stops = searchType.equals("icon")
? stopManager.searchByIcon(value) ? stopManager.searchByIcon(value)
: stopManager.searchByName(value); : stopManager.searchByName(value);
@@ -32,106 +32,120 @@ public final class CabTabCompleter implements TabCompleter {
) { ) {
List<String> suggestions = new ArrayList<>(); List<String> suggestions = new ArrayList<>();
try {
// /cab <destination>
if (args.length == 1) { if (args.length == 1) {
if (!sender.hasPermission("rs-cab.use")) {
return suggestions;
}
String input = args[0].toLowerCase(Locale.ROOT); String input = args[0].toLowerCase(Locale.ROOT);
// Management commands first, in the requested order. for (StopManager.StopEntry stop : getSortedStops()) {
if (sender.hasPermission("rs-cab.add") if (stop.name().toLowerCase(Locale.ROOT)
&& "add".startsWith(input)) { .startsWith(input)) {
suggestions.add("add"); suggestions.add(stop.name());
}
} }
if (sender.hasPermission("rs-cab.use") return suggestions;
&& "search".startsWith(input)) {
suggestions.add("search");
} }
if (sender.hasPermission("rs-cab.delete") // /cab remove <destination>
&& "remove".startsWith(input)) { if (args[0].equalsIgnoreCase("remove")) {
suggestions.add("remove"); if (!sender.hasPermission("rs-cab.delete")) {
return suggestions;
} }
// Destinations follow the management commands. String input = String.join(
if (sender.hasPermission("rs-cab.use")) { " ",
try { java.util.Arrays.copyOfRange(args, 1, args.length)
List<StopManager.StopEntry> stops = ).toLowerCase(Locale.ROOT);
stopManager.getAllStops();
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 <type>
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 <icon>
if (args.length >= 3
&& args[1].equalsIgnoreCase("icon")) {
String input = args[2].toLowerCase(Locale.ROOT);
for (String icon : stopManager.getUsedIcons()) {
if (icon.toLowerCase(Locale.ROOT)
.startsWith(input)) {
suggestions.add(icon);
}
}
return suggestions;
}
// /cab search text <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 List<StopManager.StopEntry> getSortedStops()
throws SQLException {
List<StopManager.StopEntry> stops = stopManager.getAllStops();
stops.sort(Comparator.comparing( stops.sort(Comparator.comparing(
StopManager.StopEntry::name, StopManager.StopEntry::name,
String.CASE_INSENSITIVE_ORDER String.CASE_INSENSITIVE_ORDER
)); ));
for (StopManager.StopEntry stop : stops) { return stops;
String name = stop.name();
if (name.toLowerCase(Locale.ROOT)
.startsWith(input)
&& !isReservedCommand(name)) {
suggestions.add(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);
try {
for (String icon : stopManager.getUsedIcons()) {
if (icon.toLowerCase(Locale.ROOT)
.startsWith(iconPrefix)) {
suggestions.add("icon:" + icon);
}
}
} catch (SQLException e) {
plugin.getLogger().log(
Level.WARNING,
"Failed to load taxi icons for tab completion.",
e
);
}
}
}
return suggestions;
}
private boolean isReservedCommand(String name) {
return name.equalsIgnoreCase("add")
|| name.equalsIgnoreCase("remove")
|| name.equalsIgnoreCase("search")
|| name.equalsIgnoreCase("list");
} }
} }
@@ -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( public boolean add(
String name, String name,
String icon, String icon,
Binary file not shown.