clashroyale-bot/start.js
2025-10-18 08:14:08 +02:00

181 lines
6.9 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const { Client, GatewayIntentBits, Collection, ActivityType } = require('discord.js');
const { readdirSync } = require('fs');
const { join } = require('path');
const chalk = require('chalk');
const cron = require('node-cron');
require('dotenv').config();
// Configuration des couleurs pour les logs
const colors = {
success: chalk.green.bold,
error: chalk.red.bold,
warning: chalk.yellow.bold,
info: chalk.blue.bold,
debug: chalk.magenta.bold,
system: chalk.cyan.bold,
command: chalk.white.bold,
event: chalk.greenBright.bold,
database: chalk.blueBright.bold,
api: chalk.yellowBright.bold,
discord: chalk.hex('#5865F2').bold,
clash: chalk.hex('#FFD700').bold,
trophy: chalk.hex('#FF6B35').bold
};
// Fonction de logging avec couleurs
const logger = {
success: (msg) => console.log(`${colors.success('✅ SUCCESS')} ${chalk.white(msg)}`),
error: (msg) => console.log(`${colors.error('❌ ERROR')} ${chalk.white(msg)}`),
warning: (msg) => console.log(`${colors.warning('⚠️ WARNING')} ${chalk.white(msg)}`),
info: (msg) => console.log(`${colors.info(' INFO')} ${chalk.white(msg)}`),
debug: (msg) => console.log(`${colors.debug('🔍 DEBUG')} ${chalk.white(msg)}`),
system: (msg) => console.log(`${colors.system('⚙️ SYSTEM')} ${chalk.white(msg)}`),
command: (msg) => console.log(`${colors.command('🔧 COMMAND')} ${chalk.white(msg)}`),
event: (msg) => console.log(`${colors.event('📡 EVENT')} ${chalk.white(msg)}`),
database: (msg) => console.log(`${colors.database('🗄️ DATABASE')} ${chalk.white(msg)}`),
api: (msg) => console.log(`${colors.api('🌐 API')} ${chalk.white(msg)}`),
discord: (msg) => console.log(`${colors.discord('🎮 DISCORD')} ${chalk.white(msg)}`),
clash: (msg) => console.log(`${colors.clash('⚔️ CLASH')} ${chalk.white(msg)}`),
trophy: (msg) => console.log(`${colors.trophy('🏆 TROPHY')} ${chalk.white(msg)}`)
};
// Banner d'initialisation
function displayBanner() {
console.clear();
console.log(colors.clash('╔══════════════════════════════════════════════════════════════════╗'));
console.log(colors.clash('║ 🏰 CLASH ROYALE DISCORD BOT 🏰 ║'));
console.log(colors.clash('║ By Neptunia Team ║'));
console.log(colors.clash('╠══════════════════════════════════════════════════════════════════╣'));
console.log(colors.clash('║ 🎮 Discord Integration | ⚔️ Clash Royale API | 🏆 Rankings ║'));
console.log(colors.clash('╚══════════════════════════════════════════════════════════════════╝'));
console.log();
}
// Initialisation du client Discord
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
GatewayIntentBits.GuildMessageReactions
]
});
// Collections pour stocker les handlers
client.commands = new Collection();
client.events = new Collection();
client.components = new Collection();
client.logger = logger;
// Fonction pour charger les handlers
async function loadHandlers() {
const handlerFiles = readdirSync(join(__dirname, 'src', 'handlers')).filter(file => file.endsWith('.js'));
logger.system('Chargement des handlers...');
for (const file of handlerFiles) {
try {
const handler = require(join(__dirname, 'src', 'handlers', file));
await handler(client);
logger.success(`Handler chargé: ${colors.command(file)}`);
} catch (error) {
logger.error(`Erreur lors du chargement du handler ${file}: ${error.message}`);
}
}
}
// Fonction pour initialiser la base de données
async function initializeDatabase() {
try {
const { initDB } = require('./src/utils/database');
await initDB();
logger.database('Base de données initialisée avec succès');
} catch (error) {
logger.error(`Erreur lors de l'initialisation de la base de données: ${error.message}`);
process.exit(1);
}
}
// Fonction pour programmer les tâches automatiques
function scheduleTasks() {
// Vérification des trophées toutes les 30 minutes
cron.schedule('*/30 * * * *', async () => {
try {
const { checkTrophyMilestones } = require('./src/services/trophyService');
await checkTrophyMilestones(client);
logger.system('Vérification des trophées effectuée');
} catch (error) {
logger.error(`Erreur lors de la vérification des trophées: ${error.message}`);
}
});
logger.system('Tâches automatiques programmées (trophées uniquement)');
}
// Fonction principale d'initialisation
async function initialize() {
displayBanner();
logger.system('🚀 Initialisation du bot en cours...');
try {
// Vérification des variables d'environnement
if (!process.env.DISCORD_TOKEN) {
throw new Error('DISCORD_TOKEN manquant dans le fichier .env');
}
if (!process.env.CLASH_ROYALE_TOKEN) {
throw new Error('CLASH_ROYALE_TOKEN manquant dans le fichier .env');
}
logger.success('Variables d\'environnement validées');
// Initialisation de la base de données
await initializeDatabase();
// Chargement des handlers
await loadHandlers();
// Connexion à Discord
logger.discord('Connexion à Discord en cours...');
await client.login(process.env.DISCORD_TOKEN);
} catch (error) {
logger.error(`Erreur fatale lors de l'initialisation: ${error.message}`);
process.exit(1);
}
}
// L'événement ready est géré par src/events/ready.js
// Programmation des tâches automatiques (trophées uniquement)
client.once('ready', () => {
scheduleTasks();
});
// Gestion des erreurs globales
process.on('unhandledRejection', (reason, promise) => {
logger.error(`Promesse rejetée non gérée: ${reason}`);
console.error(promise);
});
process.on('uncaughtException', (error) => {
logger.error(`Exception non capturée: ${error.message}`);
console.error(error);
});
// Gestion de l'arrêt propre
process.on('SIGINT', () => {
logger.warning('Signal SIGINT reçu, arrêt du bot...');
client.destroy();
process.exit(0);
});
process.on('SIGTERM', () => {
logger.warning('Signal SIGTERM reçu, arrêt du bot...');
client.destroy();
process.exit(0);
});
// Démarrage du bot
initialize();