001package com.ericlam.mc.minigames.core.commands;
002
003import com.ericlam.mc.minigames.core.arena.Arena;
004import com.ericlam.mc.minigames.core.exception.arena.create.ArenaNotExistException;
005import com.ericlam.mc.minigames.core.game.GameState;
006import com.ericlam.mc.minigames.core.main.MinigamesCore;
007import com.ericlam.mc.minigames.core.manager.ArenaCreateManager;
008import com.hypernite.mc.hnmc.core.config.MessageGetter;
009import com.hypernite.mc.hnmc.core.main.HyperNiteMC;
010import com.hypernite.mc.hnmc.core.managers.CoreConfig;
011import com.hypernite.mc.hnmc.core.misc.commands.CommandNode;
012import org.apache.commons.lang.Validate;
013import org.bukkit.command.CommandSender;
014import org.bukkit.entity.Player;
015
016import javax.annotation.Nonnull;
017import java.util.Arrays;
018import java.util.LinkedList;
019import java.util.List;
020import java.util.stream.Collectors;
021
022/**
023 * 場地指令接口,用於新增額外場地設置指令是掛接。
024 */
025public abstract class ArenaCommandNode extends CommandNode {
026
027    private final MessageGetter messageGetter;
028
029
030    /**
031     * @param parent      父指令
032     * @param command     指令名稱
033     * @param permission  權限
034     * @param description 描述
035     * @param placeholder 參數
036     * @param alias       別稱
037     */
038    public ArenaCommandNode(CommandNode parent, @Nonnull String command, String permission, @Nonnull String description, String placeholder, String... alias) {
039        super(parent, command, permission, description, placeholder, alias);
040        messageGetter = MinigamesCore.getProperties().getMessageGetter();
041    }
042
043    @Override
044    public boolean executeCommand(@Nonnull CommandSender commandSender, @Nonnull List<String> list) {
045        CoreConfig coreConfig = HyperNiteMC.getAPI().getCoreConfig();
046        String prefix = MinigamesCore.getApi().getGameManager().getGamePrefix();
047        if (!(commandSender instanceof Player)) {
048            commandSender.sendMessage(coreConfig.getPrefix() + coreConfig.getNotPlayer());
049            return true;
050        }
051
052        Player player = (Player) commandSender;
053        final ArenaCreateManager arenaCreateManager = MinigamesCore.getApi().getArenaCreateManager();
054        Validate.notNull(arenaCreateManager, "Arena Create Manager is null");
055
056        if (MinigamesCore.getApi().getGameManager().getGameState() != GameState.STOPPED) {
057            player.sendMessage(prefix + messageGetter.getPure("game-not-stopped"));
058            return true;
059        }
060
061        try {
062            return executeArenaOperation(player, list, arenaCreateManager);
063        } catch (ArenaNotExistException e) {
064            player.sendMessage(prefix + messageGetter.getPure("arena.not-exist").replace("<arena>", e.getArena()));
065            return true;
066        }
067    }
068
069    @Override
070    public List<String> executeTabCompletion(@Nonnull CommandSender commandSender, @Nonnull List<String> list) {
071        if (this.getPlaceholder() == null) return null;
072        String[] placeholders = Arrays.stream(this.getPlaceholder().split(" ")).map(l -> l.replace("<", "").replace(">", "").replace("[", "").replace("]", "")).toArray(String[]::new);
073        List<Integer> arenaTab = new LinkedList<>();
074        List<Integer> warpTab = new LinkedList<>();
075        for (int i = 0; i < placeholders.length; i++) {
076            final String var = placeholders[i];
077            if (var.equalsIgnoreCase("arena")) {
078                arenaTab.add(i);
079            } else if (var.equalsIgnoreCase("warp")) {
080                warpTab.add(i);
081            }
082        }
083        final ArenaCreateManager arenaCreateManager = MinigamesCore.getApi().getArenaCreateManager();
084        Validate.notNull(arenaCreateManager, "Arena Create Manager is null");
085        final int index = list.size() - 1;
086        if (arenaTab.contains(index)) {
087            return arenaCreateManager.getArenaList().stream().map(Arena::getArenaName).collect(Collectors.toList());
088        } else if (warpTab.contains(index)) {
089            final int arenaIndex = index - 1;
090            if (placeholders.length > arenaIndex && placeholders[arenaIndex].equalsIgnoreCase("arena")) {
091                try {
092                    return arenaCreateManager.getWarpList(list.get(arenaIndex));
093                } catch (ArenaNotExistException ignored) {
094                }
095            }
096        }
097        return null;
098    }
099
100    /**
101     * 指令運行
102     *
103     * @param player             指令發送者
104     * @param list               參數
105     * @param arenaCreateManager 場地設置管理器
106     * @return 執行成功
107     * @throws ArenaNotExistException 場地不存在
108     */
109    protected abstract boolean executeArenaOperation(@Nonnull Player player, @Nonnull List<String> list, @Nonnull ArenaCreateManager arenaCreateManager) throws ArenaNotExistException;
110
111
112}