diff --git a/client/src/components/OrganizerPanel.jsx b/client/src/components/OrganizerPanel.jsx index 5c6f8be..a289200 100644 --- a/client/src/components/OrganizerPanel.jsx +++ b/client/src/components/OrganizerPanel.jsx @@ -29,6 +29,8 @@ export default function OrganizerPanel({ state, act, busy, matchId, token }) {
)} diff --git a/server/src/matchService.js b/server/src/matchService.js index 33adac3..4a589d6 100644 --- a/server/src/matchService.js +++ b/server/src/matchService.js @@ -796,6 +796,8 @@ export class MatchService extends EventEmitter { spectator: `${base}/watch/${formatCode(match.code_spectator)}`, // Vollbild-Übersicht für den Stream (OBS-Browserquelle), nutzt den Zuschauercode stream: `${base}/stream/${formatCode(match.code_spectator)}`, + // Stream-Übersicht nur für dieses Match, ohne Zuschauercode (Schlüssel nur wenn gesetzt) + overview: `${base}/stream/match/${match.id}${this.config.streamKey ? `?key=${encodeURIComponent(this.config.streamKey)}` : ''}`, }, }; } diff --git a/server/test/api.test.js b/server/test/api.test.js index 6274e94..4a7f9e8 100644 --- a/server/test/api.test.js +++ b/server/test/api.test.js @@ -107,6 +107,9 @@ test('kompletter Ablauf: Lobby, Berechtigungen, Veto, Server-Konfiguration', asy const orgView = (await call('GET', `/matches/${id}`, { token: org })).body; assert.equal(orgView.viewer.role, 'organizer'); const { codes } = orgView.organizer; + // Match-Übersicht nur für dieses Match, ohne Zuschauercode + assert.match(orgView.organizer.links.overview, new RegExp(`/stream/match/${id}$`)); + assert.ok(!orgView.organizer.links.overview.includes(codes.spectator)); // Zuschauer- und fremde Codes erlauben keinen Teambeitritt assert.equal((await call('POST', `/matches/${id}/join`, { body: { code: codes.spectator, nickname: 'spy' } })).status, 403);