Guide discord.js
Commandes Slash

Analyse des Options

Options de commande

Dans cette section, nous couvrirons comment accéder aux valeurs des options d'une commande. Considérez l'exemple de commande ban suivant avec deux options :

commands/moderation/ban.js
const { InteractionContextType, PermissionFlagsBits, SlashCommandBuilder } = require('discord.js');

module.exports = {
	data: new SlashCommandBuilder()
		.setName('ban')
|		.setDescription('Sélectionnez un membre et bannissez-le.')
|
|		.addUserOption((option) => option.setName('target').setDescription('Le membre à bannir').setRequired(true))
|		.addStringOption((option) => option.setName('reason').setDescription('La raison du bannissement'))
		.setDefaultMemberPermissions(PermissionFlagsBits.BanMembers)
		.setContexts(InteractionContextType.Guild),
};

Dans la méthode execute, vous pouvez récupérer la valeur de ces deux options du CommandInteractionOptionResolver comme montré ci-dessous :

commands/moderation/ban.js
module.exports = {
	// data: new SlashCommandBuilder()...
	async execute(interaction) {
|	const target = interaction.options.getUser('target');
|	const reason = interaction.options.getString('reason') ?? 'Aucune raison fournie';
|
|	await interaction.reply(`Bannissement de ${target.username} pour la raison : ${reason}`);
|	await interaction.guild.members.ban(target);
	},
};

Puisque reason n'est pas une option obligatoire, l'exemple ci-dessus utilise l'opérateur ?? nullish coalescing pour définir une valeur par défaut au cas où l'utilisateur ne fournit pas de valeur pour reason.

Si l'utilisateur cible se trouve toujours dans la guílde où la commande est exécutée, vous pouvez également utiliser .getMember('target') pour obtenir son objet GuildMember.

Si vous voulez l'ID (Flocon de neige) d'une structure à la place, récupérez l'option via get() et accédez au Flocon de neige via la propriété value. Notez que vous devriez utiliser const { value: name } = ... ici pour destructurer et renommer la valeur obtenue de la structure CommandInteractionOption pour éviter les conflits de noms d'identifiants.

De la même manière que les exemples ci-dessus, vous pouvez obtenir les valeurs de n'importe quel type en utilisant la méthode CommandInteractionOptionResolver#get_____() correspondante. Les options String, Integer, Number et Boolean fournissent toutes les types primitifs respectifs, tandis que les options User, Channel, Role et Mentionable fournissent soit l'instance de classe discord.js respective si votre application a un utilisateur bot dans la guílde, soit une structure API brute pour les déploiements réservés aux commandes.

Choix

Si vous avez spécifié des choix prédéfinis pour votre option String, Integer ou Number, l'obtention du choix sélectionné est exactement la même que les options d'entrée libre ci-dessus. Considérez l'exemple commande gif que vous avez consulté précédemment :

commands/fun/gif.js
const { SlashCommandBuilder } = require('discord.js');

module.exports = {
	data: new SlashCommandBuilder()
		.setName('gif')
|		.setDescription('Envoie un gif aléatoire !')
|		.addStringOption((option) =>
|
|			option
|				.setName('category')
|				.setDescription('La catégorie gif')
				.setRequired(true)
				.addChoices(
					{ name: 'Funny', value: 'gif_funny' },
					{ name: 'Meme', value: 'gif_meme' },
					{ name: 'Movie', value: 'gif_movie' },
				),
		),

	async execute(interaction) {
|		const category = interaction.options.getString('category');
|		// la catégorie doit être l'un de 'gif_funny', 'gif_meme' ou 'gif_movie'
	},
};

Remarquez que rien ne change - vous utilisez toujours getString() pour obtenir la valeur de choix. La seule différence est qu'en ce cas, vous pouvez être sûr que c'est l'une de trois valeurs possibles.

Sous-commandes

Si vous avez une commande qui contient des sous-commandes, CommandInteractionOptionResolver#getSubcommand() vous dira quelle sous-commande a été utilisée. Vous pouvez ensuite obtenir toutes les options supplémentaires de la sous-commande sélectionnée en utilisant les mêmes méthodes que ci-dessus.

L'extrait ci-dessous utilise la même commande info du guide de création de sous-commande pour démontrer comment vous pouvez contrôler le flux logique lors de la réponse à différentes sous-commandes :

commands/utility/info.js
module.exports = {
	// data: new SlashCommandBuilder()...
	async execute(interaction) {
		if (interaction.options.getSubcommand() === 'user') {
			const user = interaction.options.getUser('target');

|			if (user) {
|				await interaction.reply(`Nom d'utilisateur : ${user.username}\nID : ${user.id}`);
|			} else {
|				await interaction.reply(`Votre nom d'utilisateur : ${interaction.user.username}\nVotre ID : ${interaction.user.id}`);
|			}
|		} else if (interaction.options.getSubcommand() === 'server') {
|			await interaction.reply(
|				`Nom du serveur : ${interaction.guild.name}\nNombre total de membres : ${interaction.guild.memberCount}`,
			);
		}
	},
};