| | from fastapi import FastAPI, Request, WebSocket, WebSocketDisconnect |
| | from fastapi.middleware.cors import CORSMiddleware |
| | from fastapi.responses import HTMLResponse |
| | from fastapi.staticfiles import StaticFiles |
| | from fastapi.templating import Jinja2Templates |
| | import json |
| | import uvicorn |
| |
|
| | app = FastAPI() |
| |
|
| | |
| | app.add_middleware( |
| | CORSMiddleware, |
| | allow_origins=["*"], |
| | allow_credentials=True, |
| | allow_methods=["*"], |
| | allow_headers=["*"], |
| | ) |
| |
|
| | |
| | app.mount("/static", StaticFiles(directory="static"), name="static") |
| |
|
| | |
| | templates = Jinja2Templates(directory="templates") |
| |
|
| | with open("data.json", "r", encoding="utf8") as file: |
| | maps_data = json.load(file) |
| |
|
| |
|
| | @app.get("/", response_class=HTMLResponse) |
| | async def read_index(request: Request): |
| | return templates.TemplateResponse("index.html", {"request": request, "maps": maps_data}) |
| |
|
| |
|
| | @app.get("/map/{normalized_name}", response_class=HTMLResponse) |
| | async def get_map_by_normalized_name(request: Request, normalized_name: str): |
| | map_entry = maps_data.get(normalized_name) |
| | if map_entry: |
| | filtered_maps = [map_entry] |
| | else: |
| | filtered_maps = [] |
| | return templates.TemplateResponse("map.html", {"request": request, "maps": filtered_maps}) |
| |
|
| |
|
| | class ConnectionManager: |
| | def __init__(self): |
| | self.active_connections: list[WebSocket] = [] |
| |
|
| | async def connect(self, websocket: WebSocket): |
| | await websocket.accept() |
| | self.active_connections.append(websocket) |
| | print("active_connections:", self.active_connections) |
| |
|
| | def disconnect(self, websocket: WebSocket): |
| | self.active_connections.remove(websocket) |
| | print("active_connections:", self.active_connections) |
| |
|
| | async def send_personal_message(self, message: str, websocket: WebSocket): |
| | await websocket.send_text(message) |
| |
|
| | async def broadcast(self, message: str): |
| | for connection in self.active_connections: |
| | |
| | await connection.send_text(message) |
| |
|
| |
|
| | manager = ConnectionManager() |
| |
|
| |
|
| | @app.websocket("/{client_id}") |
| | async def websocket_endpoint(websocket: WebSocket, client_id: int): |
| | await manager.connect(websocket) |
| | try: |
| | while True: |
| | data = await websocket.receive_text() |
| | await manager.broadcast(data) |
| | except WebSocketDisconnect: |
| | manager.disconnect(websocket) |
| | await manager.broadcast(json.dumps({"type": "client_info", "data": f"Client #{client_id} left the chat"})) |
| |
|
| |
|
| | if __name__ == "__main__": |
| | uvicorn.run(app, host="0.0.0.0", port=8000) |
| |
|