package org.royaldev.thehumanity.commands; import com.google.common.base.Preconditions; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.kitteh.irc.client.library.element.User; import org.kitteh.irc.client.library.event.helper.ActorEvent; import xyz.cardstock.cardstock.commands.BaseCommand; import xyz.cardstock.cardstock.commands.CallInfo; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public abstract class ParentCommand extends BaseCommand { private final List<BaseCommand> subcommands = new ArrayList<>(); protected void addSubcommand(@NotNull final BaseCommand subcommand) { Preconditions.checkNotNull(subcommand, "subcommand was null"); this.subcommands.add(subcommand); } protected boolean beforeCommand(@NotNull final ActorEvent<User> event, @NotNull final CallInfo ci, @NotNull final List<String> args) { return true; } protected boolean beforeSubcommand(@NotNull final BaseCommand subcommand, @NotNull final ActorEvent<User> event, @NotNull final CallInfo ci, @NotNull final List<String> args) { return true; } @NotNull protected String getHelpString() { final StringBuilder sb = new StringBuilder("Subcommands: "); for (final BaseCommand subcommand : this.subcommands) { sb.append("(").append(subcommand.getName()); for (final String alias : subcommand.getAliases()) { sb.append(", ").append(alias); } sb.append("), "); } return sb.substring(0, sb.length() - 2); } @Nullable protected BaseCommand getSubcommand(@NotNull final String name) { Preconditions.checkNotNull(name, "name was null"); return this.subcommands.stream() .filter(c -> c.getName().equalsIgnoreCase(name) || Arrays.asList(c.getAliases()).contains(name.toLowerCase())) .findFirst() .orElse(null); } @Override public void run(@NotNull final ActorEvent<User> event, @NotNull final CallInfo callInfo, @NotNull final List<String> arguments) { if (!this.beforeCommand(event, callInfo, arguments)) { return; } final User u = event.getActor(); if (arguments.size() < 1) { u.sendNotice("Provide a subcommand."); u.sendNotice(this.getHelpString()); return; } final BaseCommand subcommand = this.getSubcommand(arguments.get(0)); if (subcommand == null) { u.sendNotice("No such subcommand."); return; } if (!this.beforeSubcommand(subcommand, event, callInfo, arguments)) { return; } subcommand.run(event, callInfo, arguments.subList(1, arguments.size())); } }