const ms = require('ms'); /** * Parse une durée en string (ex: "1h", "2d") en millisecondes * @param {string} duration - Durée à parser * @returns {number|null} - Durée en millisecondes ou null si invalide */ function parseDuration(duration) { if (!duration) return null; try { return ms(duration); } catch { return null; } } /** * Formate une durée en millisecondes en string lisible * @param {number} ms - Durée en millisecondes * @returns {string} - Durée formatée */ function formatDuration(ms) { if (!ms || ms < 0) return 'Permanent'; const seconds = Math.floor(ms / 1000) % 60; const minutes = Math.floor(ms / (1000 * 60)) % 60; const hours = Math.floor(ms / (1000 * 60 * 60)) % 24; const days = Math.floor(ms / (1000 * 60 * 60 * 24)); const months = Math.floor(ms / (1000 * 60 * 60 * 24 * 30)); const years = Math.floor(ms / (1000 * 60 * 60 * 24 * 365)); if (years) return `${years} Année${years > 1 ? 's' : ''}`; if (months) return `${months} Mois`; if (days) return `${days} Jour${days > 1 ? 's' : ''}`; if (hours) return `${hours} Heure${hours > 1 ? 's' : ''}`; if (minutes) return `${minutes} Minute${minutes > 1 ? 's' : ''}`; if (seconds) return `${seconds} Seconde${seconds > 1 ? 's' : ''}`; return 'Instantané'; } /** * Formate l'uptime en string lisible * @param {number} seconds - Uptime en secondes * @returns {string} - Uptime formaté */ function formatUptime(seconds) { const days = Math.floor(seconds / 86400); const hours = Math.floor((seconds % 86400) / 3600); const minutes = Math.floor((seconds % 3600) / 60); const secs = Math.floor(seconds % 60); if (days > 0) return `${days}j ${hours}h ${minutes}m ${secs}s`; if (hours > 0) return `${hours}h ${minutes}m ${secs}s`; if (minutes > 0) return `${minutes}m ${secs}s`; return `${secs}s`; } /** * Trouve un canal de logs dans une guild avec vérification des permissions * @param {Guild} guild - La guild Discord * @returns {TextChannel|null} - Le canal de logs ou null */ function findLogChannel(guild) { const logChannel = guild.channels.cache.find(ch => ch.name === 'logs' && ch.isTextBased()); if (!logChannel) return null; // Vérifier que le bot a les permissions pour envoyer des messages const botMember = guild.members.me; if (!botMember) return null; const permissions = logChannel.permissionsFor(botMember); if (!permissions || !permissions.has(['ViewChannel', 'SendMessages', 'EmbedLinks'])) { return null; } return logChannel; } /** * Envoie un log dans le canal de logs de manière sécurisée * @param {Guild} guild - La guild Discord * @param {Object} embedData - Les données de l'embed à envoyer * @returns {Promise} - true si envoyé, false sinon */ async function sendLog(guild, embedData) { const logChannel = findLogChannel(guild); if (!logChannel) return false; try { await logChannel.send(embedData); return true; } catch (err) { console.warn('⚠️ Impossible d\'envoyer le log dans le canal de logs:', err.message); return false; } } module.exports = { parseDuration, formatDuration, formatUptime, sendLog, };