Improve ArgumentString parsing + add apache commons-text dependency

This commit is contained in:
themode 2021-01-09 03:14:10 +01:00
parent 8871cf16c0
commit d0bf6d9f0d
6 changed files with 33 additions and 31 deletions

View File

@ -112,6 +112,9 @@ dependencies {
api 'io.netty:netty-transport-native-kqueue:4.1.56.Final:osx-x86_64'
api 'io.netty.incubator:netty-incubator-transport-native-io_uring:0.0.2.Final:linux-x86_64'
// https://mvnrepository.com/artifact/org.apache.commons/commons-text
compile group: 'org.apache.commons', name: 'commons-text', version: '1.9'
// https://mvnrepository.com/artifact/it.unimi.dsi/fastutil
api 'it.unimi.dsi:fastutil:8.4.4'

View File

@ -634,16 +634,16 @@ public final class CommandManager {
} else if (argument instanceof ArgumentFloatRange) {
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(nodes, argument, executable, false);
argumentNode.parser = "minecraft:float_range";
} else if (argument instanceof ArgumentEntities) {
ArgumentEntities argumentEntities = (ArgumentEntities) argument;
} else if (argument instanceof ArgumentEntity) {
ArgumentEntity argumentEntity = (ArgumentEntity) argument;
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(nodes, argument, executable, false);
argumentNode.parser = "minecraft:entity";
argumentNode.properties = packetWriter -> {
byte mask = 0;
if (argumentEntities.isOnlySingleEntity()) {
if (argumentEntity.isOnlySingleEntity()) {
mask += 1;
}
if (argumentEntities.isOnlyPlayers()) {
if (argumentEntity.isOnlyPlayers()) {
mask += 2;
}
packetWriter.writeByte(mask);

View File

@ -1,6 +1,7 @@
package net.minestom.server.command.builder.arguments;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import org.apache.commons.text.StringEscapeUtils;
import org.jetbrains.annotations.NotNull;
/**
@ -19,6 +20,11 @@ public class ArgumentString extends Argument<String> {
@NotNull
@Override
public String parse(@NotNull String input) throws ArgumentSyntaxException {
return staticParse(input);
}
@NotNull
public static String staticParse(@NotNull String input) throws ArgumentSyntaxException {
// Check if value start and end with quote
final char first = input.charAt(0);
final char last = input.charAt(input.length() - 1);
@ -26,26 +32,20 @@ public class ArgumentString extends Argument<String> {
if (!quote)
throw new ArgumentSyntaxException("String argument needs to start and end with quotes", input, QUOTE_ERROR);
// Remove first and last characters (quotes)
input = input.substring(1, input.length() - 1);
// Verify backslashes
for (int i = 1; i < input.length(); i++) {
final char c = input.charAt(i);
if (c == '\"') {
final char lastChar = input.charAt(i - 1);
if (lastChar == '\\') {
continue;
} else if (i == input.length() - 1) {
// Remove first and last characters (quote)
input = input.substring(1, input.length() - 1);
// Remove all backslashes
input = input.replace("\\", "");
return input;
if (lastChar != '\\') {
throw new ArgumentSyntaxException("Non-escaped quote", input, QUOTE_ERROR);
}
}
}
throw new ArgumentSyntaxException("Last quote is escaped", input, QUOTE_ERROR);
return StringEscapeUtils.unescapeJava(input);
}
}

View File

@ -100,8 +100,8 @@ public class ArgumentType {
return new ArgumentFloatRange(id);
}
public static ArgumentEntities Entities(@NotNull String id) {
return new ArgumentEntities(id);
public static ArgumentEntity Entities(@NotNull String id) {
return new ArgumentEntity(id);
}
public static ArgumentItemStack ItemStack(@NotNull String id) {

View File

@ -20,7 +20,7 @@ import java.util.List;
* Represents the target selector argument.
* https://minecraft.gamepedia.com/Commands#Target_selectors
*/
public class ArgumentEntities extends Argument<EntityFinder> {
public class ArgumentEntity extends Argument<EntityFinder> {
private static final int SUCCESS = 0;
@ -49,16 +49,16 @@ public class ArgumentEntities extends Argument<EntityFinder> {
private boolean onlySingleEntity;
private boolean onlyPlayers;
public ArgumentEntities(String id) {
public ArgumentEntity(String id) {
super(id, true);
}
public ArgumentEntities singleEntity(boolean singleEntity) {
public ArgumentEntity singleEntity(boolean singleEntity) {
this.onlySingleEntity = singleEntity;
return this;
}
public ArgumentEntities onlyPlayers(boolean onlyPlayers) {
public ArgumentEntity onlyPlayers(boolean onlyPlayers) {
this.onlyPlayers = onlyPlayers;
return this;
}

View File

@ -3,13 +3,11 @@ package demo.commands;
import net.minestom.server.command.CommandSender;
import net.minestom.server.command.builder.Arguments;
import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.arguments.Argument;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.command.builder.arguments.minecraft.ArgumentEntities;
import net.minestom.server.entity.Entity;
import net.minestom.server.command.builder.arguments.minecraft.ArgumentEntity;
import net.minestom.server.utils.entity.EntityFinder;
import java.util.List;
public class EntitySelectorCommand extends Command {
public EntitySelectorCommand() {
@ -17,16 +15,17 @@ public class EntitySelectorCommand extends Command {
setDefaultExecutor((sender, args) -> System.out.println("DEFAULT"));
ArgumentEntities argumentEntities = ArgumentType.Entities("entities");
Argument test = ArgumentType.String("test");
setArgumentCallback((sender, exception) -> exception.printStackTrace(), argumentEntities);
ArgumentEntity argumentEntity = ArgumentType.Entities("entities");
addSyntax(this::executor, argumentEntities);
setArgumentCallback((sender, exception) -> exception.printStackTrace(), argumentEntity);
addSyntax(this::executor, test);
}
private void executor(CommandSender commandSender, Arguments arguments) {
EntityFinder query = arguments.getEntities("entities");
System.out.println("SUCCESS COMMAND");
System.out.println("test "+arguments.getString("test"));
}
}