Refactor server logic to include spirit interval and timestamp

This commit is contained in:
2025-05-28 06:07:24 +02:00
parent dd025b96c8
commit 98fc65b0dc

View File

@@ -11,7 +11,9 @@ const wss = new ws.Server({ server });
app.use(express.static(path.join(__dirname, 'public')));
// --- Spirits laden & shufflen ---
const SPIRITS_PATH = path.join(__dirname, '.', 'spirits', 'spirit_list.json');
let spirits = [];
function shuffleArray(arr) {
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
@@ -19,8 +21,6 @@ function shuffleArray(arr) {
}
}
const SPIRITS_PATH = path.join(__dirname, '.', 'spirits', 'spirit_list.json');
let spirits = [];
try {
spirits = JSON.parse(fs.readFileSync(SPIRITS_PATH, 'utf8'));
if (!Array.isArray(spirits) || spirits.length === 0) throw 'Spirit-Liste leer oder ungültig!';
@@ -31,6 +31,8 @@ try {
}
let spiritPos = 0;
const SPIRIT_INTERVAL_MS = 20000; // 20 Sekunden
let lastSpiritSpawn = Date.now();
// --- Helper für die Rotation ---
function nextSpirit() {
@@ -39,6 +41,7 @@ function nextSpirit() {
shuffleArray(spirits);
spiritPos = 0;
}
lastSpiritSpawn = Date.now();
}
// --- WebSocket Logik mit Timer-Steuerung ---
@@ -46,13 +49,14 @@ let spiritTimer = null;
function pushSpiritToAllClients() {
const spirit = spirits[spiritPos];
const payload = JSON.stringify({ type: 'spirit', data: spirit });
const now = Date.now();
lastSpiritSpawn = now;
const payload = JSON.stringify({ type: 'spirit', data: spirit, ts: now });
wss.clients.forEach(client => {
if (client.readyState === ws.OPEN) {
client.send(payload);
}
});
// Konsole ruhig etwas ausführlicher
console.log(`[Server] Spirit "${spirit.Name}" gesendet (${spiritPos + 1}/${spirits.length})`);
nextSpirit();
}
@@ -62,7 +66,7 @@ function startSpiritTimer() {
if (!spiritTimer) {
spiritTimer = setInterval(() => {
pushSpiritToAllClients();
}, 20000);
}, SPIRIT_INTERVAL_MS);
console.log('[Server] Spirit-Timer gestartet');
}
}
@@ -73,8 +77,6 @@ function stopSpiritTimer() {
clearInterval(spiritTimer);
spiritTimer = null;
console.log('[Server] Spirit-Timer gestoppt');
// Wenn keine Clients mehr da, trotzdem nächsten Spirit vorwählen,
// damit beim nächsten Reload/Join ein anderer kommt!
nextSpirit();
}
}
@@ -92,12 +94,24 @@ function hasOpenClients() {
wss.on('connection', (socket) => {
console.log('[Server] Neuer Client verbunden');
// Sende sofort den aktuellen Spirit an neuen Client
// Zeit seit letztem Spirit-Spawn:
const now = Date.now();
const timeSinceSpawnMs = now - lastSpiritSpawn;
const spirit = spirits[spiritPos];
// Sende Spirit, Zeitdifferenz und Intervall an neuen Client
socket.send(JSON.stringify({
type: 'spirit',
data: spirit,
timeSinceSpawnMs,
spiritIntervalMs: SPIRIT_INTERVAL_MS
}));
nextSpirit();
// Starte Timer falls das der erste Client ist
if (wss.clients.size === 1) {
startSpiritTimer();
socket.send(JSON.stringify({ type: 'spirit', data: spirits[spiritPos] }));
}
// Verbindung verloren: Timer ggf. stoppen