From b6a94eea6e86a58e110ea0871f64e3d508f5620c Mon Sep 17 00:00:00 2001 From: Louis Mazin Date: Thu, 16 Apr 2026 18:18:22 +0200 Subject: [PATCH] test --- src/pterodactyl/displayer.js | 92 +++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 2 deletions(-) diff --git a/src/pterodactyl/displayer.js b/src/pterodactyl/displayer.js index 080efd5..6e0236f 100644 --- a/src/pterodactyl/displayer.js +++ b/src/pterodactyl/displayer.js @@ -14,6 +14,7 @@ const warmingMessageIds = new Set(); const warmupRefreshKeyByMessage = new Map(); let lastKnownStatus = null; let imageRefreshKey = Date.now(); +const MAX_EMBEDS_PER_MESSAGE = 10; const getCacheBustValue = () => { const bucketSeconds = Number.parseInt(process.env.PINBOARD_CACHE_BUST_SECONDS || '60', 10); @@ -175,6 +176,86 @@ const preloadPinboardImages = async (items) => { } }; +const buildWarmupEmbeds = (items, startIndex, refreshKey) => { + const batchItems = items.slice(startIndex, startIndex + MAX_EMBEDS_PER_MESSAGE); + + return batchItems.map((item, offset) => { + const absoluteIndex = startIndex + offset; + const warmupUrl = toRefreshKeyedUrl(toCacheBustedUrl(item.url), refreshKey); + + return new EmbedBuilder() + .setColor('#1f2937') + .setTitle(`Cache image ${absoluteIndex + 1}/${items.length}`) + .setImage(warmupUrl); + }); +}; + +const resolveWarmupMessage = async (client) => { + const cleanerChannelFallback = (process.env.CLEANER_CHANNEL_IDS || '') + .split(',') + .map(id => id.trim()) + .find(Boolean); + const channelId = process.env.PINBOARD_WARMUP_CHANNEL_ID || cleanerChannelFallback; + const messageId = process.env.PINBOARD_WARMUP_MESSAGE_ID; + + if (!channelId) { + return null; + } + + const channel = await client.channels.fetch(channelId); + if (!channel || !channel.isTextBased()) { + throw new Error(`Salon warm-up non textuel ou introuvable: ${channelId}`); + } + + if (messageId) { + try { + const message = await channel.messages.fetch(messageId); + return { channel, message }; + } catch (error) { + console.log(`⚠️ Message warm-up ${messageId} introuvable. Creation d'un nouveau message.`); + } + } + + const newMessage = await channel.send({ + content: 'Initialisation du cache images...' + }); + + console.log(`✅ Nouveau message warm-up cree: ID ${newMessage.id}`); + console.log(`👉 Ajoute PINBOARD_WARMUP_MESSAGE_ID=${newMessage.id} dans ton .env pour le lier de facon persistante.`); + + return { channel, message: newMessage }; +}; + +const runRemoteWarmup = async (client, pinboardItems, refreshKey) => { + if (!client) return false; + if (pinboardItems.length <= 1) return false; + + const target = await resolveWarmupMessage(client); + if (!target) { + return false; + } + + const { message } = target; + + for (let startIndex = 0; startIndex < pinboardItems.length; startIndex += MAX_EMBEDS_PER_MESSAGE) { + const embeds = buildWarmupEmbeds(pinboardItems, startIndex, refreshKey); + await message.edit({ + content: `Warm-up cache images (${Math.min(startIndex + MAX_EMBEDS_PER_MESSAGE, pinboardItems.length)}/${pinboardItems.length})`, + embeds, + components: [] + }); + } + + await message.edit({ + content: `Warm-up cache termine (${pinboardItems.length} images)`, + embeds: [], + components: [] + }); + + console.log(`🔥 Warm-up distant termine pour message ${message.id}`); + return true; +}; + const waitMs = async (delayMs) => new Promise(resolve => { setTimeout(resolve, delayMs); }); @@ -410,8 +491,15 @@ const update = async (client) => { await message.edit(payload); const initialIndex = clampIndex(selectedImageIndexByMessage.get(message.id) ?? 0, pinboardItems.length); - runVisualWarmup(message, status, pinboardItems, initialIndex, imageRefreshKey) - .catch(error => console.log(`⚠️ Warm-up visuel en erreur: ${error.message}`)); + runRemoteWarmup(client, pinboardItems, imageRefreshKey) + .then(didUseRemoteWarmup => { + if (!didUseRemoteWarmup) { + return runVisualWarmup(message, status, pinboardItems, initialIndex, imageRefreshKey); + } + + return null; + }) + .catch(error => console.log(`⚠️ Warm-up en erreur: ${error.message}`)); console.log(`📊 Panneau Minecraft mis a jour (${status.playersOnline}/${status.playersMax})`); } catch (error) {