use of com.freya02.botcommands.api.application.CommandPath in project BotCommands by freya022.
the class HelpCommand method getCommandHelpEmbed.
@NotNull
private EmbedBuilder getCommandHelpEmbed(BaseCommandEvent event, TextCommandCandidates candidates) {
final CommandPath path = candidates.first().getPath();
final Member member = event.getMember();
final long memberId = member.getIdLong();
final Map<CommandPath, EmbedBuilder> map = memberEmbedMap.computeIfAbsent(memberId, x -> new HashMap<>());
final EmbedBuilder builder;
final EmbedBuilder existingEmbed = map.get(path);
if (existingEmbed != null) {
builder = new EmbedBuilder(existingEmbed);
} else {
builder = Utils.generateCommandHelp(candidates, event);
map.put(path, builder);
}
builder.setTimestamp(Instant.now());
builder.setColor(member.getColorRaw());
return builder;
}
use of com.freya02.botcommands.api.application.CommandPath in project BotCommands by freya022.
the class HelpCommand method sendCommandHelp.
public void sendCommandHelp(BaseCommandEvent event, CommandPath cmdPath) {
TextCommandCandidates cmds = event.getContext().findCommands(cmdPath);
if (cmds == null) {
event.respond("Command '" + getSpacedPath(cmdPath) + "' does not exist").queue(null, event.failureReporter("Failed to send help"));
return;
}
final Member member = event.getMember();
final GuildMessageChannel channel = event.getGuildChannel();
final Usability usability = Usability.of(context, cmds.first(), member, channel, !context.isOwner(member.getIdLong()));
if (usability.isNotShowable()) {
event.respond("Command '" + getSpacedPath(cmdPath) + "' does not exist").queue(null, event.failureReporter("Failed to send help"));
return;
}
final EmbedBuilder embed = getCommandHelpEmbed(event, cmds);
event.respond(embed.build()).queue();
}
use of com.freya02.botcommands.api.application.CommandPath in project BotCommands by freya022.
the class ApplicationCommandsUpdater method computeSlashCommands.
private void computeSlashCommands(List<ApplicationCommandInfo> guildApplicationCommands) {
guildApplicationCommands.stream().filter(a -> a instanceof SlashCommandInfo).map(a -> (SlashCommandInfo) a).distinct().forEachOrdered(info -> {
final CommandPath notLocalizedPath = info.getPath();
try {
final LocalizedCommandData localizedCommandData = LocalizedCommandData.of(context, guild, info);
// Put localized option names in order to resolve them when called
final List<OptionData> localizedMethodOptions = getLocalizedMethodOptions(info, localizedCommandData);
if (guild != null) {
info.putLocalizedOptions(guild.getIdLong(), localizedMethodOptions.stream().map(OptionData::getName).collect(Collectors.toList()));
}
localizedBaseNameToBaseName.put(localizedCommandData.getLocalizedPath().getName(), notLocalizedPath.getName());
final CommandPath localizedPath = localizedCommandData.getLocalizedPath();
final String description = localizedCommandData.getLocalizedDescription();
Checks.check(localizedPath.getNameCount() == notLocalizedPath.getNameCount(), "Localized path does not have the same name count as the not-localized path");
final boolean isDefaultEnabled = isDefaultEnabled(info);
if (localizedPath.getNameCount() == 1) {
// Standard command
final SlashCommandData rightCommand = Commands.slash(localizedPath.getName(), description);
map.put(Command.Type.SLASH, localizedPath, rightCommand);
rightCommand.addOptions(localizedMethodOptions);
rightCommand.setDefaultEnabled(isDefaultEnabled);
} else if (localizedPath.getNameCount() == 2) {
Checks.notNull(localizedPath.getSubname(), "Subcommand name");
final SlashCommandData commandData = (SlashCommandData) map.computeIfAbsent(Command.Type.SLASH, localizedPath, x -> {
final SlashCommandData tmpData = Commands.slash(localizedPath.getName(), "No description (base name)");
tmpData.setDefaultEnabled(isDefaultEnabled);
return tmpData;
});
// Subcommand of a command
final SubcommandData subcommandData = new SubcommandData(localizedPath.getSubname(), description);
subcommandData.addOptions(localizedMethodOptions);
commandData.addSubcommands(subcommandData);
} else if (localizedPath.getNameCount() == 3) {
Checks.notNull(localizedPath.getGroup(), "Command group name");
Checks.notNull(localizedPath.getSubname(), "Subcommand name");
final SubcommandGroupData groupData = getSubcommandGroup(Command.Type.SLASH, localizedPath, x -> {
final SlashCommandData commandData = Commands.slash(localizedPath.getName(), "No description (base name)");
commandData.setDefaultEnabled(isDefaultEnabled);
return commandData;
});
final SubcommandData subcommandData = new SubcommandData(localizedPath.getSubname(), description);
subcommandData.addOptions(localizedMethodOptions);
groupData.addSubcommands(subcommandData);
} else {
throw new IllegalStateException("A slash command with more than 4 path components got registered");
}
context.addApplicationCommandAlternative(localizedPath, Command.Type.SLASH, info);
if (!info.isOwnerRequired()) {
if (ownerOnlyCommands.contains(notLocalizedPath.getName())) {
LOGGER.warn("Non owner-only command '{}' is registered as a owner-only command because of another command with the same base name '{}'", notLocalizedPath, notLocalizedPath.getName());
}
}
if (info.isOwnerRequired()) {
if (info.isGuildOnly()) {
ownerOnlyCommands.add(notLocalizedPath.getName());
} else {
LOGGER.warn("Owner-only command '{}' cannot be owner-only as it is a global command", notLocalizedPath);
}
}
} catch (Exception e) {
throw new RuntimeException("An exception occurred while processing command '" + notLocalizedPath + "' at " + Utils.formatMethodShort(info.getMethod()), e);
}
});
}
use of com.freya02.botcommands.api.application.CommandPath in project BotCommands by freya022.
the class ApplicationCommandsUpdater method computeContextCommands.
@SuppressWarnings("unchecked")
private <T extends ApplicationCommandInfo> void computeContextCommands(List<ApplicationCommandInfo> guildApplicationCommands, Class<T> targetClazz, Command.Type type) {
guildApplicationCommands.stream().filter(a -> targetClazz.isAssignableFrom(a.getClass())).map(a -> (T) a).distinct().forEachOrdered(info -> {
final CommandPath notLocalizedPath = info.getPath();
try {
final LocalizedCommandData localizedCommandData = LocalizedCommandData.of(context, guild, info);
localizedBaseNameToBaseName.put(localizedCommandData.getLocalizedPath().getName(), notLocalizedPath.getName());
// User command name
final CommandPath localizedPath = localizedCommandData.getLocalizedPath();
Checks.check(localizedPath.getNameCount() == notLocalizedPath.getNameCount(), "Localized path does not have the same name count as the not-localized path");
final boolean isDefaultEnabled = isDefaultEnabled(info);
if (localizedPath.getNameCount() == 1) {
// Standard command
final CommandData rightCommand = Commands.context(type, localizedPath.getName());
map.put(type, localizedPath, rightCommand);
rightCommand.setDefaultEnabled(isDefaultEnabled);
if (info.isOwnerRequired()) {
// Must be non-localized name
ownerOnlyCommands.add(notLocalizedPath.getName());
}
} else {
throw new IllegalStateException("A " + type.name() + " command with more than 1 path component got registered");
}
context.addApplicationCommandAlternative(localizedPath, type, info);
} catch (Exception e) {
throw new RuntimeException("An exception occurred while processing a " + type.name() + " command " + notLocalizedPath, e);
}
});
}
use of com.freya02.botcommands.api.application.CommandPath 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);
}
Aggregations