Claude-Session: https://claude.ai/code/session_01JmhJG6JnhXfzNiKv8f2vHu
This commit is contained in:
@@ -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
@@ -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
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user