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");
}
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(
@@ -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);
@@ -32,106 +32,120 @@ public final class CabTabCompleter implements TabCompleter {
) {
List<String> suggestions = new ArrayList<>();
if (args.length == 1) {
String input = args[0].toLowerCase(Locale.ROOT);
try {
// /cab <destination>
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<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);
}
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 <destination>
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 <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()) {
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 <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<StopManager.StopEntry> getSortedStops()
throws SQLException {
List<StopManager.StopEntry> stops = stopManager.getAllStops();
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(
String name,
String icon,
Binary file not shown.