From c26a0d52f9cef8f9b266dd349bdecbc96b53f475 Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Tue, 20 Oct 2026 21:50:36 +0200 Subject: [PATCH] Docs: spilregistret, menuen og skift af spil MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PROTOCOL.md: /host/ er menuen (med ?code ved skift), /host/intro/, /host/new's felter pr. spil, "game" i alle snapshots (også Fup og Fakta's) og hvordan et skift af spil virker for telefonerne. README: menuen, skift af spil, hvor et nyt spil registreres, og dev.html?game=menu. Co-Authored-By: Claude Opus 5.5 --- README.md | 8 +++++--- docs/PROTOCOL.md | 28 +++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 90cd1e0..b061954 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Weirsøe Party Protocol -Dansk party-spil i stil med Jackbox. Spillet vises på en storskærm, og spillerne er med fra deres telefoner. Første spil er **Fup og Fakta**: alle finder på en troværdig løgn til et kuriøst faktum, og så skal man finde sandheden blandt løgnene. I **Tegn og Gæt** går kæder af ord, tegninger og gæt bordet rundt, og til sidst ser alle, hvad der blev af det første ord. Værten vælger spil, når det oprettes. +Dansk party-spil i stil med Jackbox. Spillet vises på en storskærm, og spillerne er med fra deres telefoner. Første spil er **Fup og Fakta**: alle finder på en troværdig løgn til et kuriøst faktum, og så skal man finde sandheden blandt løgnene. I **Tegn og Gæt** går kæder af ord, tegninger og gæt bordet rundt, og til sidst ser alle, hvad der blev af det første ord. Værten vælger spil i menuen på storskærmen (piletaster/fjernbetjening, Enter og mus) og kan skifte til et andet spil i samme rum efter podiet, uden at telefonerne skal joine igen. - Spillere: `https://party.weircon.dk` og indtast koden fra skærmen (eller scan QR-koden). - Vært: `https://party.weircon.dk/host/` (Authentik, grupperne Familie og authentik Admins). @@ -14,7 +14,7 @@ Serveren er autoritativ. Hver skærm har én WebSocket, sender handlinger og få | --- | --- | | `fupogfakta/` | Spilmotor, modeller for kategorier og spørgsmål, spørgsmålsbank i `data/*.json` | | `tegnoggaet/` | Spilmotor for Tegn og Gæt, temaer i `data/themes.json`, speakerens replikker | -| `party/` | Rum, WebSocket-consumers, sider, Authentik-header-login, templates og JS/CSS | +| `party/` | Rum, WebSocket-consumers, sider, Authentik-header-login, templates og JS/CSS; spilregistret i `games.py` | | `partyhub/` | Django-projekt (settings, ASGI) | | `deploy/` | systemd-unit, miljøfil-skabelon og `deploy.sh` | @@ -34,7 +34,9 @@ export DJANGO_DEBUG=true DEV_HOST_USER=dev Én uvicorn-proces (`--workers 1`) bag en reverse proxy med TLS. Proxyen beskytter `/host/`, `/ws/host/` og `/admin/` med Authentik forward-auth og sender `X-authentik-username` og `X-authentik-groups` videre; på alle andre stier skal den blanke de headere. Appen stoler kun på dem fra adresserne i `TRUSTED_PROXIES`, så appens port bør kun kunne nås fra proxyen. Se `deploy/wpp.env.example` for miljøvariabler. -`deploy/bots.py` spiller et helt spil mod en kørende server (`--game tegn` for Tegn og Gæt) og kan også fylde et spil op med bots (`--code`). Alle skærme kan ses uden server i `party/static/party/dev.html` (`?game=tegn&phase=draw` for Tegn og Gæt). +`deploy/bots.py` spiller et helt spil mod en kørende server (`--game tegn` for Tegn og Gæt) og kan også fylde et spil op med bots (`--code`). Alle skærme kan ses uden server i `party/static/party/dev.html` (`?game=tegn&phase=draw` for Tegn og Gæt, `?game=menu` for menuen og introerne). + +Et nyt spil registreres i `party/games.py` (navn, tagline, trin, ikon, indstillinger, rum og JS); menuen, `/host/new`, storskærmen og telefonen finder det dér. Kør `WPP_WRITE_FIXTURE=1 DJANGO_DEBUG=true .venv/bin/python manage.py test party.tests.test_games` bagefter, så `dev.html` får det med. ## Spørgsmål diff --git a/docs/PROTOCOL.md b/docs/PROTOCOL.md index dd5faeb..1f70350 100644 --- a/docs/PROTOCOL.md +++ b/docs/PROTOCOL.md @@ -7,8 +7,9 @@ Al spilkommunikation går over én WebSocket pr. skærm. Serveren er autoritativ | Sti | Hvem | Hvad | | --- | --- | --- | | `GET /` | spillere/publikum | Join-side (`?code=ABCD` udfylder koden) | -| `GET /host/` | vært (Authentik) | Opret nyt spil | -| `POST /host/new` | vært | Opretter rum, redirect til `/host//` | +| `GET /host/` | vært (Authentik) | Spilmenuen (`?code=ABCD`: vælg næste spil i et kørende rum) | +| `GET /host/intro/` | vært | Speakerens intro til menuen: `{"url", "ms"}`, eller `{}` uden stemme | +| `POST /host/new` | vært | `game=` + spillets indstillinger (+ `code` ved skift); redirect til `/host//` | | `GET /host//` | vært | Storskærm | | `GET /qr/.svg` | alle | QR-kode til `https:///?code=` | | `WS /ws/play//` | spillere/publikum | | @@ -16,6 +17,26 @@ Al spilkommunikation går over én WebSocket pr. skærm. Serveren er autoritativ Koder er 4 store bogstaver (`BCDFGHJKLMNPQRSTVWXZ`), fx `KLMT`. +## Spillene og skift af spil + +Spillene står i ét register, `party/games.py`: nøgle, navn, tagline, min/max spillere, ca. minutter, trin, ikon, +spillets egne skærme (JS), indstillinger og en funktion, der laver rummet. Menuen, `/host/new`, storskærmen og +telefonen læser derfra; et nyt spil registrerer sig dér, og dets JS melder sig i `window.WPPGameUI[]`. + +| Spil | `game` | Indstillinger på `/host/new` | +| --- | --- | --- | +| Fup og Fakta | `fof` | `pack` = `alle` \| `familie` \| `nørd` \| `arbejde` \| `fest` | +| Tegn og Gæt | `tegn` | `rules` = `1` (vis reglerne først) \| `0` | + +Uden `game` oprettes det første spil i registret (Fup og Fakta); et ukendt spil giver 400, ukendte indstillinger +giver spillets standard. Hvert snapshot, til storskærm og telefon, har `"game"`. + +**Skift af spil:** podiet har "Vælg andet spil", som går til `/host/?code=ABCD`. Menuen sender `code` med, og så +laves det nye spil under samme kode: spillerne kommer med i den rækkefølge de kom, med samme navn og `token`; er der +flere end det nye spils max, bliver resten publikum. Point starter forfra. Telefonerne bliver på deres WebSocket og +får det nye spils lobby som et almindeligt `state`; de skal ikke joine igen, og `resume` med det gamle token virker. +Det gamle rum lukkes. Mens værten er i menuen, viser telefonerne stadig podiet. + ## Klient → server Alle beskeder er JSON `{"action": "...", ...}`. @@ -56,6 +77,7 @@ Fejlkoder: `unknown_room`, `unknown_token`, `name_taken`, `name_invalid`, `not_a ```jsonc { + "game": "fof", // spillets nøgle i party/games.py "code": "KLMT", "phase": "lobby", // lobby | category | intro | lie | present | guess | reveal | scores | final "server_time": 1790000000000,// ms epoch; klienten udregner sin forskydning @@ -198,7 +220,7 @@ Oprettes med `pack=fest` på `/host/new`. Snapshot har altid `fest` (bool). I et ## Tegn og Gæt -Oprettes med `game=tegn` på `/host/new` (uden feltet, eller med `game=fof`, oprettes Fup og Fakta som før). +Oprettes med `game=tegn` på `/host/new` (se [Spillene og skift af spil](#spillene-og-skift-af-spil)). Samme endpoints, samme `join`/`resume`/`ping`/`react`, og samme `joined`/`state`/`error`. Snapshot har `"game": "tegn"`. 3-10 spillere; dem der joiner efter start, bliver publikum (de kan give hjerter).