Refactor server logic to shuffle spirits and manage rotation

This commit is contained in:
2025-05-28 05:59:19 +02:00
parent f0af5fa9d0
commit 0f8512e144

View File

@@ -9,43 +9,61 @@ const app = express();
const server = http.createServer(app);
const wss = new ws.Server({ server });
// Statisches Hosting von /public
app.use(express.static(path.join(__dirname, 'public')));
// --- Spirits laden ---
// --- Spirits laden & shufflen ---
function shuffleArray(arr) {
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
}
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!';
shuffleArray(spirits);
} catch (e) {
console.error('Fehler beim Laden der Spirits:', e);
process.exit(1);
}
let spiritPos = 0;
// --- Helper für die Rotation ---
function nextSpirit() {
spiritPos++;
if (spiritPos >= spirits.length) {
shuffleArray(spirits);
spiritPos = 0;
}
}
// --- WebSocket Logik mit Timer-Steuerung ---
let spiritTimer = null;
let currentSpiritIndex = Math.floor(Math.random() * spirits.length);
function pushSpiritToAllClients() {
const spirit = spirits[currentSpiritIndex];
const spirit = spirits[spiritPos];
const payload = JSON.stringify({ type: 'spirit', data: spirit });
wss.clients.forEach(client => {
if (client.readyState === ws.OPEN) {
client.send(payload);
}
});
console.log(`Spirit "${spirit.Name}" wurde an alle Clients gepusht.`);
// Konsole ruhig etwas ausführlicher
console.log(`[Server] Spirit "${spirit.Name}" gesendet (${spiritPos + 1}/${spirits.length})`);
nextSpirit();
}
// Timer starten, falls noch nicht läuft
function startSpiritTimer() {
if (!spiritTimer) {
spiritTimer = setInterval(() => {
currentSpiritIndex = Math.floor(Math.random() * spirits.length);
pushSpiritToAllClients();
}, 20000);
console.log('Spirit-Timer gestartet');
console.log('[Server] Spirit-Timer gestartet');
}
}
@@ -54,7 +72,10 @@ function stopSpiritTimer() {
if (spiritTimer) {
clearInterval(spiritTimer);
spiritTimer = null;
console.log('Spirit-Timer gestoppt');
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();
}
}
@@ -69,13 +90,15 @@ function hasOpenClients() {
// --- WebSocket Logik ---
wss.on('connection', (socket) => {
console.log('Neuer Client verbunden');
console.log('[Server] Neuer Client verbunden');
// Sende sofort den aktuellen Spirit an neuen Client
socket.send(JSON.stringify({ type: 'spirit', data: spirits[spiritPos] }));
nextSpirit(); // <<-- WICHTIG: Auch beim Connect weiterzählen
// Starte Timer falls das der erste Client ist
if (wss.clients.size === 1) {
startSpiritTimer();
// Sende sofort einen Spirit an den neuen Client
socket.send(JSON.stringify({ type: 'spirit', data: spirits[currentSpiritIndex] }));
}
// Verbindung verloren: Timer ggf. stoppen
@@ -91,5 +114,5 @@ wss.on('connection', (socket) => {
// --- Server Start ---
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`Server läuft auf http://localhost:${PORT}`);
console.log(`[Server] Läuft auf http://localhost:${PORT}`);
});