Organisator kann im selben Browser selbst mitspielen

Ein Aufrufer darf Organisator- und Spieler-Zugang kombinieren
(Authorization + X-Player-Token). Berechtigungen prüfen jetzt einzelne
Merkmale statt einer Rangstufe. In der Lobby gibt es „Selbst mitspielen?“,
Teamlinks funktionieren auch im Organisator-Browser. Online-Status wird
direkt nach dem Beitritt aktualisiert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
SPP UserandClaude Opus 5.5 committed 2026-10-25 17:53:39 +01:00
1 parent 470b12f232
commit 4152f9c0a6
15 files changed
+248 -59

No files matched your search

+23 -6
View File
@@ -1,34 +1,51 @@
// Zugangsdaten pro Match im Browser. Nach Neuladen oder Verbindungsabbruch
// meldet sich der Client damit automatisch wieder an.
//
// Aufbau: { token, kind: 'organizer' | 'player' | 'spectator', playerToken? }
// playerToken gibt es nur beim Organisator, wenn er selbst einem Team beigetreten ist.
const KEY = (matchId) => `cs2mv:match:${matchId}`;
const memory = new Map();
export function getAccess(matchId) {
try {
return JSON.parse(localStorage.getItem(KEY(matchId))) ?? null;
return JSON.parse(localStorage.getItem(KEY(matchId))) ?? memory.get(matchId) ?? null;
} catch {
return null;
return memory.get(matchId) ?? null;
}
}
export function setAccess(matchId, access) {
memory.set(matchId, access);
try {
localStorage.setItem(KEY(matchId), JSON.stringify(access));
} catch {
/* privater Modus – Zugang gilt dann nur für diese Sitzung */
}
memory.set(matchId, access);
}
export function clearAccess(matchId) {
memory.delete(matchId);
try {
localStorage.removeItem(KEY(matchId));
} catch {
/* ignorieren */
}
memory.delete(matchId);
}
const memory = new Map();
export function getToken(matchId) {
return (getAccess(matchId) ?? memory.get(matchId))?.token ?? null;
return getAccess(matchId)?.token ?? null;
}
export function getPlayerToken(matchId) {
return getAccess(matchId)?.playerToken ?? null;
}
/** Spieler-Token neben dem Organisator-Zugang speichern bzw. entfernen (null). */
export function setPlayerToken(matchId, playerToken) {
const access = getAccess(matchId);
if (!access) return;
const next = { ...access };
if (playerToken) next.playerToken = playerToken;
else delete next.playerToken;
setAccess(matchId, next);
}