from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Dict, List import uuid app = FastAPI() # Estructura de datos en memoria salas: Dict[str, Dict] = {} # Modelos de datos class Mensaje(BaseModel): usuario_id: str texto: str class Jugador(BaseModel): nombre: str class CrearSala(BaseModel): nombre_sala: str @app.post("/sala") def crear_sala(datos: CrearSala): nombre_sala = datos.nombre_sala if nombre_sala in salas: raise HTTPException(status_code=400, detail="Ya existe una sala con ese nombre") salas[nombre_sala] = {"mensajes": [], "jugadores": {}, "orden": []} return {"sala_id": nombre_sala} @app.post("/sala/{sala_id}/registrar") def registrar_usuario(sala_id: str, jugador: Jugador): if sala_id not in salas: raise HTTPException(status_code=404, detail="Sala no encontrada") if len(salas[sala_id]["jugadores"]) >= 4: raise HTTPException(status_code=403, detail="La sala está llena") usuario_id = str(uuid.uuid4()) salas[sala_id]["jugadores"][usuario_id] = jugador.nombre salas[sala_id]["orden"].append(usuario_id) posicion = len(salas[sala_id]["orden"]) - 1 return {"usuario_id": usuario_id, "nombre": jugador.nombre, "posicion": posicion} @app.post("/sala/{sala_id}/mensaje") def enviar_mensaje(sala_id: str, mensaje: Mensaje): if sala_id not in salas: raise HTTPException(status_code=404, detail="Sala no encontrada") if mensaje.usuario_id not in salas[sala_id]["jugadores"]: raise HTTPException(status_code=403, detail="Usuario no registrado en la sala") nombre = salas[sala_id]["jugadores"][mensaje.usuario_id] salas[sala_id]["mensajes"].append({"usuario": nombre, "texto": mensaje.texto}) return {"ok": True} @app.get("/sala/{sala_id}/mensajes") def obtener_mensajes(sala_id: str, desde: int = 0): if sala_id not in salas: raise HTTPException(status_code=404, detail="Sala no encontrada") mensajes = salas[sala_id]["mensajes"] if desde < 0 or desde > len(mensajes): raise HTTPException(status_code=400, detail="ID de mensaje fuera de rango") return { "desde": desde, "hasta": len(mensajes), "mensajes": mensajes[desde:] } @app.get("/sala/{sala_id}/jugadores") def obtener_jugadores(sala_id: str): if sala_id not in salas: raise HTTPException(status_code=404, detail="Sala no encontrada") return list(salas[sala_id]["jugadores"].values())