Guide discord.js
Commandes Slash

Réponses de Commande

La façon la plus courante d'envoyer une réponse est d'utiliser la méthode ChatInputCommandInteraction#reply(), comme vous l'avez fait dans les exemples précédents. Cette méthode reconnaît l'interaction et envoie un nouveau message en réponse.

commands/utility/ping.js
module.exports = {
	data: new SlashCommandBuilder().setName('ping').setDescription('Replies with Pong!'),
	async execute(interaction) {
		await interaction.reply('Pong!'); 
	},
};

Initialement, un jeton d'interaction n'est valide que pendant trois secondes, c'est donc la période pendant laquelle vous pouvez utiliser la méthode ChatInputCommandInteraction#reply(). Les réponses qui nécessitent plus de temps ("Réponses déférées") sont expliquées plus loin dans cette page.

Réponses phémérales

Vous ne voulez pas toujours que tout le monde qui a accès au canal voie la réponse d'une commande slash. Précédemment, vous auriez dû envoyer un MP à l'utilisateur pour y parvenir, risquant potentiellement de rencontrer les limites de débit élevées associées aux messages MP, ou tout simplement être dans l'impossibilité de le faire si les MP de l'utilisateur étaient désactivés.

Heureusement, Discord offre un moyen de masquer les messages de réponse de tout le monde sauf de l'exécuteur de la commande slash. Ceci s'appelle un message éphéméral et peut être défini en fournissant flags: MessageFlags.Ephemeral dans les InteractionReplyOptions, comme suit :

client.on(Events.InteractionCreate, async (interaction) => {
	if (!interaction.isChatInputCommand()) return;

	if (interaction.commandName === 'ping') {
		await interaction.reply('Pong!'); 
		await interaction.reply({ content: 'Secret Pong!', flags: MessageFlags.Ephemeral }); 
	}
});

Les réponses éphémérales ne sont disponibles que pour les réponses d'interaction ; une autre excellente raison d'utiliser la nouvelle interface utilisateur de commande slash améliorée.

Édition des réponses

Après avoir envoyé une réponse initiale, vous pouvez vouloir éditer cette réponse pour diverses raisons. Ceci peut être réalisé avec la méthode ChatInputCommandInteraction#editReply() :

Après la réponse initiale, un jeton d'interaction est valide pendant 15 minutes, c'est donc la période pendant laquelle vous pouvez éditer la réponse et envoyer des messages de suivi. Vous ne pouvez pas non plus éditer l'état éphéméral d'un message, assurez-vous donc que votre première réponse définit ceci correctement.

client.on(Events.InteractionCreate, async (interaction) => {
	if (!interaction.isChatInputCommand()) return;

	if (interaction.commandName === 'ping') {
		await interaction.reply('Pong!');
|// faire quelque chose qui prend du temps (requêtes à la base de données, requêtes API, ...)
|		await interaction.editReply('Pong again!'); 
	}
});

In fact, editing your interaction response is necessary to calculate the ping properly for this command.

Réponses déférées

Comme mentionné précédemment, Discord exige une confirmation de votre bot dans les trois secondes selon laquelle l'interaction a été reçue. Sinon, Discord considère que l'interaction a échoué et le jeton devient invalide. Mais que faire si vous avez une commande qui effectue une tâche qui prend plus de trois secondes avant de pouvoir répondre ?

Dans ce cas, vous pouvez utiliser la méthode ChatInputCommandInteraction#deferReply(), qui déclenche le message <application> est en train de penser.... Cela agit également comme la réponse initiale, pour confirmer à Discord que l'interaction a été reçue avec succès et vous donne une période de 15 minutes pour compléter vos tâches avant de répondre.

client.on(Events.InteractionCreate, async (interaction) => {
	if (!interaction.isChatInputCommand()) return;

	if (interaction.commandName === 'ping') {
		await interaction.deferReply(); 
|// vous pouvez faire des choses qui prennent du temps ici (requêtes à la base de données, requêtes API, ...) dont vous avez besoin pour la réponse initiale
|		// vous pouvez prendre jusqu'à 15 minutes, puis le jeton d'interaction devient invalide !
		await interaction.editReply('Pong!'); 
	}
});

Si vous avez une commande qui effectue des tâches plus longues, assurez-vous d'appeler deferReply() aussi tôt que possible.

Notez que si vous voulez que votre réponse soit éphémérale, utilisez flags depuis InteractionDeferReplyOptions ici :

await interaction.deferReply({ flags: MessageFlags.Ephemeral });

Il n'est pas possible d'éditer une réponse pour modifier son état éphéméral une fois envoyée.

Si vous voulez créer une commande ping appropriée, une est disponible dans notre FAQ.

Suivi

Les méthodes reply() et deferReply() sont toutes deux des réponses initiales, qui indiquent à Discord que votre bot a reçu avec succès l'interaction, mais ne peuvent pas être utilisées pour envoyer des messages supplémentaires. C'est là que les messages de suivi entrent en jeu. Après avoir répondu initialement à une interaction, vous pouvez utiliser ChatInputCommandInteraction#followUp() pour envoyer des messages supplémentaires :

Après la réponse initiale, un jeton d'interaction est valide pendant 15 minutes, c'est donc la période pendant laquelle vous pouvez éditer la réponse et envoyer des messages de suivi.

client.on(Events.InteractionCreate, async (interaction) => {
	if (!interaction.isChatInputCommand()) return;

	if (interaction.commandName === 'ping') {
		await interaction.reply('Pong!');
		await interaction.followUp('Pong again!');
	}
});

You can also pass the ephemeral flag to the InteractionReplyOptions:

await interaction.followUp({ content: 'Pong again!', flags: MessageFlags.Ephemeral });

Notez que si vous utilisez followUp() après un deferReply(), le premier suivi édite le message <application> est en train de penser plutôt que d'envoyer un nouveau.

C'est tout, maintenant vous savez tout ce qu'il y a à savoir sur comment répondre aux commandes slash !

Les réponses d'interaction peuvent utiliser des liens masqués (par ex. [text](http://site.com)) dans le contenu du message.

Récupération et suppression des réponses

En plus de répondre à une commande slash, vous pouvez également vouloir supprimer la réponse initiale. Vous pouvez utiliser ChatInputCommandInteraction#deleteReply() pour cela :

await interaction.reply('Pong!');
await interaction.deleteReply();

Enfin, vous pouvez avoir besoin de l'objet Message d'une réponse pour diverses raisons, comme ajouter des réactions. Passez withResponse: true pour obtenir le InteractionCallbackResponse. Vous pouvez ensuite accéder à l'objet Message comme ceci :

const response = await interaction.reply({ content: 'Pong!', withResponse: true });
console.log(response.resource.message);

Vous pouvez également utiliser la méthode ChatInputCommandInteraction#fetchReply() pour récupérer l'instance Message. Notez que cela entraîne un appel API supplémentaire par rapport à withResponse: true :

await interaction.reply('Pong!');
const message = await interaction.fetchReply();
console.log(message);

Réponses localisées

En plus de la capacité à fournir des définitions de commande localisées, vous pouvez également localiser vos réponses. Pour ce faire, obtenez la locale de l'utilisateur avec ChatInputCommandInteraction#locale et répondez en conséquence :

client.on(Events.InteractionCreate, (interaction) => {
	const locales = {
		pl: 'Witaj Świecie!',
		de: 'Hallo Welt!',
	};
|interaction.reply(locales[interaction.locale] ?? 'Bonjour le monde (l\'anglais par défaut)');
});