Comment construire un bot Discord avec Node.js

L'auteur a choisi le Free and Open Source Fund comme récipiendaire d'un don dans le cadre du programme Write for DOnations.

Introduction

Discord est une application de chat qui permet à des millions d'utilisateurs à travers le monde d'échanger des messages et de s'appeler en ligne au sein de communautés appelées guildes ou serveurs. Discord fournit également une API complète que les développeurs peuvent utiliser pour créer de puissants bots Discord. Les bots peuvent effectuer diverses actions telles que l'envoi de messages aux serveurs, le DM-ing des utilisateurs, la modération des serveurs et la lecture audio dans les chats vocaux. Cela permet aux développeurs de créer des bots puissants qui comprennent des fonctionnalités avancées et complexes comme des outils de modération ou même des jeux. Par exemple, le bot utilitaire Dyno sert des millions de guildes et contient des fonctions utiles telles que la protection contre le spam, un lecteur de musique et d'autres fonctions utilitaires. Apprendre à créer des bots Discord vous permet d'implémenter de nombreuses choses, avec lesquelles des milliers de personnes pourront interagir chaque jour.

Dans ce tutoriel, vous allez construire un bot Discord à partir de zéro, en utilisant Node.js et la bibliothèque Discord.js, qui permet aux utilisateurs d'interagir directement avec l'API Discord. Vous allez créer un profil pour un bot Discord, obtenir des jetons d'authentification pour le bot, et programmer le bot pour lui donner la capacité de traiter les commandes des utilisateurs avec des arguments.

Conditions préalables

Avant de commencer, vous aurez besoin des éléments suivants :

  • Node.js installé sur votre machine de développement. Pour l'installer sur macOS ou Ubuntu 18.04, suivez les étapes du tutoriel Comment installer Node.js et créer un environnement de développement local sur macOS ou la section Installation à l'aide d'un PPA du tutoriel Comment installer Node.js sur Ubuntu 18.04.

  • Tout éditeur de texte de votre choix, tel que Visual Studio Code, Atom, Sublime ou Nano.

  • Un compte Discord gratuit avec un compte de courrier électronique vérifié et un serveur Discord gratuit que vous utiliserez pour tester votre bot Discord.

Étape 1 — Configuration d'un bot Discord

Au cours de cette étape, vous utiliserez l'interface graphique des développeurs Discord pour mettre en place un bot Discord et obtenir le jeton du bot, que vous passerez dans votre programme.

Pour enregistrer un bot sur la plate-forme Discord, utilisez le tableau de bord de l'application Discord. Les développeurs peuvent y créer des applications Discord, y compris des bots Discord.

Image du tableau de bord de l'application Discord après une première visite sur https://discord.com/developers/applications

Pour commencer, cliquez sur New Application (Nouvelle Application). Discord vous demandera d'entrer un nom pour votre nouvelle application. Cliquez ensuite sur Create (Créer) pour créer l'application.

Image de l'invite à créer une application, avec "Test Node.js Bot" saisi comme nom de l'application

Note : le nom de votre application est indépendant du nom du bot, et le bot n'a pas besoin d'avoir le même nom que l'application.

Ouvrez maintenant le tableau de bord de votre application. Pour ajouter un bot à l'application, naviguez dans l'onglet Bot de la barre de navigation, à gauche.

Image de l'onglet bot du tableau de bord de l'application

Cliquez sur le bouton Add Bot (Ajouter un Bot) pour ajouter un bot à l'application. Cliquez sur le bouton Yes, do it! (C'est parti !) lorsqu'il vous demande une confirmation. Vous vous retrouverez alors sur un tableau de bord contenant les détails du nom de votre bot, son jeton d'authentification et sa photo de profil.

Tableau de bord contenant les détails de votre bot

Vous pouvez modifier le nom ou la photo de profil de votre bot ici, sur le tableau de bord. Vous devez également copier le jeton d'authentification du bot en cliquant sur Click to Reveal Token (Cliquer pour révéler le jeton) et en copiant le jeton qui apparaît.

Warning : ne partagez pas, ne téléchargez pas votre jeton de bot, car il permet à n'importe qui de se connecter à votre bot.

