diff --git a/node/server/server.js b/node/server/server.js index e69de29..9107693 100644 --- a/node/server/server.js +++ b/node/server/server.js @@ -0,0 +1,73 @@ +// server/server.js +const express = require('express'); +const http = require('http'); +const path = require('path'); +const WebSocket = require('ws'); +const fs = require('fs'); + +// --- Grundlegende Config --- +const PORT = 3000; +const PUBLIC_DIR = path.join(__dirname, 'public'); +const SPIRITS_DIR = path.join(__dirname, 'spirits'); + +// --- Webserver (Express) --- +const app = express(); +app.use(express.static(PUBLIC_DIR)); + +// API: Liste aller Spirits (mit Name, Beschreibung, Model-URL etc.) +app.get('/api/spirits', (req, res) => { + // z.B. spirit_list.json mit Array aus [{name,desc,modelUrl,...}] + const spiritsMeta = fs.readFileSync(path.join(SPIRITS_DIR, 'spirit_list.json'), 'utf-8'); + res.json(JSON.parse(spiritsMeta)); +}); + +// (Optional) Models/Bilder auch direkt serven: +app.use('/models', express.static(path.join(SPIRITS_DIR, 'models'))); +app.use('/images', express.static(path.join(SPIRITS_DIR, 'images'))); + +// --- HTTP Server + WebSocket --- +const server = http.createServer(app); +const wss = new WebSocket.Server({ server }); + +let clients = []; +let currentSpirit = null; +let nextSpiritTimeout = null; + +wss.on('connection', (ws) => { + clients.push(ws); + console.log('Client connected:', clients.length, 'total'); + // Beim Connect sofort aktuellen Spirit senden: + if (currentSpirit) ws.send(JSON.stringify({ type: 'spirit', data: currentSpirit })); + + ws.on('close', () => { + clients = clients.filter(c => c !== ws); + }); +}); + +// Helper: Broadcast an alle +function broadcastSpirit(spiritObj) { + const msg = JSON.stringify({ type: 'spirit', data: spiritObj }); + clients.forEach(ws => { try { ws.send(msg); } catch {} }); +} + +// --- Spirit-Steuerung --- +function chooseRandomSpirit() { + const spirits = JSON.parse(fs.readFileSync(path.join(SPIRITS_DIR, 'spirit_list.json'), 'utf-8')); + return spirits[Math.floor(Math.random()*spirits.length)]; +} + +function scheduleNextSpirit() { + const spirit = chooseRandomSpirit(); + currentSpirit = spirit; + broadcastSpirit(spirit); + // Alle 10 Sekunden neues Spirit: + nextSpiritTimeout = setTimeout(scheduleNextSpirit, 10000); +} + +// Starte Zyklus +scheduleNextSpirit(); + +// --- Server Start --- +server.listen(PORT, () => { + console.log(`Server running at http://localhost:${PORT}`); +}); \ No newline at end of file