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
+170 -105

No files matched your search

@@ -196,14 +196,66 @@ 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")) {
sender.sendMessage( sender.sendMessage(
@@ -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<>();
if (args.length == 1) { try {
String input = args[0].toLowerCase(Locale.ROOT); // /cab <destination>
if (args.length == 1) {
if (!sender.hasPermission("rs-cab.use")) {
return suggestions;
}
// Management commands first, in the requested order. String input = args[0].toLowerCase(Locale.ROOT);
if (sender.hasPermission("rs-cab.add")
&& "add".startsWith(input)) {
suggestions.add("add");
}
if (sender.hasPermission("rs-cab.use") for (StopManager.StopEntry stop : getSortedStops()) {
&& "search".startsWith(input)) { if (stop.name().toLowerCase(Locale.ROOT)
suggestions.add("search"); .startsWith(input)) {
} suggestions.add(stop.name());
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<StopManager.StopEntry> 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);
}
} }
} 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; return suggestions;
} }
if (lowerInput.startsWith("icon:")) { // /cab remove <destination>
String iconPrefix = input.substring("icon:".length()) if (args[0].equalsIgnoreCase("remove")) {
.toLowerCase(Locale.ROOT); 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 <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);
try {
for (String icon : stopManager.getUsedIcons()) { for (String icon : stopManager.getUsedIcons()) {
if (icon.toLowerCase(Locale.ROOT) if (icon.toLowerCase(Locale.ROOT)
.startsWith(iconPrefix)) { .startsWith(input)) {
suggestions.add("icon:" + icon); suggestions.add(icon);
} }
} }
} catch (SQLException e) {
plugin.getLogger().log( return suggestions;
Level.WARNING, }
"Failed to load taxi icons for tab completion.",
e // /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; return suggestions;
} }
private boolean isReservedCommand(String name) { private List<StopManager.StopEntry> getSortedStops()
return name.equalsIgnoreCase("add") throws SQLException {
|| name.equalsIgnoreCase("remove") List<StopManager.StopEntry> stops = stopManager.getAllStops();
|| name.equalsIgnoreCase("search")
|| name.equalsIgnoreCase("list"); stops.sort(Comparator.comparing(
StopManager.StopEntry::name,
String.CASE_INSENSITIVE_ORDER
));
return stops;
} }
} }
@@ -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.