agwandClaude Opus 5.5 a448cd2b73 Spionen: spilmotor og test
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>
2026-10-20 21:59:50 +02:00
2026-10-20 21:59:50 +02:00
2026-10-20 21:59:50 +02:00

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.dk og 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.

S
Description
Weirsøe Party Protocol
Readme
42 MiB
Languages
Python 60.3%
JavaScript 28.2%
CSS 9.8%
HTML 1.7%