001package com.mrivanplays.commandworker.bukkit.internal;
002
003import com.mojang.brigadier.exceptions.CommandSyntaxException;
004import com.mrivanplays.commandworker.core.LiteralNode;
005import com.mrivanplays.commandworker.core.RegisteredCommand;
006import com.mrivanplays.commandworker.core.argument.Argument;
007import com.mrivanplays.commandworker.core.argument.parser.ArgumentHolder;
008import java.util.Arrays;
009import java.util.List;
010import org.bukkit.ChatColor;
011import org.bukkit.command.CommandSender;
012
013public class BukkitBridgeCommand extends org.bukkit.command.Command {
014
015  private final RegisteredCommand<CommandSender> command;
016
017  public BukkitBridgeCommand(RegisteredCommand<CommandSender> command, String[] aliases) {
018    super(
019        aliases[0],
020        "",
021        command.getCommandStructure().buildUsage(aliases[0]),
022        Arrays.asList(Arrays.copyOfRange(aliases, 1, aliases.length)));
023    this.command = command;
024  }
025
026  @Override
027  public boolean testPermissionSilent(CommandSender sender) {
028    return command.hasPermission(sender);
029  }
030
031  @Override
032  public boolean execute(CommandSender sender, String commandLabel, String[] args) {
033    LiteralNode structure = command.getCommandStructure();
034    ArgumentHolder holder = new ArgumentHolder(String.join(" ", args), structure);
035    if (args.length == 0 && structure.shouldExecuteCommand()) {
036      return executeCommand(sender, commandLabel, holder);
037    } else if (args.length == 0) {
038      sender.sendMessage(
039          ChatColor.RED
040              + CommandSyntaxException.BUILT_IN_EXCEPTIONS
041                  .dispatcherUnknownCommand()
042                  .create()
043                  .getMessage());
044      return true;
045    }
046    Argument argument = holder.getLastArgument();
047    if (argument.shouldExecuteCommand()) {
048      return executeCommand(sender, commandLabel, holder);
049    } else {
050      sender.sendMessage(
051          ChatColor.RED
052              + CommandSyntaxException.BUILT_IN_EXCEPTIONS
053                  .dispatcherUnknownCommand()
054                  .create()
055                  .getMessage());
056      return true;
057    }
058  }
059
060  private boolean executeCommand(CommandSender sender, String label, ArgumentHolder args) {
061    try {
062      return command.getCommand().execute(sender, label, args);
063    } catch (CommandSyntaxException e) {
064      sender.sendMessage(ChatColor.RED + e.getMessage());
065      return true;
066    }
067  }
068
069  @Override
070  public List<String> tabComplete(CommandSender sender, String alias, String[] args)
071      throws IllegalArgumentException {
072    return command.getCommandStructure().completeToStringList(args);
073  }
074}