Planetengenerierung
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
import cron from 'node-cron';
|
||||
import pool from '../db.js';
|
||||
|
||||
/**
|
||||
* Initialisiert alle zeitgesteuerten Hintergrund-Aufgaben (Cronjobs) für die Lobby.
|
||||
* Wird einmalig beim Serverstart aufgerufen.
|
||||
*/
|
||||
export const initLobbyCronJobs = () => {
|
||||
console.log('⏰ Initialisiere Lobby Cronjobs...');
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// CRON: Prüfung geschlossener Sektoren auf freie Kapazitäten
|
||||
// Format: 'Minute Stunde Tag Monat Wochentag'
|
||||
// '0 4 * * *' bedeutet: Jeden Tag exakt um 04:00 Uhr nachts.
|
||||
// --------------------------------------------------------------------------
|
||||
cron.schedule('0 4 * * *', async () => {
|
||||
console.log('🔍 [CRON] Prüfe geschlossene Sektoren auf freie Startplätze...');
|
||||
|
||||
const client = await pool.connect();
|
||||
|
||||
try {
|
||||
// Alle Sektoren finden, deren Registrierung aktuell geschlossen ist
|
||||
const closedSectorsQuery = await client.query(`
|
||||
SELECT id, internal_url, name
|
||||
FROM sectors
|
||||
WHERE registration_open = false
|
||||
`);
|
||||
|
||||
const closedSectors = closedSectorsQuery.rows;
|
||||
|
||||
if (closedSectors.length === 0) {
|
||||
console.log('✅ [CRON] Keine geschlossenen Sektoren gefunden. Nichts zu tun.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Jeden geschlossenen Sektor einzeln über das Netzwerk abfragen
|
||||
for (const sector of closedSectors) {
|
||||
try {
|
||||
const response = await fetch(`${sector.internal_url}/api/internal/slots`);
|
||||
|
||||
if (!response.ok) {
|
||||
console.warn(`⚠️ [CRON] Sektor ${sector.name} hat einen Fehler gemeldet (Status: ${response.status}). Überspringe.`);
|
||||
continue;
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
const freeSlots = data.freeSlots;
|
||||
|
||||
// Auswertung der freien Plätze
|
||||
// Wenn der Sektor wieder mindestens 150 freie Plätze hat, machen wir ihn auf.
|
||||
if (freeSlots >= 150) {
|
||||
console.log(`🔓 [CRON] Sektor ${sector.name} hat ${freeSlots} freie Plätze. Öffne Sektor für Neuregistrierungen!`);
|
||||
|
||||
await client.query(`
|
||||
UPDATE sectors
|
||||
SET registration_open = true
|
||||
WHERE id = $1
|
||||
`, [sector.id]);
|
||||
} else {
|
||||
console.log(`🔒 [CRON] Sektor ${sector.name} hat nur ${freeSlots} freie Plätze (unter 150). Bleibt geschlossen.`);
|
||||
}
|
||||
|
||||
} catch (fetchError) {
|
||||
console.warn(`⚠️ [CRON] Netzwerkfehler bei Abfrage von Sektor ${sector.name}:`, fetchError.message);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ [CRON] Kritischer Datenbank-Fehler beim Prüfen der Sektoren:', error);
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user