/* This file is a part of the SteamWar software. Copyright (C) 2020 SteamWar.de-Serverteam This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.steamwar.bausystem.commands; import de.steamwar.bausystem.tracer.record.RecordStateMachine; import de.steamwar.bausystem.tracer.record.RecordStatus; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.BiPredicate; public class CommandTraceTabCompleter implements TabCompleter { private static List tabCompletes = new ArrayList<>(); static { tabCompletes.add(new TabComplete((player, args) -> args.length == 1 && (RecordStateMachine.getRecordStatus() == RecordStatus.IDLE || RecordStateMachine.getRecordStatus() == RecordStatus.IDLE_AUTO), "start")); tabCompletes.add(new TabComplete((player, args) -> args.length == 1 && (RecordStateMachine.getRecordStatus() != RecordStatus.IDLE && RecordStateMachine.getRecordStatus() != RecordStatus.IDLE_AUTO), "stop")); tabCompletes.add(new TabComplete((player, args) -> args.length == 1, "toggleauto", "auto", "show", "hide", "delete", "clear")); tabCompletes.add(new TabComplete((player, args) -> args.length == 2 && args[0].equalsIgnoreCase("show"), "nowater", "basic", "advanced", "advanced-nowater")); } @Override public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { if(!(sender instanceof Player)) return new ArrayList<>(); return tracerTabComplete((Player) sender, args); } private List tracerTabComplete(Player player, String[] args) { List tabComplete = new ArrayList<>(); for (TabComplete tab : tabCompletes) { if (tab.test(player, args)) tabComplete.addAll(Arrays.asList(tab.getTabCompletes())); } return manageList(tabComplete, args); } private List manageList(List strings, String[] args) { for (int i = strings.size() - 1; i >= 0; i--) { if (!strings.get(i).startsWith(args[args.length - 1])) strings.remove(i); } return strings; } private static class TabComplete { private BiPredicate function; private String[] tabCompletes; private TabComplete(BiPredicate function, String... tabCompletes) { this.function = function; this.tabCompletes = tabCompletes; } public boolean test(Player player, String[] args) { return function.test(player, args); } public String[] getTabCompletes() { return tabCompletes; } } }