Bot-test virker mod drift, CI kører testene, protokol opdateret
CI / test (push) Successful in 20s

Claude-Session: https://claude.ai/code/session_01JmhJG6JnhXfzNiKv8f2vHu
This commit is contained in:
agw
2026-10-01 20:37:34 +02:00
parent 10652ee219
commit 09d56eb8db
3 changed files with 37 additions and 10 deletions
+14
View File
@@ -0,0 +1,14 @@
name: CI
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install -r requirements-dev.txt
- run: python manage.py test
env:
DJANGO_DEBUG: "true"
+19 -8
View File
@@ -11,11 +11,11 @@ faser blev nået og slutstillingen blev vist.
import argparse
import asyncio
import http.cookiejar
import json
import random
import re
import sys
import urllib.error
import urllib.parse
import urllib.request
@@ -25,15 +25,26 @@ HOST_HEADERS = {"X-authentik-username": "bot-host", "X-authentik-groups": "Famil
def create_room(base: str) -> str:
jar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar))
req = urllib.request.Request(f"{base}/host/", headers=HOST_HEADERS)
html = opener.open(req).read().decode()
# CSRF-cookien er Secure i drift; over http til localhost sender vi den selv tilbage.
resp = urllib.request.urlopen(urllib.request.Request(f"{base}/host/", headers=HOST_HEADERS))
html = resp.read().decode()
cookie = re.search(r"csrftoken=([^;]+)", resp.headers.get("Set-Cookie", "")).group(1)
token = re.search(r'name="csrfmiddlewaretoken" value="([^"]+)"', html).group(1)
data = urllib.parse.urlencode({"csrfmiddlewaretoken": token}).encode()
req = urllib.request.Request(f"{base}/host/new", data=data, headers={**HOST_HEADERS, "Referer": f"{base}/host/"})
resp = opener.open(req)
return resp.geturl().rstrip("/").rsplit("/", 1)[-1]
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, *a, **k):
return None
req = urllib.request.Request(f"{base}/host/new", data=data, headers={
**HOST_HEADERS, "Referer": f"{base}/host/", "Cookie": f"csrftoken={cookie}"})
try:
urllib.request.build_opener(NoRedirect).open(req)
except urllib.error.HTTPError as e:
if e.code != 302:
raise
return e.headers["Location"].rstrip("/").rsplit("/", 1)[-1]
raise RuntimeError("forventede redirect til værtssiden")
async def host(ws_base, code, seen: list, done: asyncio.Event):
+4 -2
View File
@@ -78,7 +78,8 @@ Fejlkoder: `unknown_room`, `unknown_token`, `name_taken`, `name_invalid`, `not_a
"authors": [], "guessed_by": ["p4"], "audience_votes": 1, "likes": 0,
"points": [{"player_id": "p4", "delta": 1000}]}
],
"step_ms": 4000 // værtsskærmen viser ét trin pr. step_ms
"step_ms": 4000, // værtsskærmen viser ét trin pr. step_ms
"note": "Forklaring på faktummet" // vises under sandheden
},
"deltas": [{"player_id": "p1", "delta": 1500}], // fase scores: point i den netop afsluttede runde
"final": { // kun i fase final
@@ -86,8 +87,9 @@ Fejlkoder: `unknown_room`, `unknown_token`, `name_taken`, `name_invalid`, `not_a
"awards": [{"title": "Største løgner", "player_id": "p2", "detail": "narrede 7 gange"}]
},
"me": { // kun til spiller/publikum
"id": "p1", "role": "player", "vip": true,
"id": "p1", "name": "Asger", "role": "player", "vip": true, "score": 1500,
"lie": "krager", // egen løgn i nuværende spørgsmål eller null
"own_answer_id": "a3", // id på eget svar i guess/reveal (kan ikke gættes eller likes)
"guess": "a3", // eget gæt eller null
"likes": ["a2"],
"is_chooser": false,