Vous devez maintenant créer une invitation qui vous permette d'ajouter les guildes Discord de bots où vous pouvez tester le robot. Tout d'abord, naviguez vers l'onglet OAuth2 du tableau de bord de l'application. Pour créer une invitation, faites défiler l'écran vers le bas et sélectionnez bot sous scopes. Vous devez également définir des autorisations pour contrôler les actions que votre bot peut effectuer dans les guildes. Pour les besoins de ce tutoriel, sélectionnez Administrator (Administrateur), ce qui donnera à votre bot la permission d'effectuer presque toutes les actions dans les guildes. Copiez le lien à l'aide du bouton Copy (Copier).

Onglet OAuth2, avec scope définie sur "bot" et autorisations définies sur "administator".

Ensuite, ajoutez le bot à un serveur. Suivez le lien d'invitation que vous venez de créer. Vous pouvez ajouter le bot à n'importe lequel des serveurs que vous possédez, ou pour lequel vous avez des autorisations d'administrateur, à partir du menu déroulant.

Page suivant le lien d'invitation, permettant aux utilisateurs d'ajouter le bot aux serveurs

Cliquez maintenant sur** Continue** (Continuer). Vérifiez que vous avez coché la case située à côté de Administrator – cela donnera au bot des autorisations d'administrateur. Ensuite, cliquez sur Authorize (Autoriser). Discord vous demandera de résoudre un CAPTCHA avant que le bot ne rejoigne le serveur. Votre bot Discord se trouvera désormais sur la liste des membres du serveur à laquelle vous l'avez ajouté, sous offline.

Liste des membres d'un serveur Discord avec le bot nouvellement créé sous la section "offline" de la liste des membres

Vous avez créé avec succès un robot Discord et l'avez ajouté à un serveur. Ensuite, vous allez écrire un programme pour vous connecter au bot.

Étape 2 — Création de votre projet

Au cours de cette étape, vous allez configurer l'environnement de codage de base dans lequel vous allez construire votre bot et vous connecter au bot par programmation.

Tout d'abord, vous devez créer un dossier de projet et les fichiers de projet nécessaires pour le bot.

Créez votre dossier de projet :

  • mkdir discord-bot

Rendez-vous dans le dossier de projet que vous venez de créer :

  • cd discord-bot

Ensuite, utilisez votre éditeur de texte pour créer un fichier nommé config.json, afin de stocker le jeton d'authentification de votre bot :

  • nano config.json

Ajoutez ensuite le code suivant au fichier de configuration, en remplaçant le texte surligné par le jeton d'authentification de votre bot :

config.json

{     "BOT_TOKEN": "YOUR BOT TOKEN" } 

Enregistrez et quittez le fichier.

Ensuite, vous créerez un fichier package.json, qui stockera les détails de votre projet et des informations sur les dépendances que vous utiliserez pour le projet. Vous allez créer un fichier package.json en exécutant la commande npm suivante :

  • npm init

npm vous demandera différentes informations sur votre projet. Si vous souhaitez obtenir des conseils sur la manière de remplir ces invites, vous trouverez plus d'informations dans la section Comment utiliser les modules Node.js avec npm et package.json.

Vous allez maintenant installer le paquet discord.js que vous utiliserez pour interagir avec l'API Discord. Vous pouvez installer discord.js par le biais de npm avec la commande suivante :

  • npm install discord.js

Maintenant que vous avez configuré le fichier de configuration et installé la dépendance nécessaire, vous êtes prêt à commencer à construire votre bot. Dans une application réelle, un gros bot serait réparti sur plusieurs fichiers, mais pour les besoins de ce tutoriel, le code de votre bot se trouvera dans un seul fichier.

Tout d'abord, créez un fichier nommé index.js dans le dossier discord-bot pour le code :

  • nano index.js

Commencez à coder le bot en demandant la dépendance discord.js et le fichier de configuration avec le jeton du bot :

index.js

const Discord = require("discord.js"); const config = require("./config.json"); 

Ensuite, ajoutez les deux lignes de code suivantes :

index.js

... const client = new Discord.Client();  client.login(config.BOT_TOKEN); 

Enregistrez et fermez votre fichier

La première ligne de code crée un nouveau Discord.Client et l'attribue au client constant. Ce client permet en partie d'interagir avec l'API Discord et de vous informer des événements tels que l'arrivée de nouveaux messages. Le client, en effet, représente le bot Discord.

