package net.anxuiz.tourney.command; import java.util.Arrays; import javax.inject.Singleton; import com.google.common.base.Preconditions; import com.sk89q.minecraft.util.commands.ChatColor; import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandException; import com.sk89q.minecraft.util.commands.CommandPermissions; import com.sk89q.minecraft.util.commands.Console; import com.sk89q.minecraft.util.commands.NestedCommand; import net.anxuiz.tourney.ReadyManager; import net.anxuiz.tourney.Tourney; import net.anxuiz.tourney.TourneyPermissions; import net.anxuiz.tourney.TourneyState; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import tc.oc.commons.core.commands.Commands; import tc.oc.commons.core.commands.NestedCommands; import tc.oc.pgm.commands.CommandUtils; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchPlayer; import tc.oc.pgm.match.Party; import static tc.oc.commons.bukkit.commands.CommandUtils.assertPermission; @Singleton public class TourneyCommands implements NestedCommands { @Command( aliases = {"ready"}, desc = "Indicates that the executing team is ready.", min = 0, max = 0 ) @CommandPermissions(TourneyPermissions.READY) public static void ready(final CommandContext args, final CommandSender sender) throws CommandException { Tourney plugin = Tourney.get(); if (!(plugin.getState().equals(TourneyState.ENABLED_WAITING_FOR_READY))) { throw new CommandException("This match is not in a ready-able state."); } final Match match = CommandUtils.getMatch(sender); final Party party = match.player(sender) .map(MatchPlayer::getParty) .orElse(match.getDefaultParty()); if(party.isObservingType()) { assertPermission(sender, TourneyPermissions.READY_OBSERVER); } ReadyManager readyManager = Preconditions.checkNotNull(plugin.getMatchManager(), "Match manager").getReadyManager(); int minPlayers = plugin.getTournament().min_players_per_match(); int presentPlayers = party.getPlayers().size(); if (party.isParticipatingType() && minPlayers > presentPlayers) { throw new CommandException("You need at least " + (minPlayers - presentPlayers) + " more players present to ready your team."); } else { if (!readyManager.isReady(party)) { readyManager.markReady(party); } else { throw new CommandException("Your team is already ready."); } } } @Command( aliases = {"unready"}, desc = "Indicates that the executing team is no longer ready.", min = 0, max = 0 ) @CommandPermissions(TourneyPermissions.READY) public static void unready(final CommandContext args, final CommandSender sender) throws CommandException { if (!(sender instanceof Player)) throw new CommandException("You must be a player to use this command."); Tourney plugin = Tourney.get(); if (!(Arrays.asList(TourneyState.ENABLED_STARTING, TourneyState.ENABLED_WAITING_FOR_READY).contains(plugin.getState()))) { throw new CommandException("This match is not in an un-ready-able state."); } MatchPlayer player = CommandUtils.senderToMatchPlayer(sender); Party party = player.getParty(); if(party.isObservingType()) { assertPermission(sender, TourneyPermissions.READY_OBSERVER); } ReadyManager readyManager = Preconditions.checkNotNull(plugin.getMatchManager(), "Match manager").getReadyManager(); if (readyManager.isReady(party)) { readyManager.markNotReady(party); } else { throw new CommandException("Your team is not ready."); } } @Command( aliases = {"invalidate", "nosave", "norecord"}, desc = "Indicates that the current match should not be saved to the database.", min = 0, max = 0, flags = "c" ) @Console @CommandPermissions("tourney.invalidate") public static void invalidate(final CommandContext args, final CommandSender sender) throws CommandException { Tourney plugin = Tourney.get(); if (!Arrays.asList(TourneyState.ENABLED_RUNNING, TourneyState.ENABLED_FINISHED).contains(plugin.getState())) { throw new CommandException("This match may not be invalidated at this time."); } if (plugin.isRecordQueued()) { if (args.hasFlag('c')) { plugin.setRecordQueued(false); sender.sendMessage(ChatColor.YELLOW + "Match successfully invalidated."); } else { throw new CommandException("Match is eligible for invalidation. Re-run command with -c to confirm. Invalidation may not be reversed."); } } else { throw new CommandException("This match is not queued to be recorded."); } } @Singleton public static class TourneyParentCommand implements Commands { @Command( aliases = {"tourney", "tournament", "tm"}, desc = "Tournament-related commands" ) @NestedCommand({TourneyCommands.class, TeamCommands.class, MapSelectionCommands.MapSelectionParentCommand.class}) public void tourneyParentCommand(final CommandContext args, final CommandSender sender) { // never executed } } }