This commit is contained in:
Louis Mazin 2026-04-16 18:18:22 +02:00
parent ad2f9e7e77
commit b6a94eea6e

View File

@ -14,6 +14,7 @@ const warmingMessageIds = new Set();
const warmupRefreshKeyByMessage = new Map(); const warmupRefreshKeyByMessage = new Map();
let lastKnownStatus = null; let lastKnownStatus = null;
let imageRefreshKey = Date.now(); let imageRefreshKey = Date.now();
const MAX_EMBEDS_PER_MESSAGE = 10;
const getCacheBustValue = () => { const getCacheBustValue = () => {
const bucketSeconds = Number.parseInt(process.env.PINBOARD_CACHE_BUST_SECONDS || '60', 10); 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 => { const waitMs = async (delayMs) => new Promise(resolve => {
setTimeout(resolve, delayMs); setTimeout(resolve, delayMs);
}); });
@ -410,8 +491,15 @@ const update = async (client) => {
await message.edit(payload); await message.edit(payload);
const initialIndex = clampIndex(selectedImageIndexByMessage.get(message.id) ?? 0, pinboardItems.length); const initialIndex = clampIndex(selectedImageIndexByMessage.get(message.id) ?? 0, pinboardItems.length);
runVisualWarmup(message, status, pinboardItems, initialIndex, imageRefreshKey) runRemoteWarmup(client, pinboardItems, imageRefreshKey)
.catch(error => console.log(`⚠️ Warm-up visuel en erreur: ${error.message}`)); .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})`); console.log(`📊 Panneau Minecraft mis a jour (${status.playersOnline}/${status.playersMax})`);
} catch (error) { } catch (error) {