Merge feature/organizer-stream-link in main

This commit is contained in:
mregosar committed 2026-10-26 00:24:41 +01:00
commit d2a811f177
3 files changed
+7

No files matched your search

+2
View File
@@ -29,6 +29,8 @@ export default function OrganizerPanel({ state, act, busy, matchId, token }) {
<div className="stream-link"> <div className="stream-link">
<CopyField label="Stream-Übersicht (als Browserquelle in OBS, 1920×1080)" value={links.stream} /> <CopyField label="Stream-Übersicht (als Browserquelle in OBS, 1920×1080)" value={links.stream} />
<a className="btn btn-sm" href={links.stream} target="_blank" rel="noreferrer">Stream-Ansicht öffnen</a> <a className="btn btn-sm" href={links.stream} target="_blank" rel="noreferrer">Stream-Ansicht öffnen</a>
<CopyField label="Match-Übersicht (nur dieses Match, ohne Zuschauercode)" value={links.overview} />
<a className="btn btn-sm" href={links.overview} target="_blank" rel="noreferrer">Match-Übersicht öffnen</a>
</div> </div>
)} )}
</div> </div>
+2
View File
@@ -796,6 +796,8 @@ export class MatchService extends EventEmitter {
spectator: `${base}/watch/${formatCode(match.code_spectator)}`, spectator: `${base}/watch/${formatCode(match.code_spectator)}`,
// Vollbild-Übersicht für den Stream (OBS-Browserquelle), nutzt den Zuschauercode // Vollbild-Übersicht für den Stream (OBS-Browserquelle), nutzt den Zuschauercode
stream: `${base}/stream/${formatCode(match.code_spectator)}`, 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)}` : ''}`,
}, },
}; };
} }
+3
View File
@@ -107,6 +107,9 @@ test('kompletter Ablauf: Lobby, Berechtigungen, Veto, Server-Konfiguration', asy
const orgView = (await call('GET', `/matches/${id}`, { token: org })).body; const orgView = (await call('GET', `/matches/${id}`, { token: org })).body;
assert.equal(orgView.viewer.role, 'organizer'); assert.equal(orgView.viewer.role, 'organizer');
const { codes } = orgView.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 // Zuschauer- und fremde Codes erlauben keinen Teambeitritt
assert.equal((await call('POST', `/matches/${id}/join`, { body: { code: codes.spectator, nickname: 'spy' } })).status, 403); assert.equal((await call('POST', `/matches/${id}/join`, { body: { code: codes.spectator, nickname: 'spy' } })).status, 403);