basic matchmaking flow

This commit is contained in:
2025-11-26 16:09:58 +05:30
parent 0fb448dd45
commit 908eebefdd
2 changed files with 58 additions and 0 deletions

View File

@@ -118,6 +118,18 @@ class PlayerWebSocketHandler(WebSocketHandler):
print(f"[{self.label}] UNKNOWN OPCODE {op}: {payload}") print(f"[{self.label}] UNKNOWN OPCODE {op}: {payload}")
# ---------- Match Helpers ---------- # ---------- 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": "<json string>"}
payload = json.loads(r.json()["payload"])
return payload["match_id"]
async def create_match(self) -> str: async def create_match(self) -> str:
await self.ws.send(json.dumps({"match_create": {}})) await self.ws.send(json.dumps({"match_create": {}}))
msg = json.loads(await self.ws.recv()) msg = json.loads(await self.ws.recv())

46
match_making_flow.py Normal file
View File

@@ -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))