Faire un système de niveau avec de l'EXP  9 min  

Bonjour,

Aujourd'hui, nous allons voir pour créer un système d'EXP avec des niveaux pour notre bot Discord. Pour cela, sans plus tardé nous allons commencer par les prérequis de ce tutoriel.

Prérequis

Pour commencer, il nous faut Discord.js, sans cela, nous n’allons pas pouvoir continuer le tutoriel, ensuite, pour créer ce système, nous allons utiliser une base de donnée donc, pour ma part, j'utilise MySQL.

Créer une connexion avec MySQL pour notre Bot

Premièrement, nous allons créer une connexion pour connecter la base de donnée a notre bot Discord. Cette connexion, nous allons la mettre une seule fois, car il est inutile de la mettre 2 fois.

const mysql = require("mysql");

var db = mysql.createConnection({
    host: "localhost",
    port: '3306',
    user: "root",
    password: "mon_beau_mdp",
    database: "database",
    charset: "utf8mb4"
});

db.connect(err => {
    if (err) throw err;
    console.log('✅ | La connexion avec la base de données a bien été effectuée!');
});

Mais sans oublié aussi, la ligne suivante :

module.exports = db;

Sans celle-ci, nous n’allons pas pouvoir utiliser la variable "db" dans l'event "message.js"

Message.js - Création du système

Commençons déjà par la base de ce fichier, c’est-à-dire de demander "index.js", mysql, Discord.js ect...

const db = require('../index.js');
const Discord = require("discord.js");

module.exports = (client, message) => {
if (message.author.bot) return;

};

Une fois cela réalisé, nous allons pouvoir mettre notre code qu'il nous faut. C’est-à-dire la vérification de l'utilisateur s'il existe ou non, la vérification du nombre de messages envoyé et le nombre besoin pour passer le "niveau" suivant. Nous pouvons aller encore plus loin pour donner un rôle spécifique a certain passage de niveau. Mais cela sera pour un autre tutoriel.

Base de donnée

Dans la base de donnée, pour les "users", nous allons récolter :
- Le serveur auquel l'utilisateur parle varchar(50)
- Son "id" et non pas son pseudonyme Discord varchar(30)
- Son niveau (par défaut 1) bigint(11)
- Le nombre d'EXP bigint(255)
- Le nombre de messages envoyé depuis son premier message. bigint(255)

Pour ce qui est des serveurs, libre de vous, nous allons ici demander l'id du serveur en varchar(50), pour par exemple des statistiques par la suite.

Mais aussi, pour les niveaux, nous allons faire une table spéciale, au moins nous pouvons en ajouter sans redémarrer le bot.
Pour cela, nous allons demander : id pour son "niveau", et exp_require pour le nombre d'exp besoin pour "Level UP"

Reprenons donc notre début de code, nous allons ajouter le code suivant :

db.query(`SELECT * FROM discord__guilds WHERE guild_id = ${message.guild.id}`, function(err_language, result_language) {
        if (err_language) throw err_language;
        if (result_language.length === 1) {

                //Code pour la suite du tutoriel ICI !

        } else {
					let info = {
							"guild_id": `${message.guild.id}`
					}

					let cmsg;
					db.query('INSERT INTO discord__guilds SET ?', info, (err, result) => {
							if (err) {
									cmsg = "Une erreur est survenue lors de l'enregistrement des données de la guild dans la base de données.";
									console.log(`\n❌ | Je viens de rentrer dans la guild "${message.guild.name}". ` + cmsg + `\n\n`);
									throw err;
							}
							if (result) {
									cmsg = "Les informations ont bien étés enregistrées dans la base de données.";
									console.log(`\n✅ | Je viens de rentrer dans la guild "${message.guild.name}". ` + cmsg);

							}
					});
        }
});

