Comment créer un bon bot Discord avec la séparation des commandes et des events.  6 min  

Bonjour,

Dans ce tutoriel, nous allons voir pour créer un bot discord avec la séparation des "commandes" et des "events". De quoi rendre votre code beaucoup plus propre.

Premièrement, commençons par installer discord.js et ses packages.

npm install discord.js

Je vous conseille d'installer aussi "fs".

npm install fs

Ensuite, nous allons créer notre page "index.js". Cette page va contenir les données qui seront répartie sous plusieurs autres dossiers.

const Discord = require("discord.js");
const client = new Discord.Client();
const fs = require("fs");
const config = require("./config.json");
db = ""; // si vous utilisez une base de donnée (utile si vous regardez les autres tutoriels)

client.commands = new Discord.Collection();
client.aliases = new Discord.Collection();

const loadCommands = module.exports.loadCommands = (dir = "./commands/") => {
    fs.readdir(dir, (error, files) => {
        if (error) return console.log(error);
        files.forEach((file) => {
            if (fs.lstatSync(dir + file).isDirectory()) {
                loadCommands(dir + file + "/");
                return;
            }
            delete require.cache[require.resolve(`${dir}${file}`)];
            let props = require(`${dir}${file}`);
            client.commands.set(props.command.name, props);
            if (props.command.aliases) props.command.aliases.forEach(alias => { client.aliases.set(alias, props.command.name); });
        });
    });
};
loadCommands();

fs.readdir("./events/", (err, files) => {
    if (err) return console.error(err);
    files.forEach(file => {
        const event = require(`./events/${file}`);
        let eventName = file.split(".")[0];
        client.on(eventName, event.bind(null, client));
    });
});

client.login(config.token);

module.exports = db;

Désormais, votre "index.js" est terminé. Comme vous pouvez le voir, nous disposons d'un dossier nommé "commands" et un autre nommé "events". C'est cela qui permettra de séparer vos client.on() et vos commandes.

Désormais, nous allons créer notre "config.json". Ce fichier va contenir notre "token" et notre "version".

{
    "token": "",
    "version": "1.0.0"
}

Désormais, nous pouvons commencer par les "commandes".
Nous allons ici faire une simple commande "ping" => "pong"

Cette commande, nous allons la placer dans un dossier nommé "fun" dans le dossier "commands". Ce qui donne comme résultat final:
"commands/fun/ping.js".

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

module.exports.run = async (client, message, args, prefix, logs) => {

  const m = await message.channel.send("Chargement de votre connexion...");
  m.edit(`La connexion entre vous et le bot est de ${m.createdTimestamp - message.createdTimestamp}ms.
Sinon, le bot en lui même est à ${client.ws.ping}ms`);


}

module.exports.command = {
  name: "ping",
  aliases: ["ping","pong","connexion"],
  permission: "none",
  description: "Vous voulez tester votre connexion !?",
  usage: "ping",
  args: false,
  args_min: 0,
  need_logs: false,
  category: "FUN",
  enabled: true
};

Ici, comme vous pouvez le voir, nous avons mis plusieurs données.
Le nom de la commande, ses "aliases" (pour exécuter la commande également), la permission (si besoin), une description de la commande, si la commande dispose d'arguments ou non. Son minimum. Si la commande a besoin de "logs"...

Désormais, retournons dans le dossier "events". Nous allons créer le message.js (autrement le client.on() des messages.

require('../omnigames.js');
const Discord = require("discord.js");
module.exports = (client, message) => {
if (message.author.bot) return;
let prefix = "dev!";
  if (!message.content.startsWith(prefix)) return;

  let args = message.content.slice(prefix.length).trim().split(/ +/g);
  let cmd = args.shift().toLowerCase();

  let command;
  if (client.commands.has(cmd)) {
    command = client.commands.get(cmd);
  } else if (client.aliases.has(cmd)) {
    command = client.commands.get(client.aliases.get(cmd));
  } else {
    command = client.commands.get("help");
  }

  const logs_channelID = "ID DU CHANNEL";
  // Pense a modifier: 206117019752464384 par ton ID

  const logs = message.guild.channels.cache.find(channel => channel.id === `${logs_channelID}`);

  if (command) {
      if (!command.command.enabled && message.author.id !== "206117019752464384") return message.channel.send(':x: | Vous ne pouvez pas utiliser cette commande pour le moment, elle a été désactivée.');
      if (command.command.category === "OWNER" && message.author.id !== "206117019752464384") return;
      if (command.command.category === "MODERATION" && !message.member.hasPermission("MANAGE_MESSAGES", false, false, false) && message.author.id !== "206117019752464384") return message.channel.send(':x: | Vous n\'avez pas la permission nécessaire pour exécuter cette commande.');

      const permission = command.command.permission;
      if (permission !== "none") {
          if (!message.member.hasPermission(permission)) return message.react('❌');
      }

      if (command.command.args) {
          if (command.command.args_min !== "0") {
              if (args.length < command.command.args_min) return message.channel.send(`:x: | Veuillez définir un message avec plus de ${command.command.args_min} mot(s).`);
          }
      }

      if (command.command.need_logs) {
          if (!logs_channelID) return message.channel.send(`${language.logs_channelID}`);
          if (!logs) return message.channel.send(`${language.logs}`);
      }
  }

  try {
      command.run(client, message, args, prefix, logs);
  } catch (err) {
      throw err;
  }

};

Mais aussi, nous allons créer le fichier ready.js également dans le dossier "events".

const config = require('../config.json');

module.exports = (client) => {

  console.log(`✅ | Le bot est maintenant opérationnel!`);

  client.user.setStatus('online')
  client.user.setPresence({ game: { name: 'Dev-Time 8.0.0' }, status: 'online' })
  client.user.setActivity("Dev-Time | v" + config.version, { type: 'STREAMING', url: 'https://dev-time.eu/' });
  return;
};

Grâce à cela, vous aurez donc un début de bot très "bon". Les commandes comme vos events seront séparé. Si vous souhaitez ajouter une connexion MySQL, il suffit de l'ajouter sur votre fichier "index.js".

Désormais, vous serez au "point" pour tout les autres tutoriels provenant de moi-même. 

Auteur

KilioZ

Étudiant en BTS Travaux Publics au Pas-de-Calais. Fondateur du réseau social Dev-Time, développeur web depuis 2013.


  Discord : Matéo M.#6452   Reddit : KilioZDev