Fejl (fundet af QA, også i drift siden 7367b72): telefonen huskede
kladderne under nøglen kode:trin:fase, fx "KLMT:0:word". Nøglen går igen i
næste spil i samme rum, og kladderne blev aldrig glemt, så ved "Spil igen"
(og ved skift til Tegn og Gæt igen) stod det ord, man sendte sidst, allerede
i feltet. Nu glemmes kladderne uden for opgaverne (lobby, tema, afsløring,
slut); inden for et trin overlever de stadig en ny render.
Test: tegn.js's afterPlay kørt i node med en lille falsk DOM (springes over
uden node); den fejler på den gamle tegn.js.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 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.dkog indtast koden fra skærmen (eller scan QR-koden). - Vært:
https://party.weircon.dk/host/(Authentik, grupperne Familie og authentik Admins). - Spørgsmål:
https://party.weircon.dk/admin/(Authentik-admins logges ind automatisk).
Sådan virker det
Serveren er autoritativ. Hver skærm har én WebSocket, sender handlinger og får hele spiltilstanden tilbage efter hver ændring (se docs/PROTOCOL.md). Spilmotoren (fupogfakta/engine.py) er ren Python uden I/O og ejer alle regler og timere. Rummene (party/rooms.py) ligger i hukommelsen i én proces, så serveren skal køre med én worker. Et genstart afbryder igangværende spil.
| Mappe | Indhold |
|---|---|
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; spilregistret i games.py |
partyhub/ |
Django-projekt (settings, ASGI) |
deploy/ |
systemd-unit, miljøfil-skabelon og deploy.sh |
Udvikling
python3 -m venv .venv && .venv/bin/pip install -r requirements-dev.txt
export DJANGO_DEBUG=true DEV_HOST_USER=dev
.venv/bin/python manage.py migrate && .venv/bin/python manage.py load_questions
.venv/bin/uvicorn partyhub.asgi:application --reload
.venv/bin/python manage.py test
DEV_HOST_USER lader dig åbne /host/ uden Authentik (kun med DJANGO_DEBUG=true).
Drift
É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, ?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
fupogfakta/data/*.json indlæses med manage.py load_questions (ved hver deploy; matcher på spørgsmålsteksten, så rettelser i admin bevares, medmindre samme spørgsmål ændres i filen). Skriv _____ hvor svaret står, og giv 3 husets løgne.
Den tidligere version (Angular-SPA, REST) ligger på branchen legacy.