package org.royaldev.thehumanity.commands.impl;
import com.google.common.base.Preconditions;
import org.jetbrains.annotations.NotNull;
import org.kitteh.irc.client.library.util.Format;
import org.kitteh.irc.client.library.element.User;
import org.kitteh.irc.client.library.event.channel.ChannelMessageEvent;
import org.kitteh.irc.client.library.event.helper.ActorEvent;
import org.royaldev.thehumanity.TheHumanity;
import org.royaldev.thehumanity.game.TheHumanityGame;
import org.royaldev.thehumanity.game.round.CAHRound.RoundState;
import org.royaldev.thehumanity.game.round.CurrentRound;
import org.royaldev.thehumanity.player.TheHumanityPlayer;
import org.royaldev.thehumanity.util.ConversionHelper;
import xyz.cardstock.cardstock.commands.BaseCommand;
import xyz.cardstock.cardstock.commands.CallInfo;
import xyz.cardstock.cardstock.commands.Command;
import java.util.List;
@Command(
name = "who",
description = "Shows the players in this game and their status."
)
public class WhoCommand extends BaseCommand {
protected final TheHumanity humanity;
public WhoCommand(final TheHumanity humanity) {
this.humanity = humanity;
}
/**
* Builds a String containing information about who the czar is, who is playing, and if they have played or not.
*
* @param g TheHumanityGame to build this String for
* @return Built String, ready to be sent
*/
@NotNull
private String getStatusString(@NotNull final TheHumanityGame g) {
Preconditions.checkNotNull(g, "g was null");
final CurrentRound r = g.getCurrentRound();
if (r == null) {
return "No round in progress.";
}
final StringBuilder sb = new StringBuilder();
final TheHumanityPlayer czar = r.getCzar();
if (czar != null) {
sb.append(Format.BOLD).append("Czar: ").append(Format.RESET).append(czar.getUser().getNick()).append(", ");
}
sb.append(Format.BOLD).append("Players: ").append(Format.RESET);
for (final TheHumanityPlayer player : g.getPlayers()) {
if (player.equals(czar)) continue;
final String c = (r.hasPlayed(player) ? Format.GREEN : r.getState().getUniqueName().equals(RoundState.WAITING_FOR_CZAR.name()) ? Format.BLUE : Format.RED).toString();
sb.append(c).append(player.getUser().getNick()).append(Format.RESET).append(", ");
}
return sb.substring(0, sb.length() - 2);
}
@Override
public void run(@NotNull ActorEvent<User> event, @NotNull CallInfo callInfo, @NotNull List<String> arguments) {
if (!(event instanceof ChannelMessageEvent)) return;
final User u = event.getActor();
final TheHumanityGame game = this.humanity.getGameRegistrar().find(((ChannelMessageEvent) event).getChannel());
if (game == null) {
u.sendNotice("No game in progress.");
return;
}
final CurrentRound r = game.getCurrentRound();
if (r == null || !r.getState().getUniqueName().equals(RoundState.WAITING_FOR_CZAR.name()) && !r.getState().getUniqueName().equals(RoundState.WAITING_FOR_PLAYERS.name())) {
u.sendNotice("The game has not yet started.");
return;
}
final String ss = this.getStatusString(game);
ConversionHelper.respond(event, game.antiPing(ss));
}
}