package tc.oc.pgm.timelimit; import java.time.Duration; import javax.inject.Inject; 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.CommandPermissionsException; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.TranslatableComponent; import org.bukkit.command.CommandSender; import tc.oc.commons.bukkit.chat.Audiences; import tc.oc.commons.bukkit.chat.ComponentRenderers; import tc.oc.commons.bukkit.commands.CommandUtils; import tc.oc.commons.core.chat.Audience; import tc.oc.commons.core.chat.Component; import tc.oc.commons.core.commands.Commands; import tc.oc.commons.core.commands.TranslatableCommandException; import tc.oc.commons.core.formatting.PeriodFormats; import tc.oc.commons.core.util.Comparables; import tc.oc.pgm.PGM; import tc.oc.pgm.match.Match; import tc.oc.pgm.victory.DefaultResult; import tc.oc.pgm.victory.MatchResult; import tc.oc.pgm.victory.VictoryResultParser; public class TimeLimitCommands implements Commands { private final Audiences audiences; @Inject TimeLimitCommands(Audiences audiences) { this.audiences = audiences; } private void sendTimeLimitMessage(CommandSender sender, Duration duration, MatchResult result) { ComponentRenderers.send(sender, new Component(ChatColor.YELLOW) .extra(new TranslatableComponent("timeLimit.commandOutput", new Component(PeriodFormats.formatColonsPrecise(duration), ChatColor.AQUA), result.describeResult()))); } @Command( aliases = {"timelimit", "tl"}, desc = "Start, update, or cancel a time limit", usage = "cancel | [-r result] [duration]", help = "Result can be 'default', 'objectives', 'tie', or the name of a team", flags = "r:", min = 0, max = 1 ) public void timelimit(CommandContext commandContext, CommandSender sender) throws CommandException { Match match = PGM.getMatchManager().getCurrentMatch(sender); TimeLimitMatchModule tlmm = match.getMatchModule(TimeLimitMatchModule.class); TimeLimit existing = tlmm.getTimeLimit(); final Audience audience = audiences.get(sender); String resultString = commandContext.getFlag('r', null); String durationString = commandContext.getString(0, null); if(resultString == null && durationString == null) { if(existing != null) { if(match.isFinished() && tlmm.remaining() != null) { audience.sendMessage(new TranslatableComponent( "timeLimit.matchEndRemaining", new Component(PeriodFormats.formatColonsPrecise(tlmm.remaining()), ChatColor.AQUA)) ); } else { sendTimeLimitMessage(sender, existing.getDuration(), existing.result()); } } else { audience.sendMessage(new TranslatableComponent("timeLimit.none")); } } else { if(!sender.hasPermission("pgm.timelimit")) { throw new CommandPermissionsException(); } if("cancel".equals(durationString)) { if(tlmm.getTimeLimit() != null) { tlmm.setTimeLimit(null); audience.sendMessage(new TranslatableComponent("timeLimit.cancelled")); } else { audience.sendMessage(new TranslatableComponent("timeLimit.none")); } } else { MatchResult result; if(resultString != null) { result = VictoryResultParser.parse(match, resultString); } else if(existing != null) { result = existing.result(); } else { result = new DefaultResult(); } Duration duration; if(durationString != null) { duration = CommandUtils.getDuration(durationString); if(Comparables.greaterThan(duration, TimeLimit.MAX_DURATION)) { throw new TranslatableCommandException("timeLimit.maxDays", TimeLimit.MAX_DURATION.toDays()); } } else if(existing != null) { duration = existing.getDuration(); } else { throw new CommandException("Please specify a duration"); } tlmm.setTimeLimit(new TimeLimit(match, duration, result, true)); tlmm.start(); sendTimeLimitMessage(sender, duration, result); } } } }