From e9e95c409b775771ddbe9fcabf730f64d6dd14c0 Mon Sep 17 00:00:00 2001 From: Isaac Johnson Date: Sun, 6 Sep 2026 08:29:31 -0500 Subject: [PATCH] fix(agent): handle bot reconnection and return 400 on duplicate registration --- backend/app/api/routes.py | 24 +++++++++++++++--------- botagent/bot_agent.py | 22 ++++++++++++++++++++-- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/backend/app/api/routes.py b/backend/app/api/routes.py index a4062dd..e43b44b 100644 --- a/backend/app/api/routes.py +++ b/backend/app/api/routes.py @@ -84,15 +84,21 @@ async def reset_board(): tags=["Players"], ) async def register_player(player_in: PlayerCreate): - player = await game_engine.register_player(player_in) - board_state = await game_engine.get_board_state() - await manager.broadcast({ - "event": "player_registered", - "player": player.model_dump(), - "total_players": len(board_state.players), - "turn": board_state.turn.model_dump(), - }) - return player + try: + player = await game_engine.register_player(player_in) + board_state = await game_engine.get_board_state() + await manager.broadcast({ + "event": "player_registered", + "player": player.model_dump(), + "total_players": len(board_state.players), + "turn": board_state.turn.model_dump(), + }) + return player + except ValueError as e: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=str(e), + ) @router.get( diff --git a/botagent/bot_agent.py b/botagent/bot_agent.py index 33286b8..a317dc8 100644 --- a/botagent/bot_agent.py +++ b/botagent/bot_agent.py @@ -23,11 +23,29 @@ class SmartBotAgent: self.is_leader: bool = False def register(self): - """Register the bot avatar on the 64x64 grid.""" + """Register the bot avatar on the 64x64 grid or reconnect if already present.""" + try: + players = requests.get(f"{BASE_URL}/players").json() + for p in players: + if p.get("name") == self.name: + self.bot_id = p["id"] + print(f"🔄 [RECONNECT] Reconnected to existing {self.name} (ID: {self.bot_id}, Str: {p.get('strength', self.strength)}) at ({p.get('x')}, {p.get('y')})") + return + except Exception: + pass + res = requests.post( f"{BASE_URL}/players", json={"name": self.name, "color": self.color, "strength": self.strength}, ) + if res.status_code == 400 and "already registered" in res.text: + players = requests.get(f"{BASE_URL}/players").json() + for p in players: + if p.get("name") == self.name: + self.bot_id = p["id"] + print(f"🔄 [RECONNECT] Reconnected to existing {self.name} (ID: {self.bot_id}) at ({p.get('x')}, {p.get('y')})") + return + res.raise_for_status() data = res.json() self.bot_id = data["id"] @@ -231,7 +249,7 @@ class SmartBotAgent: while True: turn_info = requests.get(f"{BASE_URL}/turn").json() if not turn_info.get("game_started", False): - print("⏳ [LOBBY] Waiting for game to start via 'Start Game' in UI...", end="\r") + print("⏳ [LOBBY] Waiting for game to start via 'Start Game' in UI...", end="\r", flush=True) time.sleep(0.5) continue