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