La deuxième ligne de code utilise la méthode login sur le client pour se connecter au bot Discord que vous avez créé, en utilisant le jeton du fichier config.json comme mot de passe. Le jeton permet à l'API Discord de savoir à quel bot le programme est destiné et que vous avez été authentifié pour utiliser le bot.

Maintenant, exécutez le fichier index.js en utilisant Node :

  • node index.js

Le statut de votre bot passera à online (en ligne) dans le serveur Discord auquel vous l'avez ajouté.

Image du bot en ligne

Vous avez configuré avec succès un environnement de codage et créé le code de base pour vous connecter à un bot Discord. Dans l'étape suivante, vous allez gérer les commandes utilisateur et demander à votre bot d'effectuer des actions, comme l'envoi de messages.

Étape 3 — Traitement de votre première commande utilisateur

Dans cette étape, vous allez créer un bot qui peut gérer les commandes de l'utilisateur. Vous commencerez par configurer votre première commande ping, qui répondra par "pong" et indiquera le temps nécessaire pour répondre à la commande.

Tout d'abord, vous devez détecter et recevoir tout message envoyé par les utilisateurs afin de pouvoir traiter toute commande. En utilisant la méthode on sur le client Discord, Discord vous enverra une notification sur les nouveaux événements. La méthode on prend deux arguments : le nom d'un événement à attendre et une fonction à exécuter chaque fois que cet événement se produit. Avec cette méthode, vous pouvez attendre le message de l'événement – cela se produit chaque fois qu'un message est envoyé à une guilde où le bot a la permission de voir les messages. C'est pourquoi nous allons créer une fonction, qui s'exécute à chaque fois qu'un message est envoyé, pour traiter les commandes.

Tout d'abord, ouvrez votre fichier :

  • nano index.js

Ajoutez le code suivant à votre fichier :

index.js

... const client = new Discord.Client();   client.on("message", function(message) {                                            });                                        client.login(config.BOT_TOKEN); 

Cette fonction, qui s'exécute sur l'événement message, prend message comme paramètre. message aura la valeur d'une instance de message Discord.js, qui contient des informations sur le message envoyé et des méthodes pour aider le bot à répondre.

Ajoutez maintenant la ligne de code suivante à votre fonction de traitement des commandes :

index.js

... client.on("message", function(message) {   if (message.author.bot) return; }); ... 

Cette ligne vérifie si l'auteur du message est un bot, et si c'est le cas, arrête le traitement de la commande. C'est important car, en général, vous ne voulez pas traiter les messages des bots ou y répondre. Les bots n'ont généralement pas besoin ou ne veulent pas utiliser notre bot. Ignorer leurs messages permet donc d'économiser de la puissance de traitement et d'éviter les réponses accidentelles.

Maintenant vous allez écrire un gestionnaire de commandes. Pour ce faire, il est bon de comprendre le format habituel d'une commande Discord. En général, la structure d'une commande Discord contient trois parties dans l'ordre suivant : un préfixe, un nom de commande et (parfois) des arguments de commande.

Une image d'une commande Discord indiquant "! add12"

  • Préfixe : le préfixe peut être de toute nature, mais il s'agit généralement d'un morceau de ponctuation ou d'une phrase abstraite qui ne se trouverait normalement pas au début d'un message. Cela signifie que lorsque vous incluez le préfixe au début du message, le bot saura que l'intention de cette commande est qu'un bot la traite.

  • Nom de la commande : le nom de la commande que l'utilisateur veut utiliser. Cela signifie que le bot peut prendre en charge plusieurs commandes avec des fonctionnalités différentes et permettre aux utilisateurs de choisir entre elles en fournissant un nom de commande différent.

  • Arguments : parfois, si la commande nécessite ou utilise des informations supplémentaires de la part de l'utilisateur, celui-ci peut fournir des arguments après le nom de la commande, chaque argument étant séparé par un espace.

Note : ll n'y a pas de structure de commandes imposée et les bots peuvent traiter les commandes comme ils le souhaitent, mais la structure présentée ici est une structure efficace, que la grande majorité des bots utilise.

Pour commencer à créer un analyseur de commandes qui gère ce format, ajoutez les lignes de code suivantes à la fonction de traitement des messages :

index.js

... const prefix = "!";  client.on("message", function(message) {   if (message.author.bot) return;   if (!message.content.startsWith(prefix)) return; }); ... 

Vous ajoutez la première ligne de code pour attribuer la valeur "!" au prefix de la constante, que vous utiliserez comme préfixe du bot.

La deuxième ligne de code que vous ajoutez vérifie si le contenu du message que le bot traite commence par le préfixe que vous avez défini, et si ce n'est pas le cas, elle empêche la poursuite du traitement du message.

Vous devez maintenant convertir le reste du message en un nom de commande et en arguments qui peuvent exister dans le message. Ajoutez les lignes surlignées suivantes :

index.js

... client.on("message", function(message) {   if (message.author.bot) return;   if (!message.content.startsWith(prefix)) return;    const commandBody = message.content.slice(prefix.length);   const args = commandBody.split(' ');   const command = args.shift().toLowerCase(); }); ... 

Ici, vous utilisez la première ligne pour supprimer le préfixe du contenu du message et attribuer le résultat à la constante commandBody. Cette action est nécessaire, car vous ne voulez pas inclure le préfixe dans le nom de la commande analysée.

La deuxième ligne prend le message dont le préfixe a été supprimé et utilise la méthode split, avec une espace comme séparateur. Cette méthode entraîne la division du message en une série de sous-chaînes de caractères, ce qui fait qu'elle se divise partout où il y a un espace. Cela donne lieu à un tableau contenant le nom de la commande et les arguments, s'ils sont inclus dans le message. Vous assignez ce tableau à la constante args.

La troisième ligne supprime le premier élément du tableau args (qui sera le nom de la commande fournie), le convertit en minuscules, puis l'affecte à la constante command. Cela vous permet d'isoler le nom de la commande et de ne laisser que les arguments dans le tableau. Vous utilisez également la méthode toLowerCase car les commandes sont généralement insensibles à la casse dans les bots Discord.

Vous avez terminé la construction d'un analyseur de commandes, l'implémentation d'un préfixe requis et l'obtention du nom de la commande et des arguments des messages. Vous allez maintenant implémenter et créer le code pour les commandes spécifiques.

Ajoutez le code suivant pour commencer à implémenter la commande ping :

index.js

...   const args = commandBody.split(' ');   const command = args.shift().toLowerCase();    if (command === "ping") {                               }                         }); ... 

Cet énoncé if vérifie si le nom de commande que vous avez analysé (attribué à la constante command) correspond à "ping". Si c'est le cas, cela indique que l'utilisateur veut utiliser la commande "ping". Vous allez imbriquer le code de la commande spécifique à l'intérieur du bloc if. Vous allez répéter ce schéma pour les autres commandes que vous souhaitez implémenter.

Maintenant, vous pouvez implémenter le code pour la commande "ping" :

index.js

...   if (command === "ping") {     const timeTaken = Date.now() - message.createdTimestamp;     message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);   } ... 

Enregistrez et fermez votre fichier

Vous ajoutez le bloc de commande "ping" qui calcule la différence entre l'heure actuelle – trouvée en utilisant la méthode now sur l'objet Date – et l'heure de création du message en millisecondes. Cela permet de calculer le temps de traitement du message et le "ping" du bot.

La deuxième ligne répond à la commande de l'utilisateur en utilisant la méthode reply sur la constante message. La méthode reply envoie un ping à l'utilisateur qui a invoqué la commande (ce qui avertit l'utilisateur et met en évidence le message pour l'utilisateur spécifié), suivi du contenu fourni comme premier argument de la méthode. Vous fournissez un modèle littéral contenant un message et le ping calculé comme réponse que la méthode reply utilisera.

Ceci conclut l'implémentation de la commande "ping".

Exécutez votre bot en utilisant la commande suivante (dans le même dossier que index.js) :

  • node index.js

Vous pouvez maintenant utiliser la commande "! ping" dans n'importe quel canal que le robot peut visualiser et dans lequel il peut envoyer un message, ce qui donne lieu à une réponse.

Image du bot répondant dans Discord à "! ping" avec "@T0M, Pong! This message had a latency of 1128ms."

Vous avez créé avec succès un bot capable de gérer les commandes des utilisateurs et vous avez implémenté votre première commande. Dans l'étape suivante, vous continuerez à développer votre bot en implémentant une commande sum.

Étape 4 — Implémentation de la commande sum

Vous allez maintenant étendre votre programme en implémentant la commande "! sum". La commande prendra un nombre quelconque d'arguments et les additionnera, avant de renvoyer la somme de tous les arguments à l'utilisateur.

