package com.massivecraft.factions.cmd; import com.massivecraft.factions.FactionsPlugin; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; import com.mojang.brigadier.tree.CommandNode; import me.lucko.commodore.Commodore; import me.lucko.commodore.CommodoreProvider; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; import java.util.Map; public class BrigadierManager { public Commodore commodore; public LiteralArgumentBuilder brigadier = LiteralArgumentBuilder.literal("factions"); public BrigadierManager() { commodore = CommodoreProvider.getCommodore(FactionsPlugin.getInstance()); } public void build() { commodore.register(brigadier.build()); // Add factions children to f alias LiteralArgumentBuilder fLiteral = LiteralArgumentBuilder.literal("f"); for (CommandNode node : brigadier.getArguments()) fLiteral.then(node); commodore.register(fLiteral.build()); } public void addSubCommand(FCommand subCommand) { // Register brigadier to all command aliases for (String alias : subCommand.aliases) { LiteralArgumentBuilder literal = LiteralArgumentBuilder.literal(alias); if (subCommand.requirements.brigadier != null) { // If the requirements explicitly provide a BrigadierProvider then use it Class brigadierProvider = subCommand.requirements.brigadier; try { Constructor constructor = brigadierProvider.getDeclaredConstructor(subCommand.getClass()); brigadier.then(constructor.newInstance(subCommand).get(literal)); } catch (Exception e) { e.printStackTrace(); } } else { // Generate our own based on args - quite ugly // We create an orderly stack of all args, required and optional, format them differently List> stack = new ArrayList<>(); for (String required : subCommand.requiredArgs) { // Simply add the arg name as required stack.add(RequiredArgumentBuilder.argument(required, StringArgumentType.word())); } for (Map.Entry optionalEntry : subCommand.optionalArgs.entrySet()) { RequiredArgumentBuilder optional; // Optional without default if (optionalEntry.getKey().equalsIgnoreCase(optionalEntry.getValue())) { optional = RequiredArgumentBuilder.argument(":" + optionalEntry.getKey(), StringArgumentType.word()); // Optional with default, explain } else { optional = RequiredArgumentBuilder.argument(optionalEntry.getKey() + "|" + optionalEntry.getValue(), StringArgumentType.word()); } stack.add(optional); } // Reverse the stack and apply .then() RequiredArgumentBuilder previous = null; for (int i = stack.size() - 1; i >= 0; i--) { if (previous == null) { previous = stack.get(i); } else { previous = stack.get(i).then(previous); } } if (previous == null) { brigadier.then(literal); } else { brigadier.then(literal.then(previous)); } } } } }