fix(agent): handle bot reconnection and return 400 on duplicate registration

This commit is contained in:
Isaac Johnson 2026-09-06 08:29:31 -05:00
parent 8e26c21995
commit e9e95c409b
2 changed files with 35 additions and 11 deletions

View File

@ -84,6 +84,7 @@ async def reset_board():
tags=["Players"], tags=["Players"],
) )
async def register_player(player_in: PlayerCreate): async def register_player(player_in: PlayerCreate):
try:
player = await game_engine.register_player(player_in) player = await game_engine.register_player(player_in)
board_state = await game_engine.get_board_state() board_state = await game_engine.get_board_state()
await manager.broadcast({ await manager.broadcast({
@ -93,6 +94,11 @@ async def register_player(player_in: PlayerCreate):
"turn": board_state.turn.model_dump(), "turn": board_state.turn.model_dump(),
}) })
return player return player
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=str(e),
)
@router.get( @router.get(

View File

@ -23,11 +23,29 @@ class SmartBotAgent:
self.is_leader: bool = False self.is_leader: bool = False
def register(self): 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( res = requests.post(
f"{BASE_URL}/players", f"{BASE_URL}/players",
json={"name": self.name, "color": self.color, "strength": self.strength}, 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() res.raise_for_status()
data = res.json() data = res.json()
self.bot_id = data["id"] self.bot_id = data["id"]
@ -231,7 +249,7 @@ class SmartBotAgent:
while True: while True:
turn_info = requests.get(f"{BASE_URL}/turn").json() turn_info = requests.get(f"{BASE_URL}/turn").json()
if not turn_info.get("game_started", False): 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) time.sleep(0.5)
continue continue