Si votre bot Discord fonctionne toujours, vous pouvez arrêter son processus avec CTRL + C.

Ouvrez à nouveau votre fichier index.js :

  • nano index.js

Pour commencer à implémenter la commande "!sum" vous utiliserez le bloc else-if. Après avoir vérifié le nom de la commande ping, il vérifiera si le nom de la commande est égal à "sum". Nous utilisons un bloc “else-if” car une seule commande sera traitée à la fois, donc si le programme correspond au nom de commande "ping", il n'a pas besoin de vérifier la commande "sum". Ajoutez les lignes surlignées suivantes à votre fichier :

index.js

...   if (command === "ping") {     const timeTaken = Date.now() - message.createdTimestamp;     message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);   }    else if (command === "sum") {                                   }                             }); ... 

Vous pouvez commencer à implémenter le code pour la commande "sum". Le code de la commande "sum" ira dans le bloc else-if que vous venez de créer. Maintenant, ajoutez le code suivant :

index.js

...   else if (command === "sum") {     const numArgs = args.map(x => parseFloat(x));     const sum = numArgs.reduce((counter, x) => counter += x);     message.reply(`The sum of all the arguments you provided is ${sum}!`);   } ... 

Vous utilisez la méthode map sur la liste des arguments pour créer une nouvelle liste en utilisant la fonction parseFloat sur chaque élément du tableau args. Cela crée un nouveau tableau (attribué à la constante numArgs) dans lequel tous les éléments sont des nombres au lieu de chaînes de caractères. Cela signifie que vous pouvez ensuite trouver la somme des nombres en les additionnant.

La deuxième ligne utilise la méthode reduce sur la constante numArgs, fournissant une fonction qui totalise tous les éléments de la liste. Vous attribuez la somme de tous les éléments de numArgs à la constante sum.

Vous utilisez ensuite la méthode reply sur l'objet du message pour répondre à la commande de l'utilisateur avec un modèle littéral, qui contient la somme de tous les arguments que l'utilisateur envoie au bot.

Ceci conclut l'implémentation de la commande "sum". Maintenant, exécutez le bot en utilisant la commande suivante (dans le même dossier que index.js) :

  • node index.js

Vous pouvez maintenant utiliser la commande "! sum" dans n'importe quel canal que le bot peut visualiser et dans lequel il peut envoyer des messages.

Image du bot répondant "The sum of all the arguments you provided is 6!" à "! sum 1 2 3", puis répondant "The sum of all the arguments you provided is 13! à "! sum 1.5 1.5 10"

Ce qui suit est une version complète du script du bot index.js :

index.js

const Discord = require("discord.js"); const config = require("./config.json");  const client = new Discord.Client();  const prefix = "!";  client.on("message", function(message) {   if (message.author.bot) return;   if (!message.content.startsWith(prefix)) return;    const commandBody = message.content.slice(prefix.length);   const args = commandBody.split(' ');   const command = args.shift().toLowerCase();    if (command === "ping") {     const timeTaken = Date.now() - message.createdTimestamp;     message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);   }    else if (command === "sum") {     const numArgs = args.map(x => parseFloat(x));     const sum = numArgs.reduce((counter, x) => counter += x);     message.reply(`The sum of all the arguments you provided is ${sum}!`);   } });  client.login(config.BOT_TOKEN); 

Au cours de cette étape, vous avez développé votre bot Discord en implémentant la commande sum.

Conclusion

Vous avez implémenté avec succès un bot Discord qui peut gérer plusieurs commandes utilisateur et arguments différents. Si vous souhaitez développer votre bot, vous pouvez implémenter plus de commandes ou essayer d'autres parties de l'API Discord pour créer un puissant bot Discord. Vous pouvez consulter la documentation de Discord.js ou celle de l'API Discord pour approfondir vos connaissances de l'API Discord.

Lorsque vous créez des bots Discord, vous devez toujours garder à l'esprit les conditions d'utilisation de l'API Discord, qui décrivent comment les développeurs doivent utiliser l'API Discord. Vous pouvez également lire cet ensemble de lignes directrices qui indique la meilleure façon d'implémenter un bot Discord et fournit des conseils sur la façon de concevoir des bots Discord. Si vous souhaitez en savoir plus sur Node.js, consultez notre série Comment coder en Node.js.