79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, Body
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from pydantic import BaseModel
|
|
|
|
from app.models.database import get_session
|
|
from app.models.schemas import GameStateResponse, DmSpeakRequest
|
|
from app.services.game_state_manager import game_state_manager
|
|
from app.services.agent_scheduler import agent_scheduler
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
class StartGameRequest(BaseModel):
|
|
script_id: str
|
|
|
|
|
|
class SetSpeakerRequest(BaseModel):
|
|
character_id: str
|
|
|
|
|
|
@router.get("/state", response_model=GameStateResponse)
|
|
async def get_state(session: AsyncSession = Depends(get_session)):
|
|
state = await game_state_manager.get_or_create_state(session)
|
|
return game_state_manager.to_response(state)
|
|
|
|
|
|
@router.post("/start", response_model=GameStateResponse)
|
|
async def start_game(
|
|
req: StartGameRequest,
|
|
session: AsyncSession = Depends(get_session),
|
|
):
|
|
state = await game_state_manager.start_game(session, req.script_id)
|
|
return game_state_manager.to_response(state)
|
|
|
|
|
|
@router.post("/pause", response_model=GameStateResponse)
|
|
async def pause_game(session: AsyncSession = Depends(get_session)):
|
|
state = await game_state_manager.pause_game(session)
|
|
return game_state_manager.to_response(state)
|
|
|
|
|
|
@router.post("/resume", response_model=GameStateResponse)
|
|
async def resume_game(session: AsyncSession = Depends(get_session)):
|
|
state = await game_state_manager.resume_game(session)
|
|
return game_state_manager.to_response(state)
|
|
|
|
|
|
@router.post("/phase/next", response_model=GameStateResponse)
|
|
async def phase_next(session: AsyncSession = Depends(get_session)):
|
|
state = await game_state_manager.next_phase(session)
|
|
return game_state_manager.to_response(state)
|
|
|
|
|
|
@router.post("/phase/prev", response_model=GameStateResponse)
|
|
async def phase_prev(session: AsyncSession = Depends(get_session)):
|
|
state = await game_state_manager.prev_phase(session)
|
|
return game_state_manager.to_response(state)
|
|
|
|
|
|
@router.post("/dm/speak")
|
|
async def dm_speak(req: DmSpeakRequest):
|
|
result = await agent_scheduler.dm_speak(req.content)
|
|
return {"content": result, "msg_type": "dm", "phase": req.phase}
|
|
|
|
|
|
@router.post("/speaker/set", response_model=GameStateResponse)
|
|
async def set_speaker(
|
|
req: SetSpeakerRequest,
|
|
session: AsyncSession = Depends(get_session),
|
|
):
|
|
state = await game_state_manager.set_speaker(session, req.character_id)
|
|
return game_state_manager.to_response(state)
|
|
|
|
|
|
@router.post("/reset", response_model=GameStateResponse)
|
|
async def reset_game(session: AsyncSession = Depends(get_session)):
|
|
state = await game_state_manager.reset(session)
|
|
return game_state_manager.to_response(state)
|