Skip to main content

Chapitre 5 - Les commandes (partie 1)

Nous rejoindre sur Discord

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 choses 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 cette 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ènements, nous vous conseillons de nommer votre fichier du même nom que celui de votre commande.

La variable interaction contient les informations transmises lors de l'exécution de la commande. Lorsque vous avez des doutes sur son contenu, pensez à 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 interaction est créée, vous avez maximum 3 secondes pour envoyer une réponse.

Réponse simple

Chaque interaction par commande que l'on crée nécessite une réponse : si aucune réponse n'est envoyée, Discord va considérer qu'il y a eu une erreur dans la commande.

Pour envoyer du texte dans votre réponse, utilisez la structure suivante :

{
  content: "votre message",
}

Si on implémente 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({
            content: 'pong !'          
        });
    },
};

Réponse privé (hors DM)

Si vous souhaitez que la réponse envoyée 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, ajoutez la clé ephemeral dans la structure de la réponse :

{
  content: "votre message",
  ephemeral: true,
}

Si on implémente 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({
            content: 'pong !',
            ephemeral: true,          
        });
    },
};

Modifier sa réponse

Il est possible de modifier la réponse que l'on a envoyée après un temps X (ici 5 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.

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(5000);
      
        await interaction.editReply({
            content: 'pong !',
        });
    },
};

Modification du message après 5 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ée.

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({
            content: 'pong !',
        });
    },
};

Sans l'utilisation de deferReply(), votre bot risque également de s'arrêter :

Avec l'utilisation de deferReply() :

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!');
    },
};

Supprimer une réponse

Il est possible de supprimer une réponse que l'on a envoyé.

module.exports = {
    data: new SlashCommandBuilder()
      .setName('ping')
      .setDescription('Envoi en réponse pong !'),
    async execute(interaction) {
        await interaction.reply('Pong!');
		await interaction.deleteReply();
    },
};

Exercice (Facile) - Site internet

Créer une commande /site-internet qui renvoie comme réponse un url vers note site : https://xelyos.fr/

Réponse attendue :

Bonus : essayer d'obtenir le résultat suivant (en cliquant sur le texte, on est redirigé vers la page) :

Exercice (Moyen) - Minuteur

Nous allons créer un minuteur dans un message. L'utilisateur devra utiliser la commande /minuteur et le bot devra réagir de la manière suivante.

  1. Afficher le message : Lancement du minuteur !
  2. Pendant 10 secondes, modifier le premier message en affichant à chaque fois la seconde écoulée (attendre 1 seconde entre chaque modification).
  3. Terminer le message par : Minuteur terminé !

Réponse attendue dans le même message :

Lancement du compteur !
10
9
8
7
6
5
4
3
2
1
Minuteur terminé !

Pour permettre à votre code d'attendre une seconde entre chaque instruction, utiliser wait:

const wait = require('node:timers/promises').setTimeout;

await wait(1000); // 1000ms = 1 seconde