From ec9758ada04b1ca4a55da9a30d10c684e7ca7721 Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Thu, 1 Oct 2026 20:53:55 +0200 Subject: [PATCH] Bots kan fylde et eksisterende spil op (--code) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- deploy/bots.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/deploy/bots.py b/deploy/bots.py index f1acf4a..a214bdb 100644 --- a/deploy/bots.py +++ b/deploy/bots.py @@ -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()))