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
)