use of com.freya02.botcommands.internal.ApplicationOptionData in project BotCommands by freya022.
the class LocalizationData method getData.
public static LocalizationData getData(BContext context, @Nullable Guild guild, @NotNull ApplicationCommandInfo info) {
final CommandPath localizedPath;
final String localizedDescription;
final List<LocalizedOption> localizedOptions;
final List<List<Command.Choice>> localizedChoices;
final Locale locale = context.getEffectiveLocale(guild);
final BResourceBundle bundle = BResourceBundle.getBundle("BotCommands", locale);
if (bundle == null) {
return null;
}
final String prefix;
if (info instanceof SlashCommandInfo) {
prefix = "slash";
} else if (info instanceof UserCommandInfo) {
prefix = "user";
} else if (info instanceof MessageCommandInfo) {
prefix = "message";
} else {
throw new IllegalArgumentException("Unknown localization prefix for class: " + info.getClass().getSimpleName());
}
final String qualifier = info.getMethod().getName();
final StringJoiner pathJoiner = new StringJoiner("/");
pathJoiner.add(tryLocalize(bundle, info.getPath().getName(), prefix, qualifier, "name"));
if (info instanceof SlashCommandInfo) {
final String notLocalizedGroup = info.getPath().getGroup();
final String notLocalizedSubname = info.getPath().getSubname();
if (notLocalizedGroup != null)
pathJoiner.add(tryLocalize(bundle, notLocalizedGroup, prefix, qualifier, "group"));
if (notLocalizedSubname != null)
pathJoiner.add(tryLocalize(bundle, notLocalizedSubname, prefix, qualifier, "subname"));
}
localizedPath = CommandPath.of(pathJoiner.toString());
if (info instanceof SlashCommandInfo) {
localizedDescription = tryLocalize(bundle, ((SlashCommandInfo) info).getDescription(), prefix, qualifier, "description");
} else
localizedDescription = null;
if (info instanceof SlashCommandInfo) {
localizedOptions = new ArrayList<>();
localizedChoices = new ArrayList<>();
final List<List<Command.Choice>> notLocalizedChoices = SlashUtils.getNotLocalizedChoices(context, guild, info);
final List<? extends ApplicationCommandParameter<?>> parameters = info.getOptionParameters();
for (int optionIndex = 0, parametersSize = parameters.size(); optionIndex < parametersSize; optionIndex++) {
ApplicationCommandParameter<?> parameter = parameters.get(optionIndex);
final ApplicationOptionData optionData = parameter.getApplicationOptionData();
final String optionName = tryLocalize(bundle, optionData.getEffectiveName(), prefix, qualifier, "options", optionIndex, "name");
final String optionDescription = tryLocalize(bundle, optionData.getEffectiveDescription(), prefix, qualifier, "options", optionIndex, "description");
localizedOptions.add(new LocalizedOption(optionName, optionDescription));
final List<Command.Choice> choices = getLocalizedChoices(bundle, prefix, qualifier, notLocalizedChoices, optionIndex, parameter);
localizedChoices.add(choices);
}
} else {
localizedOptions = null;
localizedChoices = null;
}
return new LocalizationData(localizedPath, localizedDescription, localizedOptions, localizedChoices);
}
use of com.freya02.botcommands.internal.ApplicationOptionData in project BotCommands by freya022.
the class SlashCommandInfo method getAutocompletionHandlerName.
@Nullable
public String getAutocompletionHandlerName(CommandAutoCompleteInteractionEvent event) {
final AutoCompleteQuery autoCompleteQuery = event.getFocusedOption();
int optionIndex = 0;
final List<String> optionNames = event.getGuild() != null ? getLocalizedOptions(event.getGuild()) : null;
for (final SlashCommandParameter parameter : commandParameters) {
final ApplicationOptionData applicationOptionData = parameter.getApplicationOptionData();
if (parameter.isOption()) {
final String optionName = optionNames == null ? applicationOptionData.getEffectiveName() : optionNames.get(optionIndex);
if (optionName == null) {
throw new IllegalArgumentException(String.format("Option name #%d (%s) could not be resolved for %s", optionIndex, applicationOptionData.getEffectiveName(), Utils.formatMethodShort(getMethod())));
}
optionIndex++;
if (optionName.equals(autoCompleteQuery.getName())) {
return applicationOptionData.getAutocompletionHandlerName();
}
}
}
return null;
}
use of com.freya02.botcommands.internal.ApplicationOptionData in project BotCommands by freya022.
the class SlashCommandInfo method execute.
public boolean execute(BContext context, SlashCommandInteractionEvent event, Consumer<Throwable> throwableConsumer) throws Exception {
List<Object> objects = new ArrayList<>(commandParameters.size() + 1) {
{
if (guildOnly) {
add(new GuildSlashEvent(context, event));
} else {
add(new GlobalSlashEventImpl(context, event));
}
}
};
int optionIndex = 0;
final List<String> optionNames = event.getGuild() != null ? getLocalizedOptions(event.getGuild()) : null;
for (final SlashCommandParameter parameter : commandParameters) {
final ApplicationOptionData applicationOptionData = parameter.getApplicationOptionData();
final Object obj;
if (parameter.isOption()) {
String optionName = optionNames == null ? applicationOptionData.getEffectiveName() : optionNames.get(optionIndex);
if (optionName == null) {
throw new IllegalArgumentException(String.format("Option name #%d (%s) could not be resolved for %s", optionIndex, applicationOptionData.getEffectiveName(), Utils.formatMethodShort(getMethod())));
}
optionIndex++;
final OptionMapping optionMapping = event.getOption(optionName);
if (optionMapping == null) {
if (parameter.isOptional()) {
if (parameter.isPrimitive()) {
objects.add(0);
} else {
objects.add(null);
}
continue;
} else {
throw new RuntimeException("Slash parameter couldn't be resolved for method " + Utils.formatMethodShort(commandMethod) + " at parameter " + applicationOptionData.getEffectiveName() + " (localized '" + optionName + "')");
}
}
obj = parameter.getResolver().resolve(context, this, event, optionMapping);
if (obj == null) {
event.replyFormat(context.getDefaultMessages(event.getGuild()).getSlashCommandUnresolvableParameterMsg(), applicationOptionData.getEffectiveName(), parameter.getBoxedType().getSimpleName()).setEphemeral(true).queue();
// Not a warning, could be normal if the user did not supply a valid string for user-defined resolvers
LOGGER.trace("The parameter '{}' of value '{}' could not be resolved into a {}", applicationOptionData.getEffectiveName(), optionMapping.getAsString(), parameter.getBoxedType().getSimpleName());
return false;
}
if (!parameter.getBoxedType().isAssignableFrom(obj.getClass())) {
event.replyFormat(context.getDefaultMessages(event.getGuild()).getSlashCommandInvalidParameterTypeMsg(), applicationOptionData.getEffectiveName(), parameter.getBoxedType().getSimpleName(), obj.getClass().getSimpleName()).setEphemeral(true).queue();
LOGGER.error("The parameter '{}' of value '{}' is not a valid type (expected a {})", applicationOptionData.getEffectiveName(), optionMapping.getAsString(), parameter.getBoxedType().getSimpleName());
return false;
}
} else {
obj = parameter.getCustomResolver().resolve(context, this, event);
}
// For some reason using an array list instead of a regular array
// magically unboxes primitives when passed to Method#invoke
objects.add(obj);
}
applyCooldown(event);
getMethodRunner().invoke(objects.toArray(), throwableConsumer);
return true;
}
use of com.freya02.botcommands.internal.ApplicationOptionData in project BotCommands by freya022.
the class AutocompletionHandlersBuilder method postProcess.
public void postProcess() {
for (SlashCommandInfo info : context.getApplicationCommandInfoMap().getSlashCommands().values()) {
MethodParameters<SlashCommandParameter> parameters = info.getParameters();
for (int i = 0, parametersSize = parameters.size(); i < parametersSize; i++) {
SlashCommandParameter parameter = parameters.get(i);
if (!parameter.isOption())
continue;
final ApplicationOptionData applicationOptionData = parameter.getApplicationOptionData();
final String autocompleteHandlerName = applicationOptionData.getAutocompletionHandlerName();
if (autocompleteHandlerName != null) {
final AutocompletionHandlerInfo handler = context.getAutocompletionHandler(autocompleteHandlerName);
if (handler == null) {
throw new IllegalArgumentException("Slash command parameter #" + i + " at " + Utils.formatMethodShort(info.getMethod()) + " uses autocompletion but has no handler assigned, did you misspell the handler name ? Consider using a constant variable to share with the handler and the option");
}
handler.checkParameters(info);
}
}
}
context.addEventListeners(new AutocompletionListener(context));
}
use of com.freya02.botcommands.internal.ApplicationOptionData in project BotCommands by freya022.
the class BaseAutocompletionCache method getCompositeOptionValues.
private String[] getCompositeOptionValues(AutocompletionHandlerInfo info, SlashCommandInfo slashCommand, CommandAutoCompleteInteractionEvent event) {
final List<String> optionValues = new ArrayList<>();
optionValues.add(event.getFocusedOption().getValue());
int optionIndex = 0;
final List<String> optionNames = event.getGuild() != null ? slashCommand.getLocalizedOptions(event.getGuild()) : null;
for (final AutocompleteCommandParameter parameter : info.getParameters()) {
final ApplicationOptionData applicationOptionData = parameter.getApplicationOptionData();
if (parameter.isOption()) {
final String optionName = optionNames == null ? applicationOptionData.getEffectiveName() : optionNames.get(optionIndex);
if (optionName == null) {
throw new IllegalArgumentException(String.format("Option name #%d (%s) could not be resolved for %s", optionIndex, applicationOptionData.getEffectiveName(), Utils.formatMethodShort(info.getMethod())));
}
optionIndex++;
if (parameter.isCompositeKey()) {
final OptionMapping option = event.getOption(optionName);
if (option == null) {
optionValues.add("null");
} else if (!event.getFocusedOption().getName().equals(optionName)) {
// Only add the options other than the focused one, since it's already there, saves us from an HashSet
optionValues.add(option.getAsString());
}
}
}
}
return optionValues.toArray(new String[0]);
}
Aggregations