Files
matrix-show/backend/app/routes/game.py
T
2026-06-04 17:59:53 +08:00

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)