From 032c269798c15cd0ed65ff07eb942a583475954a Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sun, 10 Aug 2025 21:15:39 +0200 Subject: [PATCH] =?UTF-8?q?feat(volume):=20Live-Sync=20der=20Lautst=C3=A4r?= =?UTF-8?q?ke=20=C3=BCber=20SSE=20(Broadcast=20bei=20=C3=84nderung=20+=20S?= =?UTF-8?q?napshot);=20Frontend=20reagiert=20auf=20Updates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/index.ts | 6 +++++- web/src/App.tsx | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/server/src/index.ts b/server/src/index.ts index 90da983..99d67ad 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -941,6 +941,8 @@ app.post('/api/volume', (req: Request, res: Response) => { // Kein aktiver Player: nur persistieren für nächste Wiedergabe persistedState.volumes[guildId] = safeVolume; writePersistedState(persistedState); + // Broadcast neue Lautstärke an alle Clients + sseBroadcast({ type: 'volume', guildId, volume: safeVolume }); return res.json({ ok: true, volume: safeVolume, persistedOnly: true }); } state.currentVolume = safeVolume; @@ -950,6 +952,8 @@ app.post('/api/volume', (req: Request, res: Response) => { } persistedState.volumes[guildId] = safeVolume; writePersistedState(persistedState); + // Broadcast neue Lautstärke an alle Clients + sseBroadcast({ type: 'volume', guildId, volume: safeVolume }); return res.json({ ok: true, volume: safeVolume }); } catch (e: any) { console.error('Volume-Fehler:', e); @@ -1075,7 +1079,7 @@ app.get('/api/events', (req: Request, res: Response) => { // Snapshot senden try { - res.write(`data: ${JSON.stringify({ type: 'snapshot', party: Array.from(partyActive), selected: persistedState.selectedChannels ?? {} })}\n\n`); + res.write(`data: ${JSON.stringify({ type: 'snapshot', party: Array.from(partyActive), selected: persistedState.selectedChannels ?? {}, volumes: persistedState.volumes ?? {} })}\n\n`); } catch {} // Ping, damit Proxies die Verbindung offen halten diff --git a/web/src/App.tsx b/web/src/App.tsx index ca441a9..6b7899c 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -106,6 +106,15 @@ export default function App() { setSelected(newVal); } } catch {} + try { + const vols = msg?.volumes || {}; + const cur = selectedRef.current || ''; + const gid = cur ? cur.split(':')[0] : ''; + if (gid && typeof vols[gid] === 'number') { + const v = vols[gid]; + setVolume(v); + } + } catch {} } else if (msg?.type === 'channel') { try { const gid = msg.guildId; @@ -116,6 +125,16 @@ export default function App() { if (curGid === gid) setSelected(`${gid}:${cid}`); } } catch {} + } else if (msg?.type === 'volume') { + try { + const gid = msg.guildId; + const v = msg.volume; + const cur = selectedRef.current || ''; + const curGid = cur ? cur.split(':')[0] : ''; + if (gid && curGid === gid && typeof v === 'number') { + setVolume(v); + } + } catch {} } }); return () => { try { unsub(); } catch {} };