Загрузка данных


from fastapi import FastAPI, Request, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

import random
import uvicorn

app = FastAPI()

app.mount("/static", StaticFiles(directory="static"), name="static")

templates = Jinja2Templates(directory="templates")

players = []
connections = []
roles = {}

WORDS = [
    "Airport",
    "School",
    "Hospital",
    "Bank",
    "Hotel"
]

@app.get("/", response_class=HTMLResponse)
async def index(request: Request):

    return templates.TemplateResponse(
        request=request,
        name="index.html"
    )


@app.get("/room", response_class=HTMLResponse)
async def room(request: Request, nickname: str):

    return templates.TemplateResponse(
        request=request,
        name="room.html",
        context={
            "nickname": nickname
        }
    )


@app.websocket("/ws/{nickname}")
async def websocket_endpoint(websocket: WebSocket, nickname: str):

    await websocket.accept()

    connections.append(websocket)
    players.append(nickname)

    try:

        while True:

            data = await websocket.receive_text()

            for connection in connections:
                await connection.send_text(f"{nickname}: {data}")

    except WebSocketDisconnect:

        if websocket in connections:
            connections.remove(websocket)

        if nickname in players:
            players.remove(nickname)


@app.get("/start")
async def start_game():

    if len(players) < 2:
        return {
            "error": "Need at least 2 players"
        }

    spy = random.choice(players)

    location = random.choice(WORDS)

    for player in players:

        if player == spy:
            roles[player] = "SPY"
        else:
            roles[player] = location

    return roles


if __name__ == "__main__":

    uvicorn.run(
        app,
        host="127.0.0.1",
        port=8000
    )