Add custom command builder and help text test
This commit is contained in:
parent
a26d031ce2
commit
5f7f3d7747
3 changed files with 60 additions and 15 deletions
|
@ -10,6 +10,7 @@ import com.mojang.brigadier.CommandDispatcher;
|
||||||
import com.mojang.brigadier.ParseResults;
|
import com.mojang.brigadier.ParseResults;
|
||||||
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||||
import com.mojang.brigadier.context.CommandContext;
|
import com.mojang.brigadier.context.CommandContext;
|
||||||
|
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.val;
|
import lombok.val;
|
||||||
|
@ -30,11 +31,11 @@ import java.text.ParseException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static com.mojang.brigadier.builder.LiteralArgumentBuilder.literal;
|
import static buttondevteam.lib.chat.CoreCommandBuilder.literal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The method name is the subcommand, use underlines (_) to add further subcommands.
|
* The method name is the subcommand, use underlines (_) to add further subcommands.
|
||||||
|
@ -288,19 +289,19 @@ public abstract class Command2<TC extends ICommand2<TP>, TP extends Command2Send
|
||||||
|
|
||||||
public abstract void registerCommand(TC command);
|
public abstract void registerCommand(TC command);
|
||||||
|
|
||||||
protected List<SubcommandData<TC>> registerCommand(TC command, char commandChar) {
|
protected LiteralCommandNode<TP> registerCommand(TC command, char commandChar) {
|
||||||
return registerCommand(command, dispatcher.register(getCommandNode(command)), commandChar);
|
return dispatcher.register(getCommandNode(command));
|
||||||
}
|
}
|
||||||
|
|
||||||
private LiteralArgumentBuilder<TP> getCommandNode(TC command) {
|
private LiteralArgumentBuilder<TP> getCommandNode(TC command) {
|
||||||
var path = command.getCommandPath().split(" ");
|
var path = command.getCommandPath().split(" ");
|
||||||
if (path.length == 0)
|
if (path.length == 0)
|
||||||
throw new IllegalArgumentException("Attempted to register a command with no command path!");
|
throw new IllegalArgumentException("Attempted to register a command with no command path!");
|
||||||
LiteralArgumentBuilder<TP> inner = literal(path[0]);
|
CoreCommandBuilder<TP> inner = literal(path[0]);
|
||||||
var outer = inner;
|
var outer = inner;
|
||||||
for (int i = path.length - 1; i >= 0; i--) {
|
for (int i = path.length - 1; i >= 0; i--) {
|
||||||
LiteralArgumentBuilder<TP> literal = literal(path[i]);
|
CoreCommandBuilder<TP> literal = literal(path[i]);
|
||||||
outer = literal.executes(this::executeHelpText).then(outer);
|
outer = (CoreCommandBuilder<TP>) literal.executes(this::executeHelpText).then(outer);
|
||||||
}
|
}
|
||||||
var subcommandMethods = command.getClass().getMethods();
|
var subcommandMethods = command.getClass().getMethods();
|
||||||
for (var subcommandMethod : subcommandMethods) {
|
for (var subcommandMethod : subcommandMethods) {
|
||||||
|
@ -312,23 +313,25 @@ public abstract class Command2<TC extends ICommand2<TP>, TP extends Command2Send
|
||||||
}
|
}
|
||||||
|
|
||||||
private LiteralArgumentBuilder<TP> getSubcommandNode(Method method, String[] helpText) {
|
private LiteralArgumentBuilder<TP> getSubcommandNode(Method method, String[] helpText) {
|
||||||
LiteralArgumentBuilder<TP> ret = literal(method.getName());
|
CoreCommandBuilder<TP> ret = literal(method.getName());
|
||||||
return ret.executes(this::executeCommand); // TODO: CoreCommandNode helpText
|
return ret.helps(helpText).executes(this::executeCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
private CoreArgumentBuilder<TP, ?> getCommandParameters(Parameter[] parameters) {
|
private CoreArgumentBuilder<TP, ?> getCommandParameters(Parameter[] parameters) {
|
||||||
|
return null; // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
private int executeHelpText(CommandContext<TP> context) {
|
private int executeHelpText(CommandContext<TP> context) {
|
||||||
|
System.out.println("Nodes:\n" + context.getNodes().stream().map(node -> node.getNode().getName() + "@" + node.getRange()).collect(Collectors.joining("\n")));
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int executeCommand(CommandContext<TP> context) {
|
private int executeCommand(CommandContext<TP> context) {
|
||||||
|
System.out.println("Execute command");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<SubcommandData<TC>> registerCommand(TC command, @SuppressWarnings("SameParameterValue") char commandChar) {
|
/*protected List<SubcommandData<TC>> registerCommand(TC command, @SuppressWarnings("SameParameterValue") char commandChar) {
|
||||||
this.commandChar = commandChar;
|
this.commandChar = commandChar;
|
||||||
Method mainMethod = null;
|
Method mainMethod = null;
|
||||||
boolean nosubs = true;
|
boolean nosubs = true;
|
||||||
|
@ -381,7 +384,7 @@ public abstract class Command2<TC extends ICommand2<TP>, TP extends Command2Send
|
||||||
scmd.helpText = scmdHelp;
|
scmd.helpText = scmdHelp;
|
||||||
}
|
}
|
||||||
return addedSubcommands;
|
return addedSubcommands;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
private String[] getParameterHelp(Method method, String[] ht, String subcommand, String[] parameters) {
|
private String[] getParameterHelp(Method method, String[] ht, String subcommand, String[] parameters) {
|
||||||
val str = method.getDeclaringClass().getResourceAsStream("/commands.yml");
|
val str = method.getDeclaringClass().getResourceAsStream("/commands.yml");
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
package buttondevteam.lib.chat;
|
||||||
|
|
||||||
|
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||||
|
import com.mojang.brigadier.tree.CommandNode;
|
||||||
|
|
||||||
|
public class CoreCommandBuilder<S> extends LiteralArgumentBuilder<S> {
|
||||||
|
private String[] helpText;
|
||||||
|
|
||||||
|
protected CoreCommandBuilder(String literal) {
|
||||||
|
super(literal);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected CoreCommandBuilder<S> getThis() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <S> CoreCommandBuilder<S> literal(String name) {
|
||||||
|
return new CoreCommandBuilder<>(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CoreCommandBuilder<S> helps(String[] helpText) {
|
||||||
|
this.helpText = helpText;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CoreCommandNode<S> build() {
|
||||||
|
var result = new CoreCommandNode<>(this.getLiteral(), this.getCommand(), this.getRequirement(), this.getRedirect(), this.getRedirectModifier(), this.isFork(), helpText);
|
||||||
|
|
||||||
|
for (CommandNode<S> node : this.getArguments()) {
|
||||||
|
result.addChild(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,11 +4,16 @@ import com.mojang.brigadier.Command;
|
||||||
import com.mojang.brigadier.RedirectModifier;
|
import com.mojang.brigadier.RedirectModifier;
|
||||||
import com.mojang.brigadier.tree.CommandNode;
|
import com.mojang.brigadier.tree.CommandNode;
|
||||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
public class CoreCommandNode<T> extends LiteralCommandNode<T> {
|
public class CoreCommandNode<T> extends LiteralCommandNode<T> {
|
||||||
public CoreCommandNode(String literal, Command<T> command, Predicate<T> requirement, CommandNode<T> redirect, RedirectModifier<T> modifier, boolean forks, String helpText) {
|
@Getter
|
||||||
|
private final String[] helpText;
|
||||||
|
|
||||||
|
public CoreCommandNode(String literal, Command<T> command, Predicate<T> requirement, CommandNode<T> redirect, RedirectModifier<T> modifier, boolean forks, String[] helpText) {
|
||||||
super(literal, command, requirement, redirect, modifier, forks);
|
super(literal, command, requirement, redirect, modifier, forks);
|
||||||
|
this.helpText = helpText;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue