|
| 1 | +package me.marioogg.command.bungee.bukkit; |
| 2 | + |
| 3 | +import lombok.Getter; |
| 4 | +import lombok.SneakyThrows; |
| 5 | +import me.marioogg.command.bungee.node.BungeeCommandNode; |
| 6 | +import me.marioogg.command.bungee.parameter.BungeeParamProcessor; |
| 7 | +import me.marioogg.command.help.HelpNode; |
| 8 | +import me.marioogg.command.node.ArgumentNode; |
| 9 | +import net.md_5.bungee.api.ChatColor; |
| 10 | +import net.md_5.bungee.api.CommandSender; |
| 11 | +import net.md_5.bungee.api.chat.TextComponent; |
| 12 | +import net.md_5.bungee.api.plugin.Command; |
| 13 | +import net.md_5.bungee.api.plugin.TabExecutor; |
| 14 | + |
| 15 | +import java.util.*; |
| 16 | +import java.util.stream.Collectors; |
| 17 | + |
| 18 | +public class BungeeRawCommand extends Command implements TabExecutor { |
| 19 | + @Getter private static final HashMap<String, BungeeRawCommand> commands = new HashMap<>(); |
| 20 | + |
| 21 | + public BungeeRawCommand(String root) { |
| 22 | + super(root); |
| 23 | + commands.put(root.toLowerCase(), this); |
| 24 | + me.marioogg.command.bungee.BungeeCommandHandler.getPlugin().getProxy().getPluginManager().registerCommand( |
| 25 | + me.marioogg.command.bungee.BungeeCommandHandler.getPlugin(), this); |
| 26 | + } |
| 27 | + |
| 28 | + @SneakyThrows |
| 29 | + @Override |
| 30 | + public void execute(CommandSender sender, String[] args) { |
| 31 | + List<BungeeCommandNode> sortedNodes = BungeeCommandNode.getNodes().stream() |
| 32 | + .sorted(Comparator.comparingInt(node -> node.getMatchProbability(sender, getName(), args, false))) |
| 33 | + .collect(Collectors.toList()); |
| 34 | + |
| 35 | + BungeeCommandNode node = sortedNodes.get(sortedNodes.size() - 1); |
| 36 | + |
| 37 | + if (node.getMatchProbability(sender, getName(), args, false) < 90) { |
| 38 | + if (node.getHelpNodes().isEmpty()) { |
| 39 | + node.sendUsageMessage(sender); |
| 40 | + return; |
| 41 | + } |
| 42 | + |
| 43 | + HelpNode helpNode = node.getHelpNodes().get(0); |
| 44 | + |
| 45 | + if (!helpNode.getPermission().isEmpty() && !sender.hasPermission(helpNode.getPermission())) { |
| 46 | + sender.sendMessage(new TextComponent(ChatColor.RED + "I'm sorry, although you do not have permission to execute this command.")); |
| 47 | + return; |
| 48 | + } |
| 49 | + |
| 50 | + helpNode.getMethod().invoke(helpNode.getParentClass(), sender); |
| 51 | + return; |
| 52 | + } |
| 53 | + |
| 54 | + node.execute(sender, args); |
| 55 | + } |
| 56 | + |
| 57 | + @Override |
| 58 | + public Iterable<String> onTabComplete(CommandSender sender, String[] args) { |
| 59 | + try { |
| 60 | + List<BungeeCommandNode> sortedNodes = BungeeCommandNode.getNodes().stream() |
| 61 | + .sorted(Comparator.comparingInt(node -> node.getMatchProbability(sender, getName(), args, true))) |
| 62 | + .collect(Collectors.toList()); |
| 63 | + |
| 64 | + BungeeCommandNode node = sortedNodes.get(sortedNodes.size() - 1); |
| 65 | + |
| 66 | + if (!node.isAllowComplete()) return new ArrayList<>(); |
| 67 | + |
| 68 | + if (node.getMatchProbability(sender, getName(), args, true) >= 50) { |
| 69 | + int extraLength = node.getNames().get(0).split(" ").length - 1; |
| 70 | + int arg = (args.length - extraLength) - 1; |
| 71 | + |
| 72 | + if (arg < 0 || node.getParameters().size() < arg + 1) return new ArrayList<>(); |
| 73 | + |
| 74 | + ArgumentNode argumentNode = node.getParameters().get(arg); |
| 75 | + return new BungeeParamProcessor(argumentNode, args[args.length - 1], sender).getTabComplete(); |
| 76 | + } |
| 77 | + |
| 78 | + return sortedNodes.stream() |
| 79 | + .filter(sortedNode -> sortedNode.getPermission().isEmpty() || sender.hasPermission(sortedNode.getPermission())) |
| 80 | + .map(sortedNode -> sortedNode.getNames().stream() |
| 81 | + .map(name -> name.split(" ")) |
| 82 | + .filter(splitName -> splitName[0].equalsIgnoreCase(getName())) |
| 83 | + .filter(splitName -> splitName.length > args.length) |
| 84 | + .map(splitName -> splitName[args.length]) |
| 85 | + .collect(Collectors.toList())) |
| 86 | + .flatMap(List::stream) |
| 87 | + .filter(name -> name.toLowerCase().startsWith(args[args.length - 1].toLowerCase())) |
| 88 | + .collect(Collectors.toList()); |
| 89 | + } catch (Exception e) { |
| 90 | + e.printStackTrace(); |
| 91 | + return new ArrayList<>(); |
| 92 | + } |
| 93 | + } |
| 94 | +} |
| 95 | + |
0 commit comments