Code Source

Explorez l'architecture moderne et les fonctionnalités avancées de Quest Discord Bot. Code open-source, documentation complète et exemples pratiques.

Code en Développement
Les exemples de code présentés sont des maquettes. Le développement du bot est en cours et certaines fonctionnalités peuvent différer de l'implémentation finale.

Architecture Moderne

Système modulaire et scalable conçu pour la performance et la maintenabilité

Architecture Modulaire

Séparation claire des responsabilités avec des modules indépendants pour les commandes, événements et utilitaires. Facilite la maintenance et l'ajout de nouvelles fonctionnalités.

Base de Données JSON

Système de stockage léger et performant avec sauvegardes automatiques, rotation des backups et optimisation de la structure des données.

Canvas Avancé

Génération d'images dynamiques avec Node Canvas, effets visuels, gradients, animations et gestion optimisée de la mémoire.

Configuration Flexible

Système de configuration en deux couches : .env pour les secrets et config.js pour la logique métier. Hot-reload et validation automatique.

Sécurité Renforcée

Gestion des permissions, validation des entrées, protection contre les injections et système de logs de sécurité.

Performance

Cache intelligent, opérations asynchrones, limitation des taux et monitoring en temps réel des performances système.

Exemples de Code

Découvrez les fonctionnalités clés à travers des exemples de code commentés

Bot Principal - index.js
JavaScript
class AdvancedQuestBot {
    constructor() {
        this.client = new Client({
            intents: [
                GatewayIntentBits.Guilds,
                GatewayIntentBits.GuildMessages,
                GatewayIntentBits.MessageContent,
                GatewayIntentBits.GuildVoiceStates,
                GatewayIntentBits.GuildMembers
            ]
        });

        this.commands = new Collection();
        this.database = this.loadDatabase();
        this.achievements = config.achievements;
        
        // Statistiques en temps réel
        this.stats = {
            messagesProcessed: 0,
            achievementsUnlocked: 0,
            uptime: Date.now()
        };
    }

    async checkAchievements(userId, guildId, guild) {
        const userData = this.getUserData(userId, guildId);
        const newAchievements = [];

        for (const category in this.achievements) {
            for (const achievement of this.achievements[category]) {
                const achievementId = `${category}_${achievement.id}`;
                
                if (!userData.achievements.includes(achievementId)) {
                    const progress = this.getProgress(userData, category, achievement);
                    
                    if (progress >= achievement.requirement) {
                        userData.achievements.push(achievementId);
                        userData.experience += achievement.xp || 100;
                        newAchievements.push({ achievement, category });
                        
                        // Attribution automatique du rôle
                        if (achievement.roleId) {
                            await this.assignRole(guild, userId, achievement.roleId);
                        }
                    }
                }
            }
        }

        if (newAchievements.length > 0) {
            await this.sendAchievementNotification(userId, guildId, newAchievements, guild);
        }

        this.saveDatabase();
        return newAchievements;
    }
}
Génération Canvas - utils/canvas.js
JavaScript
async createAchievementCard(user, achievement, category) {
    const canvas = createCanvas(800, 400);
    const ctx = canvas.getContext('2d');

    // Arrière-plan avec gradient basé sur la rareté
    const rarity = config.rarities[achievement.rarity] || config.rarities.common;
    await this.drawRarityBackground(ctx, 800, 400, rarity);

    // Effet de particules dynamiques
    this.drawParticleEffect(ctx, 800, 400, rarity.color);

    // Avatar utilisateur avec effet glow
    await this.drawGlowingAvatar(ctx, user, 100, 150, 100, rarity.color);

    // Texte principal avec effet 3D
    this.draw3DText(ctx, achievement.name, 250, 180, '48px bold Arial', '#FFFFFF', rarity.color);

    // Description stylisée
    this.drawStyledText(ctx, achievement.description, 250, 230, '24px Arial', '#E0E0E0', 700);

    // Emoji géant avec glow
    this.drawGlowingEmoji(ctx, achievement.emoji || '🏆', 850, 200, 120);

    // Badge de rareté animé
    this.drawRarityBadge(ctx, rarity, 20, 20);

    return canvas.toBuffer();
}

