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.