package tc.oc.pgm.commands; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Nonnull; import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandException; import org.bukkit.command.CommandSender; import tc.oc.commons.core.formatting.StringUtils; import tc.oc.pgm.PGM; import tc.oc.pgm.PGMTranslations; import tc.oc.pgm.features.FeatureDefinition; import tc.oc.pgm.map.MapLibrary; import tc.oc.pgm.map.PGMMap; import tc.oc.pgm.match.Competitor; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchModule; import tc.oc.pgm.match.MatchPlayer; import tc.oc.pgm.rotation.RotationManager; import tc.oc.pgm.rotation.RotationState; public class CommandUtils { public static List<String> completeMapName(String prefix) { return StringUtils.complete(prefix, PGM.get().getMapLibrary().getMapNames()); } public static PGMMap getMap(String search) { final MapLibrary library = PGM.get().getMapLibrary(); PGMMap map = library.getMapByNameOrId(search).orElse(null); if(map != null) return map; final String name = StringUtils.bestFuzzyMatch(search, library.getMapNames(), 0.9); return name == null ? null : library.getMapByNameOrId(name).orElse(null); } public static PGMMap getMap(String search, CommandSender sender) throws CommandException { PGMMap map; if((map = getMap(search)) == null) { throw new CommandException(PGMTranslations.get().t("command.mapNotFound", sender)); } return map; } public static Match getMatch(CommandSender sender) throws CommandException { Match match = PGM.getMatchManager().getCurrentMatch(sender); if(match == null) { throw new CommandException("Command must be used in the context of a match"); } return match; } public static <T extends MatchModule> T getMatchModule(Class<T> klass, CommandSender sender) throws CommandException { T mm = getMatch(sender).getMatchModule(klass); if(mm == null) { throw new CommandException(PGMTranslations.get().t("command.moduleNotFound", sender, klass.getSimpleName())); } return mm; } public static Competitor getCompetitor(String search, CommandSender sender) throws CommandException { Match match = getMatch(sender); Map<String, Competitor> byName = new HashMap<>(match.getCompetitors().size()); for(Competitor competitor : match.getCompetitors()) { byName.put(competitor.getName(sender), competitor); } Competitor competitor = StringUtils.bestFuzzyMatch(search, byName, 0.9); if(competitor == null) { throw new CommandException(PGMTranslations.get().t("command.competitorNotFound", sender)); } return competitor; } public static @Nonnull RotationState getRotation(String search, CommandSender sender) throws CommandException { RotationManager manager = PGM.getMatchManager().getRotationManager(); RotationState rotation = search != null ? manager.getRotation(search) : manager.getRotation(); if(rotation == null) { throw new CommandException(PGMTranslations.get().t("command.rotationNotFound", sender)); } return rotation; } public static <T extends FeatureDefinition> T getFeatureDefinition(String id, CommandSender sender, Class<T> type) throws CommandException { Match match = getMatch(sender); T feature = match.getModuleContext().features().get(id, type); if(feature == null) { throw new CommandException("No " + type.getSimpleName() + " with ID " + id); } return feature; } public static MatchPlayer senderToMatchPlayer(CommandSender sender) throws CommandException { return getMatch(sender).getPlayer(tc.oc.commons.bukkit.commands.CommandUtils.senderToPlayer(sender)); } public static MatchPlayer getMatchPlayerOrSelf(CommandContext args, CommandSender sender, int index) throws CommandException { return getMatch(sender).getPlayer(tc.oc.commons.bukkit.commands.CommandUtils.getPlayerOrSelf(args, sender, index)); } public static MatchPlayer getMatchPlayer(CommandContext args, CommandSender sender, int index) throws CommandException { return getMatch(sender).getPlayer(tc.oc.commons.bukkit.commands.CommandUtils.getPlayer(args, sender, index)); } public static MatchPlayer findSingleMatchPlayer(CommandContext args, CommandSender sender, int index) throws CommandException { return getMatch(sender).getPlayer(tc.oc.commons.bukkit.commands.CommandUtils.findOnlinePlayer(args, sender, index)); } }