Add event log

This commit is contained in:
2026-06-11 10:20:14 -07:00
parent 1b8452bf56
commit 29860061c4
13 changed files with 285 additions and 9 deletions

View File

@@ -2,13 +2,14 @@ from typing import Optional
from fastapi import FastAPI, Request, Form, Depends, HTTPException, status
from fastapi.responses import RedirectResponse, HTMLResponse
from fastapi.staticfiles import StaticFiles
from sqlmodel import Session
from sqlmodel import Session, select
import uvicorn
from pathlib import Path
from . import crud
from .database import create_db_and_tables, get_session
from .templates import templates, BASE_DIR
from .models import GameEvent
app = FastAPI(title="Rats with Gats Remote Play")
@@ -74,15 +75,46 @@ def player_dashboard(request: Request, game_id: str, player_id: str, db: Session
# --- HTMX Core Polling Route ---
@app.get("/game/{game_id}/player/{player_id}/phase-check")
def phase_check_route(game_id: str, player_id: str, current: str, db: Session = Depends(get_session)):
def phase_check_route(game_id: str, player_id: str, current: str, rank: Optional[int] = None, needs_name: Optional[bool] = None, hand_len: Optional[int] = None, db: Session = Depends(get_session)):
game = crud.get_game(db, game_id)
if not game:
raise HTTPException(status_code=404, detail="Game not found")
player = crud.get_player(db, player_id)
if not player:
raise HTTPException(status_code=404, detail="Player not found")
state_changed = False
if game.phase != current:
# Phase changed! Trigger page reload on client via HTMX header
state_changed = True
elif rank is not None and player.rank != rank:
state_changed = True
elif needs_name is not None and player.needs_name != needs_name:
state_changed = True
elif hand_len is not None:
import json
current_hand = json.loads(player.hand_cards)
if len(current_hand) != hand_len:
state_changed = True
if state_changed:
# Phase or state changed! Trigger page reload on client via HTMX header
return HTMLResponse(status_code=200, headers={"HX-Trigger": "phase-changed"})
return HTMLResponse(status_code=204) # No content, no reload
@app.get("/game/{game_id}/player/{player_id}/events", response_class=HTMLResponse)
def get_events_snippet(request: Request, game_id: str, player_id: str, db: Session = Depends(get_session)):
game = crud.get_game(db, game_id)
if not game:
raise HTTPException(status_code=404, detail="Game not found")
events = db.exec(select(GameEvent).where(GameEvent.game_id == game_id).order_by(GameEvent.timestamp.asc())).all()
return templates.TemplateResponse("event_log_snippet.html", {
"request": request,
"events": events
})
# --- Register Modular Phase Routers ---
from .phase_view import router as phase_view_router