Bots kan fylde et eksisterende spil op (--code)
CI / test (push) Successful in 19s

Så kan et spil testes alene: vær vært og VIP selv, og lad bots være de
andre spillere.

Claude-Session: https://claude.ai/code/session_01JmhJG6JnhXfzNiKv8f2vHu
This commit is contained in:
agw
2026-10-01 20:53:55 +02:00
parent 09d56eb8db
commit ec9758ada0
+35 -1
View File
@@ -68,7 +68,15 @@ async def host(ws_base, code, seen: list, done: asyncio.Event):
return
async def player(ws_base, code, name, n_players, done: asyncio.Event, rng: random.Random):
async def player(ws_base, code, name, n_players, done: asyncio.Event, rng: random.Random, stop_at_final=False):
try:
await _player(ws_base, code, name, n_players, done, rng, stop_at_final)
except websockets.ConnectionClosed:
print(f"[{name}] forbindelsen blev lukket (findes rummet?)")
done.set()
async def _player(ws_base, code, name, n_players, done, rng, stop_at_final):
async with websockets.connect(f"{ws_base}/ws/play/{code}/") as ws:
await ws.send(json.dumps({"action": "join", "name": name}))
acted = set()
@@ -80,10 +88,17 @@ async def player(ws_base, code, name, n_players, done: asyncio.Event, rng: rando
msg = json.loads(raw)
if msg["type"] == "error":
print(f"[{name}] fejl: {msg['code']} {msg['message']}")
if msg["code"] == "unknown_room":
done.set()
return
continue
if msg["type"] != "state":
continue
st, me = msg["state"], msg["state"]["me"]
if st["phase"] == "final" and stop_at_final:
print(f"[{name}] slut: plads {next((r['place'] for r in st['final']['ranking'] if r['player_id'] == me['id']), '-')}")
done.set()
return
key = (st["phase"], (st.get("round") or {}).get("number"), (st.get("round") or {}).get("question_number"))
await asyncio.sleep(rng.uniform(0.05, 0.4))
if st["phase"] == "lobby" and me["vip"] and len(st["players"]) >= n_players and key not in acted:
@@ -116,8 +131,11 @@ async def main():
ap.add_argument("--players", type=int, default=3)
ap.add_argument("--audience", type=int, default=1)
ap.add_argument("--seed", type=int, default=None)
ap.add_argument("--code", help="join et eksisterende rum i stedet for at oprette et (du er selv vært/VIP)")
args = ap.parse_args()
rng = random.Random(args.seed)
if args.code:
return await join_existing(args, rng)
code = create_room(args.base)
print(f"Rum {code}")
ws_base = args.base.replace("http", "ws", 1)
@@ -151,5 +169,21 @@ async def main():
return 0
async def join_existing(args, rng):
"""Bots fylder op i dit eget spil. De starter ikke spillet (det gør VIP'en, altså dig)."""
ws_base = args.base.replace("http", "ws", 1)
code, done = args.code.upper(), asyncio.Event()
names = ["Bot-Bodil", "Bot-Kaj", "Bot-Lis", "Bot-Ib", "Bot-Mette", "Bot-Jørn", "Bot-Sus"][: args.players]
tasks = [asyncio.create_task(player(ws_base, code, n, 99, done, rng, stop_at_final=True)) for n in names]
print(f"{len(names)} bots joiner {code}. Start spillet fra din telefon eller storskærmen.")
try:
await asyncio.wait_for(done.wait(), timeout=3600)
except asyncio.TimeoutError:
return 1
for t in tasks:
t.cancel()
return 0
if __name__ == "__main__":
sys.exit(asyncio.run(main()))