""" Lobby API endpoints for the AI Voice Bot server. This module contains lobby management endpoints. """ from typing import TYPE_CHECKING, List from fastapi import APIRouter, Path, Body, HTTPException # Import shared models import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))) from shared.models import ( LobbiesResponse, LobbyCreateRequest, LobbyCreateResponse, LobbyListItem, LobbyModel, ChatMessagesResponse, ) from logger import logger if TYPE_CHECKING: from ..core.session_manager import SessionManager from ..core.lobby_manager import LobbyManager class LobbyAPI: """Lobby API endpoint handlers""" def __init__( self, session_manager: "SessionManager", lobby_manager: "LobbyManager", public_url: str = "/" ): self.session_manager = session_manager self.lobby_manager = lobby_manager self.router = APIRouter(prefix=f"{public_url}api") self._register_routes() def _register_routes(self): """Register all lobby routes""" @self.router.get("/lobby", response_model=LobbiesResponse) def list_lobbies(): lobbies = self.lobby_manager.list_lobbies(include_private=False) lobby_items: List[LobbyListItem] = [] for lobby in lobbies: lobby_items.append(LobbyListItem( id=lobby.id, name=lobby.name, private=lobby.private, participant_count=lobby.get_participant_count() )) return LobbiesResponse(lobbies=lobby_items) @self.router.post("/lobby/{session_id}", response_model=LobbyCreateResponse) def create_lobby(session_id: str = Path(...), request: LobbyCreateRequest = Body(...)): # Validate session session = self.session_manager.get_session(session_id) if not session: raise HTTPException(status_code=404, detail="Session not found") if request.type != "lobby_create": raise HTTPException(status_code=400, detail="Invalid request type") # Create or get lobby lobby = self.lobby_manager.create_or_get_lobby( name=request.data.name, private=request.data.private ) logger.info(f"Session {session.getName()} created/joined lobby {lobby.getName()}") lobby_model = LobbyModel( id=lobby.id, name=lobby.name, private=lobby.private ) return LobbyCreateResponse( type="lobby_created", data=lobby_model ) @self.router.get("/lobby/{lobby_id}/chat", response_model=ChatMessagesResponse) def get_chat_messages(lobby_id: str = Path(...), limit: int = 50): lobby = self.lobby_manager.get_lobby(lobby_id) if not lobby: raise HTTPException(status_code=404, detail="Lobby not found") messages = lobby.get_chat_messages(limit) return ChatMessagesResponse( messages=[msg.model_dump() for msg in messages] )