mirror of https://github.com/sgoudham/Enso-Bot.git
Add CommandLoader
parent
e6adabc46d
commit
e78f080e18
@ -0,0 +1,10 @@
|
||||
package me.goudham.command;
|
||||
|
||||
import io.micronaut.inject.BeanDefinition;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
|
||||
|
||||
public interface CommandLoader {
|
||||
List<CommandData> loadIntoMapAndReturnCommands(Map<String, BeanDefinition<?>> commandMap);
|
||||
}
|
@ -0,0 +1,183 @@
|
||||
package me.goudham.command;
|
||||
|
||||
import io.micronaut.context.BeanContext;
|
||||
import io.micronaut.core.annotation.AnnotationValue;
|
||||
import io.micronaut.core.annotation.Introspected;
|
||||
import io.micronaut.inject.BeanDefinition;
|
||||
import io.micronaut.inject.qualifiers.Qualifiers;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.inject.Singleton;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.OptionalDouble;
|
||||
import java.util.OptionalInt;
|
||||
import me.goudham.command.annotation.Choice;
|
||||
import me.goudham.command.annotation.Command;
|
||||
import me.goudham.command.annotation.Option;
|
||||
import me.goudham.command.annotation.SubCommand;
|
||||
import me.goudham.command.annotation.SubCommandGroup;
|
||||
import net.dv8tion.jda.api.interactions.commands.OptionType;
|
||||
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
|
||||
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
|
||||
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData;
|
||||
import net.dv8tion.jda.api.interactions.commands.build.SubcommandGroupData;
|
||||
|
||||
@Singleton
|
||||
@Introspected
|
||||
public class SlashCommandLoader implements CommandLoader {
|
||||
private final BeanContext beanContext;
|
||||
|
||||
@Inject
|
||||
public SlashCommandLoader(BeanContext beanContext) {
|
||||
this.beanContext = beanContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CommandData> loadIntoMapAndReturnCommands(Map<String, BeanDefinition<?>> commandMap) {
|
||||
Collection<BeanDefinition<?>> beanDefinitions = beanContext.getBeanDefinitions(Qualifiers.byStereotype(Command.class));
|
||||
List<CommandData> commandDataList = new ArrayList<>();
|
||||
|
||||
for (BeanDefinition<?> beanDefinition : beanDefinitions) {
|
||||
AnnotationValue<Annotation> slashCommand = beanDefinition.getDeclaredAnnotation("me.goudham.command.annotation.Command");
|
||||
if (slashCommand != null) {
|
||||
String name = slashCommand.stringValue("name").orElseThrow();
|
||||
String description = slashCommand.stringValue("description").orElseThrow();
|
||||
boolean isVisible = slashCommand.booleanValue("isVisible").orElseThrow();
|
||||
|
||||
CommandData commandData = new CommandData(name, description);
|
||||
commandData.setDefaultEnabled(isVisible);
|
||||
|
||||
List<SubcommandGroupData> subcommandGroupDataList = loadSubCommandGroups(slashCommand);
|
||||
List<SubcommandData> subcommandData = loadSubCommands(slashCommand);
|
||||
List<OptionData> optionData = loadOptions(slashCommand);
|
||||
|
||||
if (subcommandGroupDataList != null) commandData.addSubcommandGroups(subcommandGroupDataList);
|
||||
if (subcommandData != null) commandData.addSubcommands(subcommandData);
|
||||
if (optionData != null) commandData.addOptions(optionData);
|
||||
|
||||
commandDataList.add(commandData);
|
||||
commandMap.put(name, beanDefinition);
|
||||
} else {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
return commandDataList;
|
||||
}
|
||||
|
||||
private List<SubcommandGroupData> loadSubCommandGroups(AnnotationValue<?> slashCommand) {
|
||||
if (slashCommand.contains("subCommandGroups")) {
|
||||
List<SubcommandGroupData> subcommandGroupDataList = new ArrayList<>();
|
||||
List<AnnotationValue<SubCommandGroup>> subCommandGroupAnnotations = slashCommand.getAnnotations("subCommandGroups", SubCommandGroup.class);
|
||||
for (AnnotationValue<SubCommandGroup> subCommandGroup : subCommandGroupAnnotations) {
|
||||
String name = subCommandGroup.stringValue("name").orElseThrow();
|
||||
String description = subCommandGroup.stringValue("description").orElseThrow();
|
||||
|
||||
SubcommandGroupData subcommandGroupData = new SubcommandGroupData(name, description);
|
||||
List<SubcommandData> subcommandData = loadSubCommands(subCommandGroup);
|
||||
if (subcommandData != null) subcommandGroupData.addSubcommands(subcommandData);
|
||||
|
||||
subcommandGroupDataList.add(subcommandGroupData);
|
||||
}
|
||||
|
||||
return subcommandGroupDataList;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<SubcommandData> loadSubCommands(AnnotationValue<?> slashCommand) {
|
||||
if (slashCommand.contains("subCommands")) {
|
||||
List<SubcommandData> subcommandDataList = new ArrayList<>();
|
||||
List<AnnotationValue<SubCommand>> subCommandAnnotations = slashCommand.getAnnotations("subCommands", SubCommand.class);
|
||||
|
||||
for (AnnotationValue<SubCommand> subCommand : subCommandAnnotations) {
|
||||
String name = subCommand.stringValue("name").orElseThrow();
|
||||
String description = subCommand.stringValue("description").orElseThrow();
|
||||
|
||||
SubcommandData subCommandData = new SubcommandData(name, description);
|
||||
List<OptionData> optionData = loadOptions(subCommand);
|
||||
if (optionData != null) subCommandData.addOptions(optionData);
|
||||
|
||||
|
||||
subcommandDataList.add(subCommandData);
|
||||
}
|
||||
|
||||
return subcommandDataList;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<OptionData> loadOptions(AnnotationValue<?> slashCommand) {
|
||||
if (slashCommand.contains("options")) {
|
||||
List<OptionData> optionList = new ArrayList<>();
|
||||
List<AnnotationValue<Option>> optionAnnotations = slashCommand.getAnnotations("options", Option.class);
|
||||
|
||||
for (AnnotationValue<Option> option : optionAnnotations) {
|
||||
OptionType optionType = option.enumValue("optionType", OptionType.class).orElseThrow();
|
||||
String name = option.stringValue("name").orElseThrow();
|
||||
String description = option.stringValue("description").orElseThrow();
|
||||
boolean isRequired = option.booleanValue("isRequired").orElseThrow();
|
||||
|
||||
OptionData optionData = new OptionData(optionType, name, description, isRequired);
|
||||
List<net.dv8tion.jda.api.interactions.commands.Command.Choice> choiceList = loadChoices(option);
|
||||
if (choiceList != null) optionData.addChoices(choiceList);
|
||||
|
||||
optionList.add(optionData);
|
||||
}
|
||||
|
||||
return optionList;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<net.dv8tion.jda.api.interactions.commands.Command.Choice> loadChoices(AnnotationValue<?> slashCommand) {
|
||||
if (slashCommand.contains("choices")) {
|
||||
List<net.dv8tion.jda.api.interactions.commands.Command.Choice> choiceList = new ArrayList<>();
|
||||
List<AnnotationValue<Choice>> choiceAnnotations = slashCommand.getAnnotations("choices", Choice.class);
|
||||
|
||||
for (AnnotationValue<Choice> choice : choiceAnnotations) {
|
||||
net.dv8tion.jda.api.interactions.commands.Command.Choice choiceData = null;
|
||||
String name = choice.stringValue("name").orElseThrow();
|
||||
|
||||
OptionalInt optionalInt = choice.intValue("intValue");
|
||||
int intValue = 0;
|
||||
if (optionalInt.isPresent()) {
|
||||
intValue = optionalInt.getAsInt();
|
||||
}
|
||||
|
||||
OptionalDouble optionalDouble = choice.doubleValue("doubleValue");
|
||||
double doubleValue = Double.NaN;
|
||||
if (optionalDouble.isPresent()) {
|
||||
doubleValue = optionalDouble.getAsDouble();
|
||||
}
|
||||
|
||||
Optional<String> optionalString = choice.stringValue("stringValue");
|
||||
String stringValue = "";
|
||||
if (optionalString.isPresent()) {
|
||||
stringValue = optionalString.get();
|
||||
}
|
||||
|
||||
if (intValue != 0) {
|
||||
choiceData = new net.dv8tion.jda.api.interactions.commands.Command.Choice(name, intValue);
|
||||
} else if (!Double.isNaN(doubleValue)) {
|
||||
choiceData = new net.dv8tion.jda.api.interactions.commands.Command.Choice(name, doubleValue);
|
||||
} else if (!stringValue.isBlank()) {
|
||||
choiceData = new net.dv8tion.jda.api.interactions.commands.Command.Choice(name, stringValue);
|
||||
}
|
||||
|
||||
choiceList.add(choiceData);
|
||||
}
|
||||
|
||||
return choiceList;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue