Skip to content

Commit b66f7aa

Browse files
committed
Added basic support for command sender arguments
1 parent d61ebd7 commit b66f7aa

18 files changed

+291
-93
lines changed

src/main/java/fr/zcraft/quartzlib/components/commands/ArgumentTypeHandlerCollection.java

Lines changed: 0 additions & 52 deletions
This file was deleted.

src/main/java/fr/zcraft/quartzlib/components/commands/ArgumentTypeHandler.java renamed to src/main/java/fr/zcraft/quartzlib/components/commands/ArgumentTypeWrapper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3-
class ArgumentTypeHandler<T> {
3+
class ArgumentTypeWrapper<T> {
44
private final Class<T> resultType;
55
private final ArgumentType<T> typeHandler;
66

7-
public ArgumentTypeHandler(Class<T> resultType, ArgumentType<T> typeHandler) {
7+
public ArgumentTypeWrapper(Class<T> resultType, ArgumentType<T> typeHandler) {
88
this.resultType = resultType;
99
this.typeHandler = typeHandler;
1010
}

src/main/java/fr/zcraft/quartzlib/components/commands/CommandEndpoint.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package fr.zcraft.quartzlib.components.commands;
22

33
import fr.zcraft.quartzlib.components.commands.exceptions.CommandException;
4+
import org.bukkit.command.CommandSender;
45

56
import java.util.ArrayList;
67
import java.util.List;
@@ -13,8 +14,8 @@ class CommandEndpoint extends CommandNode {
1314
}
1415

1516
@Override
16-
void run(Object instance, String[] args) throws CommandException {
17-
this.methods.get(0).run(instance, args);
17+
void run(Object instance, CommandSender sender, String[] args) throws CommandException {
18+
this.methods.get(0).run(instance, sender, args);
1819
}
1920

2021
void addMethod(CommandMethod method) {

src/main/java/fr/zcraft/quartzlib/components/commands/CommandGroup.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package fr.zcraft.quartzlib.components.commands;
22

33
import fr.zcraft.quartzlib.components.commands.exceptions.CommandException;
4+
import org.bukkit.command.CommandSender;
45

56
import java.util.Arrays;
67
import java.util.HashMap;
@@ -13,15 +14,15 @@ class CommandGroup extends CommandNode {
1314

1415
private final Map<String, CommandNode> subCommands = new HashMap<>();
1516

16-
public CommandGroup(Class<?> commandGroupClass, Supplier<?> classInstanceSupplier, String name, ArgumentTypeHandlerCollection typeHandlerCollection) {
17-
this(commandGroupClass, classInstanceSupplier, name, typeHandlerCollection, null);
17+
public CommandGroup(Class<?> commandGroupClass, Supplier<?> classInstanceSupplier, String name, TypeCollection typeCollection) {
18+
this(commandGroupClass, classInstanceSupplier, name, typeCollection, null);
1819
}
1920

20-
public CommandGroup(Class<?> commandGroupClass, Supplier<?> classInstanceSupplier, String name, ArgumentTypeHandlerCollection typeHandlerCollection, CommandGroup parent) {
21+
public CommandGroup(Class<?> commandGroupClass, Supplier<?> classInstanceSupplier, String name, TypeCollection typeCollection, CommandGroup parent) {
2122
super(name, parent);
2223
this.commandGroupClass = commandGroupClass;
2324
this.classInstanceSupplier = classInstanceSupplier;
24-
DiscoveryUtils.getCommandMethods(commandGroupClass, typeHandlerCollection).forEach(this::addMethod);
25+
DiscoveryUtils.getCommandMethods(commandGroupClass, typeCollection).forEach(this::addMethod);
2526
}
2627

2728
public Iterable<CommandNode> getSubCommands () {
@@ -39,15 +40,15 @@ private void addMethod(CommandMethod method) {
3940
endpoint.addMethod(method);
4041
}
4142

42-
void run(String... args) throws CommandException {
43+
void run(CommandSender sender, String... args) throws CommandException {
4344
Object commandObject = classInstanceSupplier.get();
44-
run(commandObject, args);
45+
run(commandObject, sender, args);
4546
}
4647

4748
@Override
48-
void run(Object instance, String[] args) throws CommandException {
49+
void run(Object instance, CommandSender sender, String[] args) throws CommandException {
4950
String commandName = args[0];
5051
CommandNode subCommand = subCommands.get(commandName);
51-
subCommand.run(instance, Arrays.copyOfRange(args, 1, args.length));
52+
subCommand.run(instance, sender, Arrays.copyOfRange(args, 1, args.length));
5253
}
5354
}
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
package fr.zcraft.quartzlib.components.commands;
22

33
import fr.zcraft.quartzlib.components.commands.exceptions.CommandException;
4+
import org.bukkit.command.CommandSender;
45

56
import java.util.HashMap;
67
import java.util.Map;
78
import java.util.function.Supplier;
89

910
public class CommandManager {
1011
private final Map<String, CommandNode> rootCommands = new HashMap<>();
11-
private final ArgumentTypeHandlerCollection typeHandlerCollection = new ArgumentTypeHandlerCollection();
12+
private final TypeCollection typeCollection = new TypeCollection();
1213

1314
public <T> void registerCommand(String name, Class<T> commandType, Supplier<T> commandClassSupplier) {
14-
CommandGroup group = new CommandGroup(commandType, commandClassSupplier, name, typeHandlerCollection);
15+
CommandGroup group = new CommandGroup(commandType, commandClassSupplier, name, typeCollection);
1516
rootCommands.put(name, group);
1617
}
1718

18-
public void run(String commandName, String... args) throws CommandException {
19-
((CommandGroup) rootCommands.get(commandName)).run(args); // TODO
19+
public void run(CommandSender sender, String commandName, String... args) throws CommandException {
20+
((CommandGroup) rootCommands.get(commandName)).run(sender, args); // TODO
2021
}
2122
}

src/main/java/fr/zcraft/quartzlib/components/commands/CommandMethod.java

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,66 @@
11
package fr.zcraft.quartzlib.components.commands;
22

3+
import fr.zcraft.quartzlib.components.commands.attributes.Sender;
34
import fr.zcraft.quartzlib.components.commands.exceptions.ArgumentParseException;
45
import fr.zcraft.quartzlib.components.commands.exceptions.CommandException;
6+
import fr.zcraft.quartzlib.components.commands.exceptions.InvalidSenderException;
7+
import org.bukkit.command.CommandSender;
58

69
import java.lang.reflect.InvocationTargetException;
710
import java.lang.reflect.Method;
8-
import java.util.Arrays;
11+
import java.lang.reflect.Parameter;
12+
import java.util.ArrayList;
13+
import java.util.List;
914

1015
class CommandMethod {
1116
private final Method method;
1217
private final String name;
1318
private final CommandMethodArgument[] arguments;
19+
private final int parameterCount;
20+
private CommandMethodSenderArgument senderArgument = null;
1421

15-
CommandMethod(Method method, ArgumentTypeHandlerCollection typeHandlerCollection) {
22+
CommandMethod(Method method, TypeCollection typeCollection) {
1623
this.method = method;
1724
this.name = method.getName();
1825

19-
arguments = Arrays.stream(method.getParameters())
20-
.map(p -> new CommandMethodArgument(p, typeHandlerCollection))
21-
.toArray(CommandMethodArgument[]::new);
26+
Parameter[] parameters = method.getParameters();
27+
List<CommandMethodArgument> arguments = new ArrayList<>();
28+
for (int i = 0; i < parameters.length; i++) {
29+
Parameter parameter = parameters[i];
30+
if (parameter.isAnnotationPresent(Sender.class)) { // TODO: check for multiple sender arguments
31+
senderArgument = new CommandMethodSenderArgument(parameter, i, typeCollection);
32+
} else {
33+
arguments.add(new CommandMethodArgument(parameter, i, typeCollection));
34+
}
35+
}
36+
37+
this.arguments = arguments.toArray(new CommandMethodArgument[]{});
38+
this.parameterCount = parameters.length;
2239
}
2340

2441
public String getName() {
2542
return name;
2643
}
2744

28-
public void run(Object target, String[] args) throws CommandException {
29-
Object[] parsedArgs = parseArguments(args);
45+
public void run(Object target, CommandSender sender, String[] args) throws CommandException {
46+
Object[] parsedArgs = parseArguments(sender, args);
3047
try {
3148
this.method.invoke(target, parsedArgs);
3249
} catch (IllegalAccessException | InvocationTargetException e) {
3350
e.printStackTrace(); // TODO
3451
}
3552
}
3653

37-
private Object[] parseArguments(String[] args) throws ArgumentParseException {
38-
Object[] parsed = new Object[args.length];
54+
private Object[] parseArguments(CommandSender sender, String[] args) throws ArgumentParseException, InvalidSenderException {
55+
Object[] parsed = new Object[parameterCount];
56+
57+
for (int i = 0; i < arguments.length; i++) {
58+
CommandMethodArgument argument = arguments[i];
59+
parsed[argument.getPosition()] = argument.parse(args[i]);
60+
}
3961

40-
for (int i = 0; i < args.length; i++) {
41-
parsed[i] = arguments[i].parse(args[i]);
62+
if (this.senderArgument != null) {
63+
parsed[this.senderArgument.getPosition()] = this.senderArgument.parse(sender);
4264
}
4365

4466
return parsed;

src/main/java/fr/zcraft/quartzlib/components/commands/CommandMethodArgument.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@
66

77
public class CommandMethodArgument {
88
private final Parameter parameter;
9-
private final ArgumentTypeHandler<?> typeHandler;
9+
private final int position;
10+
private final ArgumentTypeWrapper<?> typeHandler;
1011

11-
public CommandMethodArgument(Parameter parameter, ArgumentTypeHandlerCollection typeHandlerCollection) {
12+
public CommandMethodArgument(Parameter parameter, int position, TypeCollection typeCollection) {
1213
this.parameter = parameter;
13-
this.typeHandler = typeHandlerCollection.findTypeHandler(parameter.getType()).get(); // FIXME: handle unknown types
14+
this.position = position;
15+
this.typeHandler = typeCollection.findArgumentType(parameter.getType()).get(); // FIXME: handle unknown types
1416
}
1517

1618
public Object parse(String raw) throws ArgumentParseException {
1719
return this.typeHandler.getTypeHandler().parse(raw);
1820
}
21+
22+
public int getPosition() {
23+
return position;
24+
}
1925
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package fr.zcraft.quartzlib.components.commands;
2+
3+
import fr.zcraft.quartzlib.components.commands.exceptions.ArgumentParseException;
4+
import fr.zcraft.quartzlib.components.commands.exceptions.InvalidSenderException;
5+
import org.bukkit.command.CommandSender;
6+
7+
import java.lang.reflect.Parameter;
8+
9+
public class CommandMethodSenderArgument {
10+
private final Parameter parameter;
11+
private final int position;
12+
private final SenderTypeWrapper<?> typeHandler;
13+
14+
public CommandMethodSenderArgument(Parameter parameter, int position, TypeCollection typeCollection) {
15+
this.parameter = parameter;
16+
this.position = position;
17+
this.typeHandler = typeCollection.findSenderType(parameter.getType()).get(); // FIXME: handle unknown types
18+
}
19+
20+
public Object parse(CommandSender raw) throws InvalidSenderException {
21+
return this.typeHandler.getTypeHandler().parse(raw);
22+
}
23+
24+
public int getPosition() {
25+
return position;
26+
}
27+
}

src/main/java/fr/zcraft/quartzlib/components/commands/CommandNode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package fr.zcraft.quartzlib.components.commands;
22

33
import fr.zcraft.quartzlib.components.commands.exceptions.CommandException;
4+
import org.bukkit.command.CommandSender;
45

56
abstract class CommandNode {
67
private final String name;
@@ -19,5 +20,5 @@ public CommandGroup getParent() {
1920
return parent;
2021
}
2122

22-
abstract void run(Object instance, String[] args) throws CommandException;
23+
abstract void run(Object instance, CommandSender sender, String[] args) throws CommandException;
2324
}

src/main/java/fr/zcraft/quartzlib/components/commands/DiscoveryUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
import java.util.stream.Stream;
1010

1111
abstract class DiscoveryUtils {
12-
public static Stream<CommandMethod> getCommandMethods(Class<?> commandGroupClass, ArgumentTypeHandlerCollection typeHandlerCollection) {
12+
public static Stream<CommandMethod> getCommandMethods(Class<?> commandGroupClass, TypeCollection typeCollection) {
1313
return Arrays.stream(commandGroupClass.getDeclaredMethods())
1414
.filter(m -> Modifier.isPublic(m.getModifiers()) && !Modifier.isStatic(m.getModifiers()))
15-
.map((Method method) -> new CommandMethod(method, typeHandlerCollection));
15+
.map((Method method) -> new CommandMethod(method, typeCollection));
1616
}
1717

1818
public static Supplier<?> getClassConstructorSupplier (Class<?> commandGroupClass) {

0 commit comments

Comments
 (0)