Aller au contenu principal

Guide

Malgré les quelques autres pages de la documentation sur la création de modules, vous n'avez pas compris comment en faire, ou vous souhaitez avoir des instructions plus faciles ? Parfais, c'est ici.

attention

Dans ce guide, nous assumerons que vous avez déjà une instance de Bachero, et quelques notions avec NodeJS et DiscordJS.

Basique

Créé un dossier

La première étape pour créer un module est de créer un dossier.

info

Dans cet exemple, le nom du packet sera com.example.helloworld mais vous devrez utiliser le nom que vous souhaitez lors de la création du votre.

cd modules
mkdir com.example.helloworld

Vous pouvez ensuite l'ouvrir dans un éditeur tel que Visual Studio Code, ou Word pour les vrais chads (vous avez tout compris).

Créé un fichier manifeste

Comme vu dans la page sur les manifestes, vous aurez besoin de créé un fichier manifest.jsonc dans votre dossier.

Nous allons passer très vite sur le sujet puisque de nombreuses informations sont déjà présentes sur la page dédiée.

Le fichier manifeste indiquera à Bachero et aux autres modules certaines informations sur ce que vous êtes en train de créer.

{
// Nom unique, plusieurs modules ne peuvent pas avoir le même nom
"packageName": "com.example.helloworld",

// Nom du module
"name": "Hello World",

// Description du module
"shortDescription": "Ce module ajoute la commande /helloworld",

// Message affiché lorsque le module finit de charger (recommandé de laisser vide)
"onloadMessage": "je suis totalement inutile oui",

// Source (par exemple, lien du module sur GitHub),
"source": "https://bachero.johanstick.fr/docs/modules/guide",

// Liste des fichiers à charger
"files": [
"hello.js"
],

// Liste du/des auteurs du module
"authors": [
{
"name": "vous",
"discordId": "012345678901234567",
"link": "https://example.com"
}
]
}

On peut voir que ce manifeste va demander à Bachero de charger le fichier hello.js au démarrage, on aura donc besoin de le créé.

Créé un fichier hello.js

Vous pouvez donner le nom que vous souhaitez à ce fichier, penser simplement à modifier le nom dans votre fichier manifeste.

Dans ce fichier, nous allons d'abord exporter une fonction servant à créer une commande slash :

// On importe quelques éléments via discord.js
const { SlashCommandBuilder } = require('discord.js')

// Et on exporte ce qu'il faut
module.exports = {
slashInfo: new SlashCommandBuilder()
.setName('helloworld')
.setDescription('Salut tout le monde !'),
}

On va ensuite exporter une fonction execute pour qu'elle puisse devenir utilisable :

// On importe quelques éléments via discord.js
const { SlashCommandBuilder } = require('discord.js')

// Et on exporte ce qu'il faut
module.exports = {
slashInfo: new SlashCommandBuilder()
.setName('helloworld')
.setDescription('Salut tout le monde !'),

async execute(interaction){
interaction.reply('Hello world')
}
}

Une fois que Bachero sera démarré, le module sera chargé et la commande slash sera disponible.

Une fois que vous aurez exécuté la commande slash, Bachero répondra "Hello world".

Aller plus loin : configuration

Modifier son manifeste

Dans votre fichier manifeste, vous pouvez ajouter une configuration. Bachero créé un fichier dans le dossier config permettant de configurer votre module.

<le début de votre fichier manifeste>

"config": [
{
"name": "name",
"type": "string", // boolean, string, number, array, object
"default": "world",
"description": "La commande /helloworld affichera quel nom ?"
}
]

Modifier son code hello.js

Dans votre code, vous n'avez qu'à importer les fonctions Bachero

// On importe quelques éléments
const { SlashCommandBuilder } = require('discord.js')
const bacheroFunctions = require('../../functions')

/* <le reste de votre fichier> */

Vous pouvez ensuite utiliser les méthodes incluses dans Bachero pour obtenir la configuration

// On importe quelques éléments
const { SlashCommandBuilder } = require('discord.js')
const bacheroFunctions = require('../../functions')

// Et on exporte ce qu'il faut
module.exports = {
slashInfo: new SlashCommandBuilder()
.setName('helloworld')
.setDescription('Salut tout le monde !'),

async execute(interaction){
interaction.reply(`Hello ${bacheroFunctions.config.getValue('com.example.helloworld', 'name')}!`)
}
}

Aller plus loin : base de données

Vous pouvez utiliser les fonctions Bachero pour utiliser une base de donnée, vous aurez accès à des opérations (get, has, set, delete, getAll).

Commencez par importer les fonctions Bachero :

// On importe quelques éléments
const { SlashCommandBuilder } = require('discord.js')
const bacheroFunctions = require('../../functions')

/* <le reste de votre fichier> */

Vous pouvez ensuite utiliser votre base de données

// On importe quelques éléments
const { SlashCommandBuilder } = require('discord.js')
const bacheroFunctions = require('../../functions')
const database = bacheroFunctions.database.getDatabase('com.example.helloworld')

// Et on exporte ce qu'il faut
module.exports = {
slashInfo: new SlashCommandBuilder()
.setName('helloworld')
.setDescription('Salut tout le monde !'),

async execute(interaction){
var count = await bacheroFunctions.database.get(database, 'count') || 0
interaction.reply(`Hello ${bacheroFunctions.config.getValue('com.example.helloworld', 'name')} (${count} fois)`)
bacheroFunctions.database.set(database, 'count', count + 1)
}
}

Aller plus loin : cooldown

Les cooldown peuvent empêcher un utilisateur de répéter une commande ou d'effectuer une action de nombreuses fois en un trop faible espace de temps.

info

Le code suivant est repris et contient l'utilisation de la configuration et de la base de données.
Quelques commentaires ont été ajoutés pour une meilleure lisibilité.

Nous utiliserons la méthode checkAndReply permettant de vérifier si un utilisateur est limité, et lui répondre si c'est le cas.

// On importe quelques éléments
const { SlashCommandBuilder } = require('discord.js')
const bacheroFunctions = require('../../functions')
const database = bacheroFunctions.database.getDatabase('com.example.helloworld')

// Et on exporte ce qu'il faut
module.exports = {
slashInfo: new SlashCommandBuilder()
.setName('helloworld')
.setDescription('Salut tout le monde !'),

async execute(interaction){
// Vérifier et répondre si l'utilisateur est limité, sinon on le limite
var checkAndReply = await bacheroFunctions.cooldown.checkAndReply(interaction, 'helloworldUsage')
if(checkAndReply) return; else await bacheroFunctions.cooldown.set('helloworldUsage', interaction.user.id, 5000)

// Obtenir le nombre d'utilisations dans la base de données
var count = await bacheroFunctions.database.get(database, 'count') || 0

// Répondre
interaction.reply(`Hello ${bacheroFunctions.config.getValue('com.example.helloworld', 'name')} (${count} fois)`)

// Redéfinir le nombre avec +1
bacheroFunctions.database.set(database, 'count', count + 1)
}
}

Aller plus loin : obtenir le client

Si vous vous trouvez limité par Bachero et que vous souhaitez effectuer des actions nécessitant l'accès au client DiscordJS, vous pouvez exporter une fonction getClient dans votre module.

attention

Cet exemple a pour but de déconnecter (client.destroy()) le bot lorsqu'il est obtenu. Ce code ne sera donc pas publié sur GitHub.

// On importe quelques éléments
const { SlashCommandBuilder } = require('discord.js')
const bacheroFunctions = require('../../functions')
const database = bacheroFunctions.database.getDatabase('com.example.helloworld')

// Et on exporte ce qu'il faut
module.exports = {
async getClient(client){
console.log(client) // on a le client
client.destroy() // goodbye world
},

slashInfo: new SlashCommandBuilder()
.setName('helloworld')
.setDescription('Salut tout le monde !'),

async execute(interaction){
// Vérifier et répondre si l'utilisateur est limité, sinon on le limite
var checkAndReply = await bacheroFunctions.cooldown.checkAndReply(interaction, 'helloworldUsage')
if(checkAndReply) return; else await bacheroFunctions.cooldown.set('helloworldUsage', interaction.user.id, 5000)

// Obtenir le nombre d'utilisations dans la base de données
var count = await bacheroFunctions.database.get(database, 'count') || 0

// Répondre
interaction.reply(`Hello ${bacheroFunctions.config.getValue('com.example.helloworld', 'name')} (${count} fois)`)

// Redéfinir le nombre avec +1
bacheroFunctions.database.set(database, 'count', count + 1)
}
}

Résultat

Le code source de ce guide est disponible sur GitHub.