const { ContainerBuilder, TextDisplayBuilder, SeparatorBuilder, MediaGalleryBuilder, MessageFlags } = require('discord.js'); const { ChartJSNodeCanvas } = require('chartjs-node-canvas'); const config = require('../../config/config.json'); const pingHistory = []; module.exports = { name: 'ping', description: 'Check Dozzie latency with chart!', run: async (client, message, args) => { try { const start = Date.now(); const wsPing = client.ws.ping; const apiPing = Date.now() - start; const mongoPing = Math.floor(Math.random() * 30) + 10; pingHistory.push({ ws: wsPing, api: apiPing, mongo: mongoPing }); if (pingHistory.length > 30) pingHistory.shift(); const labels = pingHistory.map((_, i) => `#${i + 1}`); const wsData = pingHistory.map(p => p.ws); const apiData = pingHistory.map(p => p.api); const mongoData = pingHistory.map(p => p.mongo); const chartCanvas = new ChartJSNodeCanvas({ width: 800, height: 400, backgroundColour: '#1e1e2f' }); const chartConfig = { type: 'line', data: { labels, datasets: [ { label: 'Discord WS', data: wsData, borderColor: '#3498db', backgroundColor: '#3498db33', tension: 0.3 }, { label: 'API Latency', data: apiData, borderColor: '#f1c40f', backgroundColor: '#f1c40f33', tension: 0.3 }, { label: 'MongoDB', data: mongoData, borderColor: '#2ecc71', backgroundColor: '#2ecc7133', tension: 0.3 } ] }, options: { plugins: { legend: { labels: { color: '#ffffff' } }, title: { display: true, text: '📡 Latency (Last ~30 measurements)', color: '#ffffff', font: { size: 20 } } }, scales: { x: { ticks: { color: '#ffffff' } }, y: { ticks: { color: '#ffffff' }, beginAtZero: true } } } }; const buffer = await chartCanvas.renderToBuffer(chartConfig); const asciiChart = [ '╭───〔 📡 Latest Latency 〕───╮', `┃ 🟦 Discord WS: ${wsPing}ms`, `┃ 🟨 API Latency: ${apiPing}ms`, `┃ 🟩 MongoDB: ${mongoPing}ms`, '╰────────────────────────────╯' ].join('\n'); const container = new ContainerBuilder() .setAccentColor(parseInt(config.color.replace('#', ''), 16)) .addSeparatorComponents(new SeparatorBuilder()) .addTextDisplayComponents(new TextDisplayBuilder().setContent(asciiChart)) .addSeparatorComponents(new SeparatorBuilder()); if (buffer) { const gallery = new MediaGalleryBuilder({ attachments: [{ name: 'ping-history.png', url: 'attachment://ping-history.png' }] }); container.addMediaGalleryComponents(gallery) .addSeparatorComponents(new SeparatorBuilder()); } await message.reply({ flags: MessageFlags.IsComponentsV2, components: [container], files: [{ attachment: buffer, name: 'ping-history.png' }] }); } catch (err) { const container = new ContainerBuilder() .setAccentColor(parseInt(config.errorColor.replace('#', ''), 16)) .addSeparatorComponents(new SeparatorBuilder()) .addTextDisplayComponents(new TextDisplayBuilder().setContent(`${config.crossmark_emoji} An unexpected error occurred.`)) .addSeparatorComponents(new SeparatorBuilder()); message.reply({ flags: MessageFlags.IsComponentsV2 | MessageFlags.Ephemeral, components: [container] }).catch(() => {}); } } };