From 908eebefdd25ce93df785f2a00f0d7bb70c3f3ba Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Wed, 26 Nov 2025 16:09:58 +0530 Subject: [PATCH] basic matchmaking flow --- game_flow.py | 12 ++++++++++++ match_making_flow.py | 46 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 match_making_flow.py diff --git a/game_flow.py b/game_flow.py index 54b17d6..188b553 100644 --- a/game_flow.py +++ b/game_flow.py @@ -118,6 +118,18 @@ class PlayerWebSocketHandler(WebSocketHandler): print(f"[{self.label}] UNKNOWN OPCODE {op}: {payload}") # ---------- Match Helpers ---------- + def rpc_find_match(self) -> str: + """Call rpc_find_match and return Nakama match_id.""" + r = requests.post( + f"{HOST}/v2/rpc/rpc_find_match", + headers={"Authorization": f"Bearer {self.token}"}, + ) + r.raise_for_status() + + # RPC returns {"payload": ""} + payload = json.loads(r.json()["payload"]) + return payload["match_id"] + async def create_match(self) -> str: await self.ws.send(json.dumps({"match_create": {}})) msg = json.loads(await self.ws.recv()) diff --git a/match_making_flow.py b/match_making_flow.py new file mode 100644 index 0000000..93ee091 --- /dev/null +++ b/match_making_flow.py @@ -0,0 +1,46 @@ +import asyncio +from game_flow import PlayerWebSocketHandler + + +async def simulate_matchmaking(num_players: int = 6): + print(f"\nšŸŽ® Spawning {num_players} players...\n") + + # 1) Login + WebSocket connect (NO listener yet!) + players = await asyncio.gather(*[ + PlayerWebSocketHandler.setup_player(f"player_{i}") + for i in range(num_players) + ]) + + print("\nāœ… All players authenticated + connected\n") + + # 2) First player requests match via RPC + p1 = players[0] + match_id = p1.rpc_find_match() + print(f"\nšŸŽÆ Match allocated: {match_id}\n") + + # 3) Everyone joins the same match + await asyncio.gather(*[ + p.join_match(match_id) for p in players + ]) + + print("\nāœ… All players joined match\n") + + # 4) NOW start websocket listeners (prevents recv race) + for p in players: + p.start_listener() + + print("\nšŸ‘‚ Listening for match state + updates...\n") + + # 5) Keep test running long enough to observe messages + await asyncio.sleep(10) + + # 6) Cleanup + await asyncio.gather(*[ + p.close() for p in players + ]) + + print("\nšŸ Simulation complete\n") + + +if __name__ == "__main__": + asyncio.run(simulate_matchmaking(6))