package tc.oc.pgm.modes;
import java.time.Duration;
import java.util.Map;
import java.util.Optional;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
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.NestedCommand;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
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.HeaderComponent;
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.NestedCommands;
import tc.oc.commons.core.formatting.PeriodFormats;
import tc.oc.commons.core.util.Pair;
@Singleton
public class ObjectiveModeCommands implements NestedCommands {
@Singleton
public static class Parent implements Commands {
@Inject ObjectiveModeCommands objectiveModeCommands;
@Command(
aliases = {"mode", "modes"},
desc = "General mode commands",
min = 0,
max = -1
)
@NestedCommand(value = ObjectiveModeCommands.class, executeBody = true)
public void modes(CommandContext args, CommandSender sender) throws CommandException {
objectiveModeCommands.list(args, sender);
}
}
private final Provider<ObjectiveModeManager> manager;
private final Audiences audiences;
@Inject ObjectiveModeCommands(Provider<ObjectiveModeManager> manager, Audiences audiences) {
this.manager = manager;
this.audiences = audiences;
}
private void sendNoModes(Audience audience) {
audience.sendMessage(new TranslatableComponent("match.objectiveMode.noModes"));
}
private BaseComponent formatMode(ObjectiveMode mode, Duration time) {
return new Component(
new TranslatableComponent(
"match.objectiveMode.countdown",
new Component(manager.get().name(mode), ChatColor.GOLD),
new Component(PeriodFormats.formatColons(time), ChatColor.AQUA)
),
ChatColor.DARK_AQUA
).strikethrough(time.isZero());
}
@Command(
aliases = "next",
desc = "Shows information about the next mode"
)
public void next(CommandContext args, CommandSender sender) throws CommandException {
final ObjectiveModeManager manager = this.manager.get();
final Audience audience = audiences.get(sender);
final Optional<Pair<ObjectiveMode, Duration>> next = manager.nextMode();
if(next.isPresent()) {
audience.sendMessage(formatMode(next.get().first, next.get().second));
} else {
sendNoModes(audience);
}
}
@Command(
aliases = "list",
desc = "Lists all modes"
)
public void list(CommandContext args, CommandSender sender) throws CommandException {
final ObjectiveModeManager manager = this.manager.get();
final Audience audience = audiences.get(sender);
final Map<ObjectiveMode, Duration> modes = manager.modes();
if(modes.isEmpty()) {
sendNoModes(audience);
} else {
audience.sendMessage(new HeaderComponent(new TranslatableComponent("match.objectiveMode.header")));
modes.forEach((mode, time) -> audience.sendMessage(formatMode(mode, time)));
}
}
}