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()));
}
}