package org.royaldev.thehumanity.commands.impl;
import org.jetbrains.annotations.NotNull;
import org.kitteh.irc.client.library.element.User;
import org.kitteh.irc.client.library.event.helper.ActorEvent;
import org.royaldev.thehumanity.TheHumanity;
import org.royaldev.thehumanity.cards.packs.CAHCardPack;
import org.royaldev.thehumanity.cards.packs.CardcastCardPack;
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.text.DecimalFormat;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
@Command(
name = "packs",
description = "Shows the loaded card packs."
)
public class PacksCommand extends BaseCommand {
private static final DecimalFormat df = new DecimalFormat("0.##%");
private static final Random r = new Random();
private static final String GIST_ID = "thehumanity:packs";
private final TheHumanity humanity;
public PacksCommand(final TheHumanity instance) {
this.humanity = instance;
}
/**
* Generates Markdown, suitable for pasting to GitHub Gist, for the the given CardPack. Markdown will include the
* name of the pack, any description or author (if set), statistics about the numbers of cards, and a random
* selection of both one white and one black card.
*
* @param cp CardPack to generate Markdown for
* @return A Markdown String
*/
private String generateCardPackMarkdown(final CAHCardPack cp) {
final StringBuilder sb = new StringBuilder();
final int blackCards = cp.getBlackCards().size();
final int whiteCards = cp.getWhiteCards().size();
final int totalCards = blackCards + whiteCards;
sb.append("## ").append(cp.getName()).append("\n");
final String description = cp.getDescription();
final String author = cp.getAuthor();
if (description != null || author != null) {
sb.append("### Metadata\n");
sb.append("|Title|Data|\n|---|---|\n");
if (description != null) {
sb.append("|Description|").append(description).append("|\n");
}
if (author != null) {
sb.append("|Author|").append(author).append("|\n");
}
if (cp instanceof CardcastCardPack) {
sb.append("|Cardcast ID|").append(((CardcastCardPack) cp).getID()).append("|\n");
}
}
sb.append("### Information\n");
sb.append("|Title|Data|\n|---|---|\n");
sb.append("|Total cards|").append(totalCards).append("|\n");
sb.append("|Black cards|").append(blackCards).append(" (").append(PacksCommand.df.format((double) blackCards / (double) totalCards)).append(")|\n");
sb.append("|White cards|").append(whiteCards).append(" (").append(PacksCommand.df.format((double) whiteCards / (double) totalCards)).append(")|\n");
if (cp.getBlackCards().size() > 0) {
sb.append("|Random black card|").append("```").append(cp.getBlackCards().get(PacksCommand.r.nextInt(blackCards))).append("```|\n");
}
if (cp.getWhiteCards().size() > 0) {
sb.append("|Random white card|").append("```").append(cp.getWhiteCards().get(PacksCommand.r.nextInt(whiteCards))).append("```|\n");
}
return sb.toString();
}
@Override
public void run(@NotNull ActorEvent<User> event, @NotNull CallInfo callInfo, @NotNull List<String> arguments) {
final StringBuilder sb = new StringBuilder();
final String allPackNames = this.humanity.getLoadedCardPacks().stream().map(CAHCardPack::getName).sorted().collect(Collectors.joining());
sb.append("# All card packs\n");
sb.append("- ").append(
this.humanity.getLoadedCardPacks().stream().map(CAHCardPack::getName).collect(Collectors.joining("\n- "))
);
sb.append("\n\n# Individual card packs\n");
for (final CAHCardPack cp : this.humanity.getLoadedCardPacks()) {
sb.append(this.generateCardPackMarkdown(cp));
}
ConversionHelper.respond(event, this.humanity.cachedGist(PacksCommand.GIST_ID, allPackNames, "packs.md", sb.toString()));
}
}