"""Bot API endpoints""" from fastapi import APIRouter, HTTPException # Import shared models - NO FALLBACKS! try: from shared.models import ( BotProviderRegisterRequest, BotProviderRegisterResponse, BotProviderListResponse, BotListResponse, BotJoinLobbyRequest, BotJoinLobbyResponse, BotLeaveLobbyRequest, BotLeaveLobbyResponse, BotInstanceModel, ) except ImportError as e: raise ImportError( f"Failed to import shared models: {e}. Ensure shared/models.py is accessible and PYTHONPATH is correctly set." ) def create_bot_router( bot_manager, session_manager, lobby_manager, bot_config_manager, public_url: str = "/", ) -> APIRouter: """Create bot API router with dependencies""" router = APIRouter(prefix=f"{public_url}api/bots", tags=["bots"]) @router.post("/providers/register", response_model=BotProviderRegisterResponse) async def register_bot_provider(request: BotProviderRegisterRequest) -> BotProviderRegisterResponse: """Register a new bot provider with authentication""" try: return await bot_manager.register_provider(request) except ValueError as e: if "Invalid provider key" in str(e): raise HTTPException(status_code=403, detail=str(e)) else: raise HTTPException(status_code=400, detail=str(e)) @router.get("/providers", response_model=BotProviderListResponse) async def list_bot_providers() -> BotProviderListResponse: """List all registered bot providers""" return bot_manager.list_providers() @router.get("", response_model=BotListResponse) async def list_available_bots() -> BotListResponse: """List all available bots from all registered providers""" return await bot_manager.list_bots() @router.post("/{bot_name}/join", response_model=BotJoinLobbyResponse) async def request_bot_join_lobby(bot_name: str, request: BotJoinLobbyRequest) -> BotJoinLobbyResponse: """Request a bot to join a specific lobby""" try: return await bot_manager.request_bot_join( bot_name, request, session_manager, lobby_manager, bot_config_manager ) except ValueError as e: if "not found" in str(e).lower(): raise HTTPException(status_code=404, detail=str(e)) elif "timeout" in str(e).lower(): raise HTTPException(status_code=504, detail=str(e)) elif "provider error" in str(e).lower(): raise HTTPException(status_code=502, detail=str(e)) else: raise HTTPException(status_code=500, detail=str(e)) @router.post( "/instances/{bot_instance_id}/leave", response_model=BotLeaveLobbyResponse ) async def request_bot_leave_lobby(bot_instance_id: str) -> BotLeaveLobbyResponse: """Request a bot instance to leave from all lobbies and disconnect""" try: request = BotLeaveLobbyRequest(bot_instance_id=bot_instance_id) return await bot_manager.request_bot_leave(request, session_manager) except ValueError as e: if "not found" in str(e).lower(): raise HTTPException(status_code=404, detail=str(e)) elif "not a bot" in str(e).lower(): raise HTTPException(status_code=400, detail=str(e)) else: raise HTTPException(status_code=500, detail=str(e)) @router.get("/instances/{bot_instance_id}", response_model=dict) async def get_bot_instance(bot_instance_id: str) -> dict: """Get information about a specific bot instance""" try: return await bot_manager.get_bot_instance(bot_instance_id) except ValueError as e: if "not found" in str(e).lower(): raise HTTPException(status_code=404, detail=str(e)) else: raise HTTPException(status_code=500, detail=str(e)) return router