Tutoriel Vidéo NodeJS Créer un bot Discord

Télécharger la vidéo Télécharger les sources

On va changer un peu aujourd'hui et nous allons découvrir comment créer un bot pour l'application Discord.

NodeJS & Discord.js

Avant de commencer je voulais faire un point sur le choix de la technologie et de la librairie :

  • NodeJS par sa nature asynchrone, répond parfaitement à la problématique d'un bot. Le processus principal ne se retrouvera pas bloqué par les opérations lentes (comme des appels à l'API, des accès à une base de données ou autre).
  • Discord.js est une librairie complète qui permet de communiquer avec l'API (HTTP et websocket) de manière très naturelle (et elle est bien documentée !).

Création de l'application

Pour interagir avec l'API et créer notre bot il va falloir commencer par obtenir une clef d'API. Pour cela il faut se rendre sur l'espace développeur et créer une nouvelle application.
Une fois cette application créée il faudra appuyer sur le bouton "Create a Bot User" afin de faire exister notre bot en tant qu'utilisateur Discord. Vous aurez alors accès à un "Token" qui vous sera nécessaire pour la suite.

Autoriser le bot à rejoindre le serveur

Afin que le bot puisse interagir avec le serveur il va falloir lui donner les bonnes autorisations. Pour vous faciliter la tâche vous pouvez utiliser ce générateur de permissions qui vous permettra d'obtenir le lien d'autorisation qu'il faudra fournir aux administrateurs qui souhaiteront ajouter votre bot à leur serveur.

Le code !

Maintenant que nous avons le Token et que notre bot est autorisé à accéder au serveur, on va pouvoir le connecter. On commence par télécharger discord.js

npm i --save discord.js

Ensuite, on peut connecter notre bot via l'objet Client.

const Discord = require('discord.js')
const bot = new Discord.Client()

bot.on('ready', function () {
  console.log("Je suis connecté !")
})

bot.login('TOKEN')

Cette objet client va être le point central de notre bot et nous permettra d'écouter divers évènements et de réagir en fonction.

Ping / Pong

Nous allons commencer par écouter les messages qui arrivent et détecter lorsqu'un utilisateur qui écrit le mot ping

bot.on('message', message => {
  if (message.content === 'ping') {
    message.reply('pong !')
  }
})

L'évènement message renvoie en paramètre une instance de Message qui est un objet de Discord.js qui possède plusieurs propriétés et méthodes que vous pouvez utiliser pour intéragir avec l'API.

Bienvenue

Pour souhaiter la bienvenue à vos utilisateurs vous pouvez utiliser l'évènement guildMemberAdd

bot.on('guildMemberAdd', member => {
  member.createDM().then(channel => {
    return channel.send('Bienvenue sur mon serveur ' + member.displayName)
  }).catch(console.error)
  // On pourrait catch l'erreur autrement ici (l'utilisateur a peut être désactivé les MP)
})

Channel Audio

Il est aussi possible de connecter notre bot à un channel voix et de transmettre divers flux audio. Par exemple, lorsque l'utilisateur tape la commande !play https://www.youtube.com/watch?v=kxnHiFZfLfk on souhaite lancer la lecture de la vidéo youtube sur le premier channel voix du serveur.

bot.on('message', message => {

  if (message.content.startsWith('!play')) {
    // On récupère le premier channel audio du serveur
    let voiceChannel = message.guild.channels
      .filter(function (channel) { return channel.type === 'voice' })
      .first()
    // On récupère les arguments de la commande 
    // il faudrait utiliser une expression régulière pour valider le lien youtube
    let args = message.content.split(' ')
    // On rejoint le channel audio
    voiceChannel
      .join()
      .then(function (connection) {
        // On démarre un stream à partir de la vidéo youtube
        let stream = YoutubeStream(args[1])
        stream.on('error', function () {
          message.reply("Je n'ai pas réussi à lire cette vidéo :(")
          connection.disconnect()
        })
        // On envoie le stream au channel audio
        // Il faudrait ici éviter les superpositions (envoie de plusieurs vidéo en même temps)
        connection
          .playStream(stream)
          .on('end', function () {
            connection.disconnect()
          })
      })
  }

})

Vers l'infini et au delà !

Comme vous avez pu le voir à travers ces divers exemples, Discord.js offre des classes pour représenter les différents concepts Discord et permet d'intéragir avec l'API de manière très simplifiée. N'hésitez donc pas à expérimenter.