fix(agent): handle bot reconnection and return 400 on duplicate registration
This commit is contained in:
parent
8e26c21995
commit
e9e95c409b
|
|
@ -84,15 +84,21 @@ async def reset_board():
|
||||||
tags=["Players"],
|
tags=["Players"],
|
||||||
)
|
)
|
||||||
async def register_player(player_in: PlayerCreate):
|
async def register_player(player_in: PlayerCreate):
|
||||||
player = await game_engine.register_player(player_in)
|
try:
|
||||||
board_state = await game_engine.get_board_state()
|
player = await game_engine.register_player(player_in)
|
||||||
await manager.broadcast({
|
board_state = await game_engine.get_board_state()
|
||||||
"event": "player_registered",
|
await manager.broadcast({
|
||||||
"player": player.model_dump(),
|
"event": "player_registered",
|
||||||
"total_players": len(board_state.players),
|
"player": player.model_dump(),
|
||||||
"turn": board_state.turn.model_dump(),
|
"total_players": len(board_state.players),
|
||||||
})
|
"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(
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue