Spaces:
Sleeping
Sleeping
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 | |
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} | |
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} | |
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} | |
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:] | |
} | |
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()) |