001package com.ericlam.mc.bungee.hnmc.commands.caxerx;
002
003import com.ericlam.mc.bungee.hnmc.builders.MessageBuilder;
004import com.ericlam.mc.bungee.hnmc.commands.caxerx.exception.NotExecutableException;
005import com.ericlam.mc.bungee.hnmc.commands.caxerx.functional.AdvCmdExecutor;
006import com.ericlam.mc.bungee.hnmc.commands.caxerx.functional.AdvTabCompleter;
007import com.ericlam.mc.bungee.hnmc.config.MainConfig;
008import com.ericlam.mc.bungee.hnmc.main.HyperNiteMC;
009import net.md_5.bungee.api.ChatColor;
010import net.md_5.bungee.api.CommandSender;
011
012import java.util.List;
013
014/**
015 * 指令節點建造器
016 *
017 * @param <Sender> 發送者指定類別
018 * @author Eric Lam
019 * @see CommandNode
020 */
021public class AdvCommandNodeBuilder<Sender extends CommandSender> {
022
023    private String command;
024    private String permission;
025    private String description;
026    private String placeholder;
027    private CommandNode parent;
028    private String[] alias = new String[0];
029    private AdvTabCompleter<Sender> tabCompleterSender;
030    private AdvCmdExecutor<Sender> cmdExecutorSender;
031
032    /**
033     * @param command 指令
034     */
035    public AdvCommandNodeBuilder(String command) {
036        this.command = command;
037
038    }
039
040    /**
041     * @param permission 權限
042     * @return this
043     */
044    public AdvCommandNodeBuilder<Sender> permission(String permission) {
045        this.permission = permission;
046        return this;
047    }
048
049    /**
050     * @param description 介紹
051     * @return this
052     */
053    public AdvCommandNodeBuilder<Sender> description(String description) {
054        this.description = description;
055        return this;
056    }
057
058    /**
059     * @param placeholder 用法
060     * @return this
061     */
062    public AdvCommandNodeBuilder<Sender> placeholder(String placeholder) {
063        this.placeholder = placeholder;
064        return this;
065    }
066
067    /**
068     * @param parent 父類指令
069     * @return this
070     */
071    public AdvCommandNodeBuilder<Sender> parent(CommandNode parent) {
072        this.parent = parent;
073        return this;
074    }
075
076    /**
077     * 若果是主指令,將會自動從 plugin.yml 添加
078     *
079     * @param alias 縮寫指令
080     * @return this
081     */
082    public AdvCommandNodeBuilder<Sender> alias(String... alias) {
083        this.alias = alias;
084        return this;
085    }
086
087    /**
088     * @param tabCompleter tab 執行
089     * @return this
090     */
091    public AdvCommandNodeBuilder<Sender> tabComplete(AdvTabCompleter<Sender> tabCompleter) {
092        this.tabCompleterSender = tabCompleter;
093        return this;
094    }
095
096    /**
097     * @param cmdExecutor 指令執行
098     * @return this
099     */
100    public AdvCommandNodeBuilder<Sender> execute(AdvCmdExecutor<Sender> cmdExecutor) {
101        this.cmdExecutorSender = cmdExecutor;
102        return this;
103    }
104
105    /**
106     * @return 指令節點
107     * @throws NotExecutableException 指令無法執行
108     */
109    @SuppressWarnings("unchecked")
110    public CommandNode build() {
111        MainConfig config = HyperNiteMC.getAPI().getMainConfig();
112        if (cmdExecutorSender == null) throw new NotExecutableException(command);
113        return new CommandNode(parent, command, permission, description, placeholder, alias) {
114            @Override
115            public void executeCommand(CommandSender sender, List<String> args) {
116                try {
117                    cmdExecutorSender.execute((Sender) sender, args);
118                } catch (ClassCastException e) {
119                    MessageBuilder.sendMessage(sender, config.getPrefix() + ChatColor.RED + "無法使用此指令。");
120                }
121            }
122
123            @Override
124            public List<String> executeTabCompletion(CommandSender sender, List<String> args) {
125                try {
126                    return tabCompleterSender == null ? null : tabCompleterSender.tabComplete((Sender) sender, args);
127                } catch (ClassCastException e) {
128                    MessageBuilder.sendMessage(sender, config.getPrefix() + ChatColor.RED + "無法使用此指令。");
129                }
130                return null;
131            }
132        };
133    }
134
135
136}
137//如何使用
138/*
139class AdvCommandNodeUse{
140    CommandNode getNode(){
141        return new AdvCommandNodeBuilder<Player>("fly")
142                .description("setfly")
143                .execute((sender, args) -> {
144                    sender.setAllowFlight(!sender.getAllowFlight());
145                    sender.sendMessage("You "+(sender.getAllowFlight() ? "can" : "cannot")+" fly now.");
146                    return true;
147                }).build();
148    }
149}
150
151 */
152
153
154