net.dv8tion.jda.api.interactions.commands.build.CommandData Maven / Gradle / Ivy
Show all versions of JDA Show documentation
/*
* Copyright 2015 Austin Keener, Michael Ritter, Florian Spieß, and the JDA contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.dv8tion.jda.api.interactions.commands.build;
import net.dv8tion.jda.api.interactions.DiscordLocale;
import net.dv8tion.jda.api.interactions.commands.Command;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.localization.LocalizationFunction;
import net.dv8tion.jda.api.interactions.commands.localization.LocalizationMap;
import net.dv8tion.jda.api.utils.data.DataObject;
import net.dv8tion.jda.api.utils.data.SerializableData;
import net.dv8tion.jda.internal.interactions.CommandDataImpl;
import net.dv8tion.jda.internal.utils.Checks;
import net.dv8tion.jda.internal.utils.localization.LocalizationUtils;
import javax.annotation.Nonnull;
import java.util.Collection;
import java.util.Map;
/**
* Builder for Application Commands.
*
Use the factory methods provided by {@link Commands} to create instances of this interface.
*
* @see Commands
*/
public interface CommandData extends SerializableData
{
/**
* The maximum length the name of a command can be. ({@value})
*/
int MAX_NAME_LENGTH = 32;
/**
* The maximum length the description of a command can be. ({@value})
*/
int MAX_DESCRIPTION_LENGTH = 100;
/**
* The maximum amount of options/subcommands/groups that can be added to a command or subcommand. ({@value})
*/
int MAX_OPTIONS = 25;
/**
* Sets the {@link LocalizationFunction} for this command
*
This enables you to have the entirety of this command to be localized.
*
* @param localizationFunction
* The localization function
*
* @throws IllegalArgumentException
* If the localization function is null
*
* @return The builder instance, for chaining
*/
@Nonnull
CommandData setLocalizationFunction(@Nonnull LocalizationFunction localizationFunction);
/**
* Configure the command name.
*
* @param name
* The name, 1-{@value #MAX_NAME_LENGTH} characters (lowercase and alphanumeric for {@link Command.Type#SLASH})
*
* @throws IllegalArgumentException
* If the name is not between 1-{@value #MAX_NAME_LENGTH} characters long, or not lowercase and alphanumeric for slash commands
*
* @return The builder instance, for chaining
*/
@Nonnull
CommandData setName(@Nonnull String name);
/**
* Sets a {@link DiscordLocale language-specific} localization of this command's name.
*
* @param locale
* The locale to associate the translated name with
*
* @param name
* The translated name to put
*
* @throws IllegalArgumentException
*
* - If the locale is null
* - If the name is null
* - If the locale is {@link DiscordLocale#UNKNOWN}
* - If the name does not pass the corresponding {@link #setName(String) name check}
*
*
* @return This builder instance, for chaining
*/
@Nonnull
CommandData setNameLocalization(@Nonnull DiscordLocale locale, @Nonnull String name);
/**
* Sets multiple {@link DiscordLocale language-specific} localizations of this command's name.
*
* @param map
* The map from which to transfer the translated names
*
* @throws IllegalArgumentException
*
* - If the map is null
* - If the map contains an {@link DiscordLocale#UNKNOWN} key
* - If the map contains a name which does not pass the corresponding {@link #setName(String) name check}
*
*
* @return This builder instance, for chaining
*/
@Nonnull
CommandData setNameLocalizations(@Nonnull Map map);
/**
* Sets the {@link net.dv8tion.jda.api.Permission Permissions} that a user must have in a specific channel to be able to use this command.
*
By default, everyone can use this command ({@link DefaultMemberPermissions#ENABLED}). Additionally, a command can be disabled for everyone but admins via {@link DefaultMemberPermissions#DISABLED}.
* These configurations can be overwritten by moderators in each guild. See {@link Command#retrievePrivileges(net.dv8tion.jda.api.entities.Guild)} to get moderator defined overrides.
*
* @param permission
* {@link DefaultMemberPermissions} representing the default permissions of this command.
*
* @return The builder instance, for chaining
*
* @see DefaultMemberPermissions#ENABLED
* @see DefaultMemberPermissions#DISABLED
*/
@Nonnull
CommandData setDefaultPermissions(@Nonnull DefaultMemberPermissions permission);
/**
* Sets whether this command is only usable in a guild (Default: false).
*
This only has an effect if this command is registered globally.
*
* @param guildOnly
* Whether to restrict this command to guilds
*
* @return The builder instance, for chaining
*/
@Nonnull
CommandData setGuildOnly(boolean guildOnly);
/**
* Sets whether this command should only be usable in NSFW (age-restricted) channels.
*
Default: false
*
*
Note: Age-restricted commands will not show up in direct messages by default unless the user enables them in their settings.
*
* @param nsfw
* True, to make this command nsfw
*
* @return The builder instance, for chaining
*
* @see Age-Restricted Commands FAQ
*/
@Nonnull
CommandData setNSFW(boolean nsfw);
/**
* The current command name
*
* @return The command name
*/
@Nonnull
String getName();
/**
* The localizations of this command's name for {@link DiscordLocale various languages}.
*
* @return The {@link LocalizationMap} containing the mapping from {@link DiscordLocale} to the localized name
*/
@Nonnull
LocalizationMap getNameLocalizations();
/**
* The {@link Command.Type}
*
* @return The {@link Command.Type}
*/
@Nonnull
Command.Type getType();
/**
* Gets the {@link DefaultMemberPermissions} of this command.
*
If no permissions have been set, this returns {@link DefaultMemberPermissions#ENABLED}.
*
* @return DefaultMemberPermissions of this command.
*
* @see DefaultMemberPermissions#ENABLED
* @see DefaultMemberPermissions#DISABLED
*/
@Nonnull
DefaultMemberPermissions getDefaultPermissions();
/**
* Whether the command can only be used inside a guild.
*
Always true for guild commands.
*
* @return True, if this command is restricted to guilds.
*/
boolean isGuildOnly();
/**
* Whether this command should only be usable in NSFW (age-restricted) channels
*
* @return True, if this command is restricted to NSFW channels
*
* @see Age-Restricted Commands FAQ
*/
boolean isNSFW();
/**
* Converts the provided {@link Command} into a CommandData instance.
*
* @param command
* The command to convert
*
* @throws IllegalArgumentException
* If null is provided or the command has illegal configuration
*
* @return An instance of CommandData
*
* @see SlashCommandData#fromCommand(Command)
*/
@Nonnull
static CommandData fromCommand(@Nonnull Command command)
{
Checks.notNull(command, "Command");
if (command.getType() != Command.Type.SLASH)
{
final CommandDataImpl data = new CommandDataImpl(command.getType(), command.getName());
return data.setDefaultPermissions(command.getDefaultPermissions())
.setGuildOnly(command.isGuildOnly())
.setNSFW(command.isNSFW())
.setNameLocalizations(command.getNameLocalizations().toMap())
.setDescriptionLocalizations(command.getDescriptionLocalizations().toMap());
}
return SlashCommandData.fromCommand(command);
}
/**
* Parses the provided serialization back into an CommandData instance.
*
This is the reverse function for {@link CommandData#toData()}.
*
* @param object
* The serialized {@link DataObject} representing the command
*
* @throws net.dv8tion.jda.api.exceptions.ParsingException
* If the serialized object is missing required fields
* @throws IllegalArgumentException
* If any of the values are failing the respective checks such as length
*
* @return The parsed CommandData instance, which can be further configured through setters
*
* @see SlashCommandData#fromData(DataObject)
* @see Commands#fromList(Collection)
*/
@Nonnull
static CommandData fromData(@Nonnull DataObject object)
{
Checks.notNull(object, "DataObject");
String name = object.getString("name");
Command.Type commandType = Command.Type.fromId(object.getInt("type", 1));
if (commandType != Command.Type.SLASH)
{
CommandDataImpl data = new CommandDataImpl(commandType, name);
if (!object.isNull("default_member_permissions"))
{
long defaultPermissions = object.getLong("default_member_permissions");
data.setDefaultPermissions(defaultPermissions == 0 ? DefaultMemberPermissions.DISABLED : DefaultMemberPermissions.enabledFor(defaultPermissions));
}
data.setGuildOnly(!object.getBoolean("dm_permission", true));
data.setNSFW(object.getBoolean("nsfw"));
data.setNameLocalizations(LocalizationUtils.mapFromProperty(object, "name_localizations"));
data.setDescriptionLocalizations(LocalizationUtils.mapFromProperty(object, "description_localizations"));
return data;
}
return SlashCommandData.fromData(object);
}
}