Ren motor i samme stil som Tegn og Gæt (now som parameter, events til speakeren, snapshot pr. rolle). En runde: stikord (40 s), stikordene på storskærmen ét ad gangen i tilfældig rækkefølge, snak (60 s), afstemning (30 s), dommen, spionens sidste gæt (30 s) og resultatet. 4-10 spillere, 3-5 runder (standard 4). - Roller: én spion, to fra otte spillere; ingen er spion to runder i træk, hvis det kan undgås. Tema og ord skifter (intet ord to gange i et spil). - Stikord: ét ord, højst 20 tegn; ikke temaet og ikke et stikord, en anden har skrevet i runden. For dem, der kender ordet, heller ikke ordet selv, en bøjning eller en lille stavefejl af det. Spionens stikord holdes ikke op mod ordet, for en afvisning ville røbe det. - Samme ord (stikord og spionens gæt): uden store/små bogstaver, mellemrum og bindestreger, bøjninger (en/et/er/erne/ene/e/s, også med fordoblet konsonant og uden slut-e), og små stavefejl efter længden: ingen under fire bogstaver, én op til syv, to derover. Kun standardbiblioteket. - Afstemning: ikke på sig selv; flest stemmer bliver anklaget; lighed eller ingen stemmer: ingen anklages, og spionerne slipper. Publikum stemmer for sjov (vises for sig, tæller ikke). - To spioner: den anklagede er fanget og gætter; den anden slap. En stemme på en af dem er rigtig. - Point: +100 for at stemme på en spion, +300 til en spion, der slap, +200 til en fanget spion, der gætter ordet. Priser: Bedste løgner, Skarpeste øje, Mest mistænkt. - Hænger aldrig: manglende stikord og stemmer løber ud; afbrudte holder ikke runden tilbage; går den anklagede spion, slutter runden; er der færre end fire tilbage, slutter spillet efter runden. - Hemmeligheden: ordet står kun i kortet til dem, der kender det; hvem der er spion står ingen steder før dommen. Testen læser hvert snapshot i hver fase (og fejler, hvis ordet sættes i temaet eller på spionens kort). 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 og speakerens replikker (temaerne er fælles: party/data/themes.json) |
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.