async drawGlowingAvatar(ctx, user, x, y, radius, glowColor) {
    try {
        const avatar = await loadImage(user.displayAvatarURL({ extension: 'png', size: 256 }));
        
        // Effet glow multiple
        ctx.save();
        ctx.shadowColor = glowColor;
        ctx.shadowBlur = 20;
        ctx.beginPath();
        ctx.arc(x + radius, y + radius, radius + 10, 0, Math.PI * 2);
        ctx.fillStyle = glowColor + '40';
        ctx.fill();
        ctx.restore();

        // Avatar circulaire
        ctx.save();
        ctx.beginPath();
        ctx.arc(x + radius, y + radius, radius, 0, Math.PI * 2);
        ctx.closePath();
        ctx.clip();
        ctx.drawImage(avatar, x, y, radius * 2, radius * 2);
        ctx.restore();

        // Bordure animée
        ctx.strokeStyle = glowColor;
        ctx.lineWidth = 4;
        ctx.beginPath();
        ctx.arc(x + radius, y + radius, radius + 2, 0, Math.PI * 2);
        ctx.stroke();

    } catch (error) {
        console.error('Erreur génération avatar:', error);
        // Fallback vers avatar par défaut
        this.drawDefaultAvatar(ctx, x, y, radius);
    }
}
Système de Configuration - config.js
JavaScript
module.exports = {
    // Configuration des couleurs thématiques
    colors: {
        primary: '#FFD700',
        secondary: '#FFA500',
        success: '#00FF7F',
        error: '#FF4444',
        experience: '#9932CC'
    },

    // Système d'expérience et niveaux
    experience: {
        baseXpPerLevel: 1000,
        bonusXpMultiplier: 1.2,
        maxLevel: 100,
        
        rewards: {
            message: 5,
            reaction_given: 2,
            reaction_received: 3,
            voice_minute: 1,
            achievement: 100,
            boost: 500
        }
    },

    // Configuration des exploits par catégorie
    achievements: {
        messages: [
            {
                id: 'bavard_1',
                name: 'BAVARD-E',
                description: 'Envoyez vos premiers messages sur le serveur',
                requirement: 5,
                xp: 100,
                emoji: '💬',
                rarity: 'common',
                roleId: process.env.ROLE_BAVARD_ID
            },
            {
                id: 'eloquent_1',
                name: 'ÉLOQUENT-E',
                description: 'Participez activement aux conversations',
                requirement: 100,
                xp: 300,
                emoji: '🗣️',
                rarity: 'uncommon',
                roleId: process.env.ROLE_ELOQUENT_ID
            }
        ],
        
        voice: [
            {
                id: 'locuteur_1',
                name: 'LOCUTEUR-RICE',
                description: 'Passez du temps de qualité en vocal',
                requirement: 60, // minutes
                xp: 200,
                emoji: '🎤',
                rarity: 'uncommon',
                roleId: process.env.ROLE_LOCUTEUR_ID
            }
        ]
    },

    // Système de rareté avec couleurs
    rarities: {
        common: { name: 'Commun', color: '#FFFFFF', emoji: '⚪' },
        uncommon: { name: 'Peu commun', color: '#1EFF00', emoji: '🟢' },
        rare: { name: 'Rare', color: '#0066FF', emoji: '🔵' },
        epic: { name: 'Épique', color: '#9933FF', emoji: '🟣' },
        legendary: { name: 'Légendaire', color: '#FF6600', emoji: '🟠' }
    }
};
Gestionnaire de Commandes - commands/user/stats.js
JavaScript
module.exports = {
    data: {
        name: 'stats',
        description: 'Affiche vos statistiques détaillées',
        aliases: ['statistiques', 'stat'],
        usage: '[utilisateur]',
        category: 'user',
        cooldown: 30000
    },

    async execute(message, args, bot) {
        const targetUser = message.mentions.users.first() || message.author;
        const userData = bot.getUserData(targetUser.id, message.guild.id);
        
        try {
            // Génération de l'image de profil avec Canvas
            const profileImage = await bot.createProgressCard(
                targetUser.id, 
                message.guild.id, 
                targetUser
            );
            
            const attachment = new AttachmentBuilder(profileImage, { 
                name: 'profile.png' 
            });
            
            // Création de l'embed avec statistiques détaillées
            const embed = new EmbedBuilder()
                .setTitle(`📊 Statistiques de ${targetUser.displayName}`)
                .setDescription(`Progression détaillée sur **${message.guild.name}**`)
                .setColor(config.colors.primary)
                .setImage('attachment://profile.png')
                .addFields([
                    {
                        name: '🏆 Résumé',
                        value: `**Niveau:** ${userData.level}\n**XP:** ${bot.formatNumber(userData.experience)}\n**Exploits:** ${userData.achievements.length}`,
                        inline: true
                    },
                    {
                        name: '📈 Activité',
                        value: `**Messages:** ${bot.formatNumber(userData.messagesCount)}\n**Temps vocal:** ${bot.formatDuration(userData.voiceTime)}\n**Événements:** ${userData.eventsParticipated}`,
                        inline: true
                    },
                    {
                        name: '❤️ Social',
                        value: `**Réactions données:** ${userData.reactionsGiven}\n**Réactions reçues:** ${userData.reactionsReceived}\n**Félicitations:** ${userData.congratulationsSent}/${userData.congratulationsReceived}`,
                        inline: true
                    }
                ])
                .setFooter({ 
                    text: `Membre depuis • ${new Date(userData.joinedAt).toLocaleDateString('fr-FR')}` 
                })
                .setTimestamp();
            
            await message.reply({ embeds: [embed], files: [attachment] });
            
        } catch (error) {
            console.error('Erreur génération profil:', error);
            
            // Fallback vers embed simple
            const fallbackEmbed = new EmbedBuilder()
                .setTitle(`📊 Statistiques de ${targetUser.displayName}`)
                .setThumbnail(targetUser.displayAvatarURL())
                .addFields([
                    { name: '💬 Messages', value: userData.messagesCount.toString(), inline: true },
                    { name: '🎙️ Temps vocal', value: `${userData.voiceTime} min`, inline: true },
                    { name: '🏆 Niveau', value: userData.level.toString(), inline: true }
                ])
                .setColor(config.colors.primary);
            
            await message.reply({ embeds: [fallbackEmbed] });
        }
    }
};

Technologies Utilisées

Stack technique moderne pour des performances optimales

Node.js
Runtime JavaScript côté serveur
Discord.js
Bibliothèque Discord v14
Canvas
Génération d'images dynamiques
JSON Database
Stockage léger et performant
dotenv
Gestion sécurisée des variables
Docker
Conteneurisation optionnelle

Fonctionnalités Techniques

Implémentations avancées et optimisations

Performance Optimisée

Cache intelligent, opérations asynchrones, limitation des taux et monitoring en temps réel pour des performances optimales même avec de gros serveurs.

Hot Reload

Rechargement à chaud des commandes et configurations sans redémarrage du bot. Idéal pour le développement et les mises à jour en production.

Sauvegarde Automatique

Système de backup automatique avec rotation, compression et restauration. Scripts de maintenance inclus pour une gestion simplifiée.

Analytics Avancées

Tracking détaillé des performances, statistiques d'utilisation et métriques système avec tableaux de bord en temps réel.

Architecture Modulaire

Code organisé en modules indépendants avec séparation claire des responsabilités. Facilite la maintenance et l'extension.

Gestion d'Erreurs

Système robuste de gestion d'erreurs avec fallbacks automatiques, logs détaillés et notifications admin en cas de problème.