Spaces:
Sleeping
Sleeping
File size: 2,498 Bytes
783cfb7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
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()) |