feat(volume): Live-Sync der Lautstärke über SSE (Broadcast bei Änderung + Snapshot); Frontend reagiert auf Updates
This commit is contained in:
parent
ef67c712fe
commit
032c269798
2 changed files with 24 additions and 1 deletions
|
|
@ -941,6 +941,8 @@ app.post('/api/volume', (req: Request, res: Response) => {
|
||||||
// Kein aktiver Player: nur persistieren für nächste Wiedergabe
|
// Kein aktiver Player: nur persistieren für nächste Wiedergabe
|
||||||
persistedState.volumes[guildId] = safeVolume;
|
persistedState.volumes[guildId] = safeVolume;
|
||||||
writePersistedState(persistedState);
|
writePersistedState(persistedState);
|
||||||
|
// Broadcast neue Lautstärke an alle Clients
|
||||||
|
sseBroadcast({ type: 'volume', guildId, volume: safeVolume });
|
||||||
return res.json({ ok: true, volume: safeVolume, persistedOnly: true });
|
return res.json({ ok: true, volume: safeVolume, persistedOnly: true });
|
||||||
}
|
}
|
||||||
state.currentVolume = safeVolume;
|
state.currentVolume = safeVolume;
|
||||||
|
|
@ -950,6 +952,8 @@ app.post('/api/volume', (req: Request, res: Response) => {
|
||||||
}
|
}
|
||||||
persistedState.volumes[guildId] = safeVolume;
|
persistedState.volumes[guildId] = safeVolume;
|
||||||
writePersistedState(persistedState);
|
writePersistedState(persistedState);
|
||||||
|
// Broadcast neue Lautstärke an alle Clients
|
||||||
|
sseBroadcast({ type: 'volume', guildId, volume: safeVolume });
|
||||||
return res.json({ ok: true, volume: safeVolume });
|
return res.json({ ok: true, volume: safeVolume });
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
console.error('Volume-Fehler:', e);
|
console.error('Volume-Fehler:', e);
|
||||||
|
|
@ -1075,7 +1079,7 @@ app.get('/api/events', (req: Request, res: Response) => {
|
||||||
|
|
||||||
// Snapshot senden
|
// Snapshot senden
|
||||||
try {
|
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 {}
|
} catch {}
|
||||||
|
|
||||||
// Ping, damit Proxies die Verbindung offen halten
|
// Ping, damit Proxies die Verbindung offen halten
|
||||||
|
|
|
||||||
|
|
@ -106,6 +106,15 @@ export default function App() {
|
||||||
setSelected(newVal);
|
setSelected(newVal);
|
||||||
}
|
}
|
||||||
} catch {}
|
} 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') {
|
} else if (msg?.type === 'channel') {
|
||||||
try {
|
try {
|
||||||
const gid = msg.guildId;
|
const gid = msg.guildId;
|
||||||
|
|
@ -116,6 +125,16 @@ export default function App() {
|
||||||
if (curGid === gid) setSelected(`${gid}:${cid}`);
|
if (curGid === gid) setSelected(`${gid}:${cid}`);
|
||||||
}
|
}
|
||||||
} catch {}
|
} 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 {} };
|
return () => { try { unsub(); } catch {} };
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue