Revu Général
Ce dépôt contient le bot administration GuerreRP permettant de gérer :
les caisses / lootboxes (création, édition, duplication, attribution, retrait),
le Saison Passe (saisons, récompenses, challenges, logs),
quelques outils Discord (welcome, bouton de rôle, ping, bannissement logique par ID).
🧠 Ce bot est prévu pour fonctionner avec la base GuerreRP et les tables SQL associées (lootbox & saison pass).
🧾Fiche technique
| Élément | Valeur |
|--------------------|-----------------------------------------------|
| Nom du projet | Bot Discord GuerreRP (Admin Lootbox / Season Pass) |
| Nom NPM | `guerrerp` |
| Version | **1.0.0** (package.json & système interne) |
| Langage | **JavaScript (Node.js)** |
| Runtime conseillé | Node.js **18+** |
| Bibliothèques | `discord.js` ^14.14.1 – `mysql2` ^3.14.1 – `dotenv` ^16.5.0 |
| Base de données | MySQL / MariaDB |
| Auteur | **Ducratif** |
| Licence | ISC |📂 Arborescence rapide du projet
⚙️ Configuration
1. Fichier .env
.envExemple (placeholders fournis dans le zip) :
⚠️ Le fichier
db.jslit uniquement ces variables.envet crée unmysql.createPool(...). Ne pas modifierdb.js, tout se fait par.env.
2. Fichier config.json
config.jsonPrincipales clés :
perm: liste d’ID Discord autorisés à utiliser la majorité des commandes (staff / fondateur).welcomeChannelId: salon où le message public de bienvenue sera envoyé.roleId,roleButtonLabel,roleEmbedColor: valeurs par défaut pour la commande/rolebutton.dmWelcomeMessage: message envoyé en DM au nouveau membre.welcomeChannelMessage: message envoyé dans le salon de bienvenue (placeholder{user}remplacé par la mention).presence:status→online,idle,dnd,invisibleactivityName→ texte affichéactivityType→PLAYING,WATCHING,LISTENING,COMPETING,STREAMING
3. Base de données attendue
Le bot utilise les tables suivantes (déjà présentes dans l’écosystème GuerreRP / lootbox) :
lootboxeslootbox_contentslootbox_paymentslootbox_rewardslootbox_saisonpasselootbox_saisonpass_challengeslootbox_saisonpass_rewardslootbox_saisonpass_logsdiscord_usersusers(pour les personnages / identifiants CFX)
ℹ️ Sans ces tables (présent dans la base FiveM), les commandes liées aux caisses et au Season Pass ne fonctionneront pas.
(Meme principe pour tout ce qui communique avec le serveur)
🚀 Démarrage rapide
Installer les dépendances :
Configurer
.envetconfig.json.Déployer les commandes slash (sur la guilde définie dans
config.json.guildId) :
Lancer le bot :
🔄 Système de mise à jour intégré
Dans index.js :
Version interne du bot :
CURRENT_VERSION = '1.0.0'Vérification automatique à chaque ClientReady :
Récupère deux fichiers sur le CDN :
https://cdn.ducratif.com/guerrerpbotdiscord/maj/latest_version.txt→ contient uniquement la dernière version dispo (ex:1.0.1)https://cdn.ducratif.com/guerrerpbotdiscord/maj/update_link.txt→ contient uniquement le lien de téléchargement / release
Compare
CURRENT_VERSIONaveclatest_version.Affiche dans la console :
✅ « Bot GuerreRP à jour » + version installée
ou ⚠️ « Une mise à jour du Bot GuerreRP est disponible ! »
version actuelle → version dispo
lien de mise à jour.
Ce système ne met pas à jour automatiquement le code, il informe seulement.
Ne toucher a rien lié a ceci, vous risquez de faire buger le démarrage du bot, et cela serait bete de ne pas savoir quand une mise a jour est disponible.
👤 Gestion de la présence & bienvenue
Event ready.js
ready.jsÉvénement :
Events.ClientReady(once).Lit
config.presenceet applique :
Gère le cas
STREAMING(requiert une URL si tu veux une vraie présence streaming).
Event guildMemberAdd.js
guildMemberAdd.jsÉvénement :
Events.GuildMemberAdd.Pour chaque nouveau membre non bot :
Envoie un DM avec
config.dmWelcomeMessage(ignore l’erreur si MP fermés).Envoie un message dans le salon
config.welcomeChannelIdavecconfig.welcomeChannelMessageen remplaçant{user}par<@ID>.
🧰 Commandes utilitaires / Discord
/ping
/pingAccès : réservé aux IDs présents dans
config.perm.Description :
Répond Pong!Comportement : répond un message indiquant que le bot Discord GuerreRP est développé par Ducratif (lien Discord inclus).
/rolebutton
/rolebuttonAccès : permission Administrateur (via
setDefaultMemberPermissions).Description :
Envoie un embed avec bouton pour attribuer un rôle.Options :
salon(obligatoire) : salon texte / annonce où publier l’embed.titre(obligatoire) : titre de l’embed.description(obligatoire) : description affichée.couleur(optionnel) : couleur hex (sinonconfig.roleEmbedColor).bouton(optionnel) : texte du bouton (sinonconfig.roleButtonLabel).role(optionnel) : ID du rôle (sinonconfig.roleIddepuisconfig.json).
Logique :
Vérifie que le rôle existe et que le bot peut le gérer (hiérarchie).
Envoie un embed + bouton.
Le click sur le bouton est géré par
componentHandler.jset ajoute / retire le rôle au membre.
🎁 Gestion des caisses / lootboxes
Toutes ces commandes sont protégées par
config.perm→ seuls les IDs listés peuvent les utiliser.
/createbox
/createboxDescription :
Créer une nouvelle caisse via un formulaire.Accès :
config.permuniquement.Logique :
Ouvre un modal
createbox_modalavec plusieurs champs :Nom de la caisse
Description courte
Description longue
Image URL
Catégorie + tags (tags séparés par virgule)
Le traitement du modal (insert SQL dans
lootboxes) se fait dansinteractionHandler.js.
/editbox
/editboxDescription :
Modifier une caisse existante.Options :
id(obligatoire) : ID de la caisse à modifier.
Logique :
Charge la caisse depuis
lootboxes.Affiche un embed récapitulatif :
Titre, description, image, catégorie, tags
Ajoute une rangée de 3 boutons :
⚙️ Général(editbox_general)🎁 Items(editbox_items)💳 Paiements(editbox_payments)
Les clics sur ces boutons ouvrent des modals gérés dans
interactionHandler.jspour :modifier les infos générales de la caisse,
gérer les items de
lootbox_contents,gérer les moyens de paiement de
lootbox_payments.
/duplicatebox
/duplicateboxDescription :
📦 Dupliquer une caisse existante.Options :
id(obligatoire) : ID de la caisse à dupliquer.
Logique :
Copie la ligne de
lootboxes(avec un nouveau nom type “(Dupliquée)” etis_active = 0).Copie toutes les lignes associées dans :
lootbox_contentslootbox_payments
Retourne l’ID de la nouvelle caisse.
/infobox
/infoboxDescription :
Afficher les informations détaillées d’une caisse.Options :
id(obligatoire) : ID de la caisse.
Logique :
Lit
lootboxes,lootbox_contents,lootbox_payments.Envoie un embed incluant :
Nom, descriptions, image
Catégorie
Tags
Liste des moyens de paiement
Liste des items (nom, quantité, rareté)
Footer : ID + statut
Active / Inactive.
/listboxes
/listboxesDescription :
Affiche toutes les caisses.Logique :
Récupère
id,namedepuislootboxes(ordre décroissant).Paginate par blocs de 10 (
pageSize = 10).Envoie un embed :
titre
📦 Liste des caisses (page X/Y)liste des caisses sous le format
• \ID` - Nom`
Ajoute des boutons ⬅️ / ➡️ pour naviguer entre les pages.
La navigation est gérée dans
componentHandler.jsvia des customId du typelistboxes_prev_.../listboxes_next_....
/givebox
/giveboxDescription :
🎁 Attribuer une caisse à un joueur Discord.Options :
boxid(obligatoire) : ID de la caisse.joueur(obligatoire) : utilisateur Discord (mention / sélection).
Logique :
Vérifie que la caisse existe (
lootboxes).Cherche le lien Discord ↔ personnage dans
discord_usersviadiscord_id.Si aucun lien → erreur indiquant que le joueur doit se connecter au serveur au moins une fois.
Si plusieurs personnages sont associés :
Affiche un select menu listant les différents
identifier/ noms.L’attribution finale de la caisse au personnage choisi se fait via
componentHandler.js/lootbox_rewards.
/removebox
/removeboxDescription :
Retirer une caisse non ouverte à un joueur via son ID Discord.Options :
discordid(obligatoire) : ID Discord brut.
Logique :
Récupère tous les
identifierliés à ce Discord dansdiscord_users.Pour chaque identifier, récupère les caisses non réclamées dans
lootbox_rewards(JOIN surlootboxes).Crée un ou plusieurs select menus permettant de choisir la caisse à retirer.
Le retrait effectif (update / delete dans
lootbox_rewards) est géré parcomponentHandler.js.
🎟️ Gestion du Season Pass
/createsaison
/createsaisonDescription :
Créer un nouveau Saison Passe (réservé au staff).Logique :
Ouvre un modal
createsaison_modalavec :Nom de la saison
Description
max_level(niveau max)Date de début (YYYY-MM-DD HH:MM:SS)
Date de fin (YYYY-MM-DD HH:MM:SS)
Insère une nouvelle ligne dans
lootbox_saisonpasse.
/viewsaisons
/viewsaisonsDescription :
Voir et gérer toutes les saisons (paginated).Logique :
Sélectionne toutes les saisons depuis
lootbox_saisonpasse.Paginate par blocs de 5 (
CHUNK_SIZE = 5).Embed page X/Y avec pour chaque saison :
ID, nom, dates, max_level, etc.
Navigation via boutons
⬅️ Préc/Suiv ➡️(viewSeasons_nav_prev_*,viewSeasons_nav_next_*).Ajoute un deuxième row de boutons de gestion (modifier / supprimer) gérés dans
componentHandler.js.
/addsaisonreward
/addsaisonrewardDescription :
Ajouter une reward à un Saison Passe existant.Options :
saison_id(obligatoire) : ID de la saison ciblée.
Logique :
Vérifie que la saison existe (
lootbox_saisonpasse).Ouvre une interface pour choisir le niveau, puis un modal pour définir :
label
type de reward (
reward_type)valeur (
reward_value)quantité (
amount)challenge lié optionnel (
challenge_key)
L’insert dans
lootbox_saisonpass_rewardsest fait dansinteractionHandler.js.
/viewsaisonrewards
/viewsaisonrewardsDescription :
Voir et gérer les rewards d’un Saison Passe (paginated).Options :
saison_id(obligatoire).
Logique :
Vérifie la saison (
lootbox_saisonpasse).Récupère les rewards dans
lootbox_saisonpass_rewards.Génère des pages (chunk par niveau) avec embed détaillé :
niveau, label, type, valeur, quantité, challenge éventuel.
Navigation via
viewRewards_nav_prev_*/viewRewards_nav_next_*.Row de gestion :
bouton
✏️ Modifier(viewRewards_modify_*)bouton
🗑️ Supprimer(viewRewards_delete_*)
La modification / suppression est gérée dans
componentHandler.js/interactionHandler.js.
/addchallenge
/addchallengeDescription :
Ajouter un nouveau défi de saison.Logique :
Ouvre un modal
addChallengeModalavec :challenge_key: clé unique (ex:kill_player)challenge_label: label affiché (ex:Tuer un joueur)challenge_data: valeur numérique (ex: objectif 1–999999)
Insère dans
lootbox_saisonpass_challenges.
/listchallenge
/listchallengeDescription :
Liste tous les challenges saison pass.Logique :
Récupère
id,key,label,type,datadepuislootbox_saisonpass_challenges.Affiche une liste paginée (avec un nombre fixe de challenges par page).
Bouton pour changer le tri :
par date (id décroissant)
ou par type
Boutons ⬅️ / ➡️ pour naviguer (
challenge_prev_page,challenge_next_page).Construction d’embed factorisée via
buildChallengeListEmbedexporté depuis ce fichier (utilisé aussi parinteractionHandler.js).
/viewsaisonlogs
/viewsaisonlogsDescription :
Consulter les logs du Season Pass par client.Logique :
Ouvre un select menu pour choisir le type d’identifiant :
Discord IDCFX Identifier
Ensuite,
componentHandler.jsaffiche les logs trouvés danslootbox_saisonpass_logspour l’utilisateur ciblé :progression, niveaux atteints, récompenses réclamées, etc.
🔨 Modération / Liens compte
/ban_discord
/ban_discordDescription :
Bannir ou débannir un utilisateur (Discord/CFX).Logique :
Affiche un select menu :
Discord IDCFX Identifier
Le flux complet (saisie de l’ID, bannissement / débannissement, enregistrement en base) est géré via
componentHandler.jset les tables correspondantes (par ex.discord_users, table de bans dédiée si présente sur ta base).
🧹 Scripts CLI (maintenance des commandes)
deploy-commands.js→ lit tous les fichiers du dossiercommands/et enregistre les commandes slash sur la guilde définie (guildId).clear-commands.js→ supprime toutes les commandes GUILD de la guilde ciblée.clear-global-commands.js→ supprime toutes les commandes globales du bot.
Ces scripts utilisent DISCORD_TOKEN, config.clientId et config.guildId.
✅ Résumé
Bot Discord Node.js / discord.js v14, entièrement connecté à la base GuerreRP.
Gestion avancée des lootboxes + Season Pass (saisons, rewards, challenges, logs).
Outils Discord intégrés : welcome, ping, bouton de rôle, bannissement logique.
Système de vérification de mise à jour via CDN.
Toutes les commandes sensibles sont protégées par
config.perm.
Mis à jour
Ce contenu vous a-t-il été utile ?
