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())