Premièrement, comme ce code l'indique, nous demandons le serveur auquel nous recevons le message, s'il existe (donc == 1), nous continuons à exécuter le code (exemple l'EXP pour ce tutoriel), Dans le cas contraire, on inscrit ce serveur dans notre base de donnée, en cas de serveur "hors ligne" et qu'il n'a pas inscrit ce serveur au par avant.

Désormais, une fois cela réalisé, nous pouvons commencer à vérifier si l'utilisateur qui parle, est bien inscrit dans notre base de donnée

db.query(`SELECT * FROM discord__users WHERE user = '${message.author.id}' AND guild_id = ${message.guild.id}`, function(err_user, result_user) {
    if (err_user) throw err_user;

    if (result_user.length === 1) {

        // Suite du code ici par la suite !

    } else {
        let info_insert = {
                "user": `${message.author.id}`,
                "guild_id": `${message.guild.id}`,
                "niveau": `1`,
                "messages": `1`,
                "xp": `1`
        }

        let cmsg;
        db.query('INSERT INTO discord__users SET ?', info_insert, (err_insert, result_insert) => {
            if (err_insert) {
                cmsg = "Une erreur est survenue lors de l'enregistrement des données de l'utilisateur dans la base de données.";
                console.log(`\n❌ | "${message.author.id}" vient de rejoindre un serveur. ` + cmsg + `\n\n`);
                throw err_insert;
            }
            if (result_insert) {
                cmsg = "Les informations ont bien étés enregistrées dans la base de données.";
                console.log(`\n✅ | "${message.author.id}" vient de rejoindre un serveur. ` + cmsg);
            }
        });
    }
});

Ici rien de plus compliqué, nous refaisons la même chose que le serveur, mais cette fois au membre qui parle, nous vérifions s'il existe ou non.

Désormais, nous allons demander deux variables pour ajouter 1 EXP et 1 message sur l"utilisateur qui vient de mettre son "message". Nous reprenons donc les données SQL (xp et messages) et nous y ajoutons +1. Chose "logique". Cependant, si vous souhaitez faire un random XP, vous êtes libre de le faire. Cela ne changera pas pour la suite.

const xp_update = result_user[0].xp + 1;
const message_update = result_user[0].messages + 1;

Désormais, nous les ajoutons dans la base de donnée, donc nous mettons à jour l'utilisateur, comme ci-dessous.

db.query(`UPDATE discord__users SET xp = '${xp_update}' WHERE user = '${message.author.id}' AND guild_id = ${message.guild.id}`, (err_xp_update) => {
    if (err_xp_update) throw err_xp_update;
});
db.query(`UPDATE discord__users SET messages = '${message_update}' WHERE user = '${message.author.id}' AND guild_id = ${message.guild.id}`, (err_msg_update) => {
    if (err_msg_update) throw err_msg_update;
});

Désormais, nous pouvons attaquer la partie la plus importante, la vérification du nombre d'EXP, pour passer un niveau, la mise à jour du nombre d'EXP, pour le prochain niveau ect...

const new_level = result_user[0].niveau + 1;
db.query(`SELECT * FROM discord__niveaux WHERE id = ${result_user[0].niveau}`, function(err_user_level, result_user_level) {
if (err_user_level) throw err_user_level;
    if (result_user[0].xp > result_user_level[0].exp_require) {
        message.reply(`:clap: <@${message.author.id}> Vous venez de passer niveau ${new_level}`);
        const xp_update_new_lvl = result_user[0].xp - result_user_level[0].exp_require;
        const lvl_update_new_lvl = result_user[0].niveau + 1;
        db.query(`UPDATE discord__users SET xp = '${xp_update_new_lvl}' WHERE user = '${message.author.id}' AND guild_id = ${message.guild.id}`, (err_xp_update_xp) => {
            if (err_xp_update_xp) throw err_xp_update_xp;
        });
        db.query(`UPDATE discord__users SET niveau = '${lvl_update_new_lvl}' WHERE user = '${message.author.id}' AND guild_id = ${message.guild.id}`, (err_msg_update_level) => {
        if (err_msg_update_level) throw err_msg_update_level;
        });
    }
});

Sur ce code, la première chose, nous demandons le niveau de l'utilisateur actuel, nous vérifions si son EXP est supérieur a l'EXP demandé, si c'est le cas, nous le félicitons dans le salon ou il vient de parler. En lui passons le niveau via la variable new_level.

Une fois cela fait, nous mettons à jour cet utilisateur, nous lui supprimons tout son EXP (MAIS PAS SON NOMBRE DE MESSAGES). Nous mettons à jour son niveau également.

Et voilà, votre système est désormais terminé. Nous pouvons comme je l'ai dit au début du tutoriel, rajouter des rôles pour certains paliers, mais ce n'est pas le but de ce tutoriel.

 

A Bientôt !

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