Bat/src/main/java/cc/fascinated/bat/command/BatCommand.java

121 lines
3.3 KiB
Java
Raw Normal View History

2024-06-24 13:56:01 +01:00
package cc.fascinated.bat.command;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import net.dv8tion.jda.api.Permission;
2024-06-24 13:56:01 +01:00
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType;
2024-06-24 13:56:01 +01:00
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;
2024-06-24 13:56:01 +01:00
/**
* The command data for the slash command
2024-06-24 13:56:01 +01:00
*/
private final CommandDataImpl commandData;
2024-06-24 13:56:01 +01:00
/**
* The required permissions for the command
2024-06-24 13:56:01 +01:00
*/
private final List<Permission> requiredPermissions;
2024-06-24 13:56:01 +01:00
/**
* The sub commands of the command
*/
private final Map<String, BatSubCommand> subCommands = new HashMap<>();
2024-06-24 13:56:01 +01:00
/**
* The category of the command
*/
private Category category;
public BatCommand(@NonNull String name, @NonNull String description, boolean guildOnly, Permission... permissions) {
2024-06-24 13:56:01 +01:00
this.name = name;
this.description = description;
this.requiredPermissions = List.of(permissions);
2024-06-24 13:56:01 +01:00
// 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);
2024-06-24 13:56:01 +01:00
}
/**
* Adds a sub command to the command
*
* @param name The name of the sub command
2024-06-24 13:56:01 +01:00
* @param subCommand The sub command
*/
public void addSubCommand(@NonNull String name, @NonNull BatSubCommand subCommand) {
2024-06-24 13:56:01 +01:00
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);
2024-06-24 13:56:01 +01:00
}
/**
* Gets all the options for the command
*
* @param interaction The slash command interaction
* @return The option strings
*/
public List<String> getOptions(SlashCommandInteraction interaction) {
return interaction.getOptions().stream().map(OptionMapping::getName).toList();
}
/**
* The category of the command
*/
@AllArgsConstructor @Getter
protected enum Category {
2024-06-24 13:56:01 +01:00
GENERAL("General"),
MODERATION("Moderation"),
SERVER("Server"),
BEAT_SABER("Beat Saber");
2024-06-24 13:56:01 +01:00
/**
* The name of the category
*/
private final String name;
}
}