Fundet i bot-røgtesten med WPP_TTS_LIVE=off: uden FEST_VOICE_ID taler et fest-spil med standardstemmen, men tts_warm lavede kun de faste fest- replikker (fest-velkomst, fest-reglerne, fest-drillerierne), når der var en fest-stemme. Så var de tavse uden live-kald. Nu laves de altid, med fest-stemmen eller standardstemmen som rummet, og uden at gentage dem, der allerede står i "faste replikker" (56 klip, 2657 tegn uden fest-stemme). Med FEST_VOICE_ID sat er intet ændret. 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).
Speakeren (ElevenLabs) laver replikker med navne live. manage.py tts_warm forvarmer de faste replikker og, under --budget, menuens intro, de generiske replikker uden navne og resten. Med WPP_TTS_LIVE=off bruges kun forvarmede klip; med auto (standard) siges en forvarmet generisk replik, når en replik ikke kan laves live (ingen nøgle, afvist, timeout eller lav saldo). Spørgsmålenes oplæsning og spillernes egne ord har ingen generisk udgave og er tavse, når de ikke er forvarmet. Et nyt spils generiske replikker står i dets narrator/generic.json, nøglet på begivenheden.
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.