Chapitre 5 - Les commandes (partie 1)
Définition
Les commandes sont devenues un élément très présent dans le fonctionnement de Discord. Elles nous permettent de réaliser beaucoup de chose aussi différentes les unes que les autres. Il n'existe pas de liste de commandes disponibles, car c'est le créateur du bot qui les invente. Dans cettre première partie, nous allons voir comment les créer.
Structure des commandes
Voici la structure que nous allons utiliser lorsque nous allons créer nos fichiers :
require('log-timestamp');
const { SlashCommandBuilder } = require('discord.js'); // Constructeur de notre commande
module.exports = {
data: new SlashCommandBuilder()
.setName('command_name') // Nom de notre commande
.setDescription('descriptoin'), // Description de notre commande
async execute(interaction) { // Lorsque l'on éxécute une commande, on réalise une interaction
/**
* Instruction de l'évènement
*/
},
};
Comme pour les évènement, nous vous conseillons de nommer votre fichier du même nom que celui de votre commande.
La variable interaction contient les informations qui sont transmises lors de l'exécution de la commande. Lorsque vous avez des doutes sur son contenu, n'ouvliez pas d'utiliser la ligne :
console.log();
.
Les réponses
Pour étudier le comportement des réponses, nous allons utiliser la structure suivante dont l'objectif est d'envoyer pong en réponse à la commande :
require('log-timestamp');
const wait = require('node:timers/promises').setTimeout; // Attendre un nombre X de secondes avant de continuer
const { SlashCommandBuilder } = require('discord.js'); // Constructeur de notre commande
module.exports = {
data: new SlashCommandBuilder()
.setName('ping')
.setDescription('Envoi en réponse pong !'),
async execute(interaction) {
/**
* Instruction de l'évènement
*/
},
};
Lorsqu'une intéraction est créé, vous avez maximum 3 secondes pour envoyer une réponse.
Réponse simple
Chaque intéraction par commande que l'on créé nécessite une réponse : si aucune réponse n'est envoyée, Discord va considéré qu'il y a eu une erreur dans la commande.
Pour envoyer du texte dans votre réponse, il faut ajouter la structure suivante :
{
content: "votre message",
}
Si on implément cette structure dans notre code, voici le résultat :
module.exports = {
data: new SlashCommandBuilder()
.setName('ping')
.setDescription('Envoi en réponse pong !'),
async execute(interaction) {
return await interaction.reply({
content: 'pong !'
});
},
};
Réponse privé (hors DM)
Si vous souhaitez que la réponse envoyé ne soit pas publique, il est possible de la rendre privé à l'utilisateur sans forcément là lui envoyer en DM. Pour rendre votre message privé à l'utilisateur, il suffit d'ajouter la clé ephemeral
dans la structure de la réponse :
{
content: "votre message",
ephemeral: true,
}
Si on implément cette structure dans notre code, voici le résultat :
module.exports = {
data: new SlashCommandBuilder()
.setName('ping')
.setDescription('Envoi en réponse pong !'),
async execute(interaction) {
return await interaction.reply({
content: 'pong !',
ephemeral: true,
});
},
};
Modifier sa réponse
Il est possible de modifier la réponse que l'on a envoyé après un temps X (ici 35 secondes). Il faut dans un premier temps envoyer une réponse avec reply()
et dans un second temps utiliser la méthode editReply()
pour la modification. Cette utilisation peut être utile lorsque l'on veut prévenir l'utilisateur que le traitement de sa commande est en cours.
Si on implément cette structure dans notre code, voici le résultat :
module.exports = {
data: new SlashCommandBuilder()
.setName('ping')
.setDescription('Envoi en réponse pong !'),
async execute(interaction) {
await interaction.reply({ // Envoi de la réponse initiale
content: 'Préparation de la réponse !',
});
await wait(3000)5000);
return await interaction.editReply({
content: 'pong !',
});
},
};
Modification du message après 35 secondes :
Une fois la réponse initiale envoyée, vous avez maximum 15 minutes pour effectuer des modifications sur celle-ci !
Réponse différée
La limite pour répondre à une interaction est de 3 secondes. Parfois, certaines opérations peuvent prendre plus de temps, on va donc utiliser la méthode de réponse différéee.
Si on implément cette structure dans notre code, voici le résultat :
module.exports = {
data: new SlashCommandBuilder()
.setName('ping')
.setDescription('Envoi en réponse pong !'),
async execute(interaction) {
await interaction.deferReply();
await wait(4000);
await interaction.editReply({ // Il ne faut pas utiliser de return à ce moment là
content: 'pong !',
});
},
};
Sans l'utilisation de deferReply()
, votre bot risque également de s'arrêter :
Avec l'utilisation de deferReply()
, votre bot risque également de s'arrêter :
Comme pour la modification de réponse, vous disposez de 15 minutes pour envoyé la réponse.
Répondre à sa réponse
Discord nous permet d'envoyer une réponse à la première réponse.
module.exports = {
data: new SlashCommandBuilder()
.setName('ping')
.setDescription('Envoi en réponse pong !'),
async execute(interaction) {
await interaction.reply('Pong!');
await interaction.followUp('Pong again!');
},
};