Fix option parser issues with minus values (Fixes #38)

This commit is contained in:
Phoenix616 2020-06-01 17:15:11 +01:00
parent abf484a161
commit a76b60a3c7
2 changed files with 25 additions and 15 deletions

View File

@ -135,14 +135,14 @@ public class RandomTeleport extends JavaPlugin implements RandomTeleportAPI {
}
return false;
}));
addOptionParser(new SimpleOptionParser(array("x", "xpos"), (searcher, args) -> {
addOptionParser(new SimpleOptionParser(array("x", "xpos"), 1, (searcher, args) -> {
if (args.length > 0) {
searcher.getCenter().setX(Integer.parseInt(args[0]));
return true;
}
return false;
}));
addOptionParser(new SimpleOptionParser(array("z", "zpos"), (searcher, args) -> {
addOptionParser(new SimpleOptionParser(array("z", "zpos"), 1, (searcher, args) -> {
if (args.length > 0) {
searcher.getCenter().setZ(Integer.parseInt(args[0]));
return true;

View File

@ -30,6 +30,7 @@ import java.util.stream.Collectors;
public class SimpleOptionParser implements OptionParser {
private Set<String> aliases;
private final int argsLength;
private final BiFunction<RandomSearcher, String[], Boolean> parser;
public SimpleOptionParser(String option, BiFunction<RandomSearcher, String[], Boolean> parser) {
@ -37,28 +38,37 @@ public class SimpleOptionParser implements OptionParser {
}
public SimpleOptionParser(String[] optionAliases, BiFunction<RandomSearcher, String[], Boolean> parser) {
this(optionAliases, -1, parser);
}
public SimpleOptionParser(String[] optionAliases, int argsLength, BiFunction<RandomSearcher, String[], Boolean> parser) {
Validate.notEmpty(optionAliases);
this.aliases = Arrays.stream(optionAliases).map(String::toLowerCase).collect(Collectors.toSet());
this.argsLength = argsLength;
this.parser = parser;
}
@Override
public boolean parse(RandomSearcher searcher, String[] args) {
boolean ret = false;
String[] optionParts = String.join(" ", args).split(" -");
for (String optionPart : optionParts) {
String[] parts = optionPart.split(" ");
while (parts[0].startsWith("-")) {
parts[0] = parts[0].substring(1);
}
if (aliases.contains(parts[0].toLowerCase())) {
if (!hasAccess(searcher.getInitiator())) {
throw new IllegalArgumentException(searcher.getPlugin().getMessage(
searcher.getInitiator(), "error.no-permission.option",
"option", parts[0],
"perm", "randomteleport.manual.option." + aliases.iterator().next()));
for (int i = 0; i < args.length; i++) {
if (args[i].startsWith("-")) {
String option = args[i].toLowerCase().substring(1);
if (option.startsWith("-")) {
option = args[i].substring(1);
}
if (aliases.contains(option)) {
if (!hasAccess(searcher.getInitiator())) {
throw new IllegalArgumentException(searcher.getPlugin().getMessage(
searcher.getInitiator(), "error.no-permission.option",
"option", option,
"perm", "randomteleport.manual.option." + aliases.iterator().next()));
}
if (argsLength < 0 || i + argsLength < args.length) {
ret |= parser.apply(searcher, Arrays.copyOfRange(args, i + 1, argsLength < 0 ? args.length : i + 1 + argsLength));
}
}
ret |= parser.apply(searcher, Arrays.copyOfRange(parts, 1, parts.length));
}
}
return ret;