mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-28 14:37:31 +02:00
Improve ArgumentString parsing + add apache commons-text dependency
This commit is contained in:
parent
8871cf16c0
commit
d0bf6d9f0d
@ -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'
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
@ -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"));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user