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.
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
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;
}
}
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);
}
}
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: '🟠' }
}
};
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
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.