Initial Development
- /cab remove complete - /cab search etc complete
This commit is contained in:
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.
Binary file not shown.
Binary file not shown.
Reference in new issue
Block a user