package cc.fascinated.bat.command; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NonNull; import lombok.Setter; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.internal.interactions.CommandDataImpl; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Fascinated (fascinated7) */ @Getter @Setter public abstract class BatCommand implements BatCommandExecutor { /** * The name of the command */ private final String name; /** * The description of the command */ private final String description; /** * The command data for the slash command */ private final CommandDataImpl commandData; /** * The required permissions for the command */ private final List requiredPermissions; /** * The sub commands of the command */ private final Map subCommands = new HashMap<>(); /** * The category of the command */ private Category category; public BatCommand(@NonNull String name, @NonNull String description, boolean guildOnly, Permission... permissions) { this.name = name; this.description = description; this.requiredPermissions = List.of(permissions); // Default values this.category = Category.GENERAL; this.commandData = new CommandDataImpl(this.name, description) .setGuildOnly(guildOnly); } public BatCommand(@NonNull String name) { this(name, "No description provided.", false); } public BatCommand(@NonNull String name, @NonNull String description) { this(name, description, false); } /** * Adds a sub command to the command * * @param name The name of the sub command * @param subCommand The sub command */ public void addSubCommand(@NonNull String name, @NonNull BatSubCommand subCommand) { this.subCommands.put(name.toLowerCase(), subCommand); this.commandData.addSubcommands(subCommand.getCommandData()); } /** * Adds an option to the sub command * * @param optionType the type of the option * @param name the name of the option * @param description the description of the option * @param required whether the option is required */ private void addOption(OptionType optionType, String name, String description, boolean required) { this.commandData.addOption(optionType, name, description, required); } /** * Gets all the options for the command * * @param interaction The slash command interaction * @return The option strings */ public List getOptions(SlashCommandInteraction interaction) { return interaction.getOptions().stream().map(OptionMapping::getName).toList(); } /** * The category of the command */ @AllArgsConstructor @Getter protected enum Category { GENERAL("General"), MODERATION("Moderation"), SERVER("Server"), BEAT_SABER("Beat Saber"); /** * The name of the category */ private final String name; } }