circle-exclamation
Base en V1.0.1 Possible bug, merci de rejoindre le serveur Discord !

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

Exemple (placeholders fournis dans le zip) :

⚠️ Le fichier db.js lit uniquement ces variables .env et crée un mysql.createPool(...). Ne pas modifier db.js, tout se fait par .env.


2. Fichier config.json

Principales 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 :

    • statusonline, idle, dnd, invisible

    • activityName → texte affiché

    • activityTypePLAYING, 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) :

  • lootboxes

  • lootbox_contents

  • lootbox_payments

  • lootbox_rewards

  • lootbox_saisonpasse

  • lootbox_saisonpass_challenges

  • lootbox_saisonpass_rewards

  • lootbox_saisonpass_logs

  • discord_users

  • users (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

  1. Installer les dépendances :

  1. Configurer .env et config.json.

  2. Déployer les commandes slash (sur la guilde définie dans config.json.guildId) :

  1. 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_VERSION avec latest_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

  • Événement : Events.ClientReady (once).

  • Lit config.presence et applique :

  • Gère le cas STREAMING (requiert une URL si tu veux une vraie présence streaming).

Event guildMemberAdd.js

  • Événement : Events.GuildMemberAdd.

  • Pour chaque nouveau membre non bot :

    1. Envoie un DM avec config.dmWelcomeMessage (ignore l’erreur si MP fermés).

    2. Envoie un message dans le salon config.welcomeChannelId avec config.welcomeChannelMessage en remplaçant {user} par <@ID>.


🧰 Commandes utilitaires / Discord

/ping

  • Accè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

  • Accè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 (sinon config.roleEmbedColor).

    • bouton (optionnel) : texte du bouton (sinon config.roleButtonLabel).

    • role (optionnel) : ID du rôle (sinon config.roleId depuis config.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.js et 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

  • Description : Créer une nouvelle caisse via un formulaire.

  • Accès : config.perm uniquement.

  • Logique :

    • Ouvre un modal createbox_modal avec 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 dans interactionHandler.js.


/editbox

  • Description : 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.js pour :

      • 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

  • Description : 📦 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)” et is_active = 0).

    • Copie toutes les lignes associées dans :

      • lootbox_contents

      • lootbox_payments

    • Retourne l’ID de la nouvelle caisse.


/infobox

  • Description : 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

  • Description : Affiche toutes les caisses.

  • Logique :

    • Récupère id, name depuis lootboxes (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.js via des customId du type listboxes_prev_... / listboxes_next_....


/givebox

  • Description : 🎁 Attribuer une caisse à un joueur Discord.

  • Options :

    • boxid (obligatoire) : ID de la caisse.

    • joueur (obligatoire) : utilisateur Discord (mention / sélection).

  • Logique :

    1. Vérifie que la caisse existe (lootboxes).

    2. Cherche le lien Discord ↔ personnage dans discord_users via discord_id.

    3. Si aucun lien → erreur indiquant que le joueur doit se connecter au serveur au moins une fois.

    4. 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

  • Description : Retirer une caisse non ouverte à un joueur via son ID Discord.

  • Options :

    • discordid (obligatoire) : ID Discord brut.

  • Logique :

    • Récupère tous les identifier liés à ce Discord dans discord_users.

    • Pour chaque identifier, récupère les caisses non réclamées dans lootbox_rewards (JOIN sur lootboxes).

    • Crée un ou plusieurs select menus permettant de choisir la caisse à retirer.

    • Le retrait effectif (update / delete dans lootbox_rewards) est géré par componentHandler.js.


🎟️ Gestion du Season Pass

/createsaison

  • Description : Créer un nouveau Saison Passe (réservé au staff).

  • Logique :

    • Ouvre un modal createsaison_modal avec :

      • 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

  • Description : 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

  • Description : 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_rewards est fait dans interactionHandler.js.


/viewsaisonrewards

  • Description : 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

  • Description : Ajouter un nouveau défi de saison.

  • Logique :

    • Ouvre un modal addChallengeModal avec :

      • 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

  • Description : Liste tous les challenges saison pass.

  • Logique :

    • Récupère id, key, label, type, data depuis lootbox_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 buildChallengeListEmbed exporté depuis ce fichier (utilisé aussi par interactionHandler.js).


/viewsaisonlogs

  • Description : Consulter les logs du Season Pass par client.

  • Logique :

    • Ouvre un select menu pour choisir le type d’identifiant :

      • Discord ID

      • CFX Identifier

    • Ensuite, componentHandler.js affiche les logs trouvés dans lootbox_saisonpass_logs pour l’utilisateur ciblé :

      • progression, niveaux atteints, récompenses réclamées, etc.


🔨 Modération / Liens compte

/ban_discord

  • Description : Bannir ou débannir un utilisateur (Discord/CFX).

  • Logique :

    • Affiche un select menu :

      • Discord ID

      • CFX Identifier

    • Le flux complet (saisie de l’ID, bannissement / débannissement, enregistrement en base) est géré via componentHandler.js et 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 dossier commands/ 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 ?