Finish CommandNode
Dieser Commit ist enthalten in:
Ursprung
5240ca3bf4
Commit
deb7f71090
@ -21,21 +21,30 @@ package de.steamwar.command;
|
|||||||
|
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.lang.reflect.Parameter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
class CommandNode {
|
class CommandNode {
|
||||||
|
|
||||||
|
private final SWCommand swCommand;
|
||||||
private final TypeMapper<?> typeMapper;
|
private final TypeMapper<?> typeMapper;
|
||||||
private boolean varArg = false;
|
private boolean varArg = false;
|
||||||
private List<CommandNode> commandNodeList = new ArrayList<>();
|
private List<CommandNode> commandNodeList = new ArrayList<>();
|
||||||
private Method executor;
|
private Method executor;
|
||||||
|
|
||||||
CommandNode(TypeMapper<?> typeMapper) {
|
private Predicate<CommandSender> commandSenderPredicate;
|
||||||
|
private Function<CommandSender, Object> commandSenderObjectFunction;
|
||||||
|
|
||||||
|
CommandNode(SWCommand swCommand, TypeMapper<?> typeMapper) {
|
||||||
|
this.swCommand = swCommand;
|
||||||
this.typeMapper = typeMapper;
|
this.typeMapper = typeMapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,8 +53,13 @@ class CommandNode {
|
|||||||
this.varArg = false;
|
this.varArg = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setExecutor(Method method) {
|
public void setExecutor(Method executor) {
|
||||||
|
if (this.executor != null) return;
|
||||||
this.executor = executor;
|
this.executor = executor;
|
||||||
|
|
||||||
|
Parameter parameter = executor.getParameters()[0];
|
||||||
|
commandSenderPredicate = parameter.getType()::isInstance;
|
||||||
|
commandSenderObjectFunction = parameter.getType()::cast;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setVarArg(boolean varArg) {
|
public void setVarArg(boolean varArg) {
|
||||||
@ -77,17 +91,48 @@ class CommandNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean execute(CommandSender commandSender, int index, String[] args) {
|
public boolean execute(CommandSender commandSender, int index, String[] args, List<Object> mappedObjects) {
|
||||||
|
try {
|
||||||
|
Object o;
|
||||||
if (varArg) {
|
if (varArg) {
|
||||||
for (int i = index; i < args.length; i++) {
|
o = Array.newInstance(Object.class, args.length - index);
|
||||||
String[] previousArgs = Arrays.copyOf(args, i);
|
for (int i = 0; i < Array.getLength(o); i++) {
|
||||||
typeMapper.map(commandSender, previousArgs, args[i]);
|
Object current = typeMapper.map(commandSender, Arrays.copyOf(args, index + i), args[index + i]);
|
||||||
|
if (current == null) return false;
|
||||||
|
Array.set(o, i, current);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
o = typeMapper.map(commandSender, Arrays.copyOf(args, index), args[index]);
|
||||||
|
if (o == null) return false;
|
||||||
}
|
}
|
||||||
// if (args.length)
|
mappedObjects.add(o);
|
||||||
|
} catch (Exception e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (index == args.length - 1) {
|
||||||
|
if (executor == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!commandSenderPredicate.test(commandSender)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Object> finalMappedObjects = new ArrayList<>(mappedObjects);
|
||||||
|
finalMappedObjects.add(0, commandSenderObjectFunction.apply(commandSender));
|
||||||
|
|
||||||
|
Object[] objects = finalMappedObjects.toArray(new Object[0]);
|
||||||
|
try {
|
||||||
|
executor.invoke(swCommand, objects);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new SecurityException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return commandNodeList.stream()
|
||||||
|
.map(commandNode -> commandNode.execute(commandSender, index + 1, args, new ArrayList<>(mappedObjects)))
|
||||||
|
.findFirst().orElse(false);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren