diff --git a/app.py b/app.py index 0b3b275..1d46181 100644 --- a/app.py +++ b/app.py @@ -4,6 +4,7 @@ import random import re import string import uuid +from collections import deque from collections.abc import Iterator from datetime import datetime, timedelta, timezone from enum import Enum @@ -240,6 +241,55 @@ async def new_room(request): }, ) + +quick_queue: deque[str] +quick_map: dict[str, Room] +lock = asyncio.Lock() + + +@app.POST("/quick") +async def quick_match(request: Request): + global quick_queue, quick_map + data = parse(request.body) + async with lock: + if ( + data + and len(data) == 1 + and "queue_id" in data + and data["queue_id"] in quick_queue + ): + first = None + second = None + position: int = 0 + # UPDATE LOGIC + while not second and position < len(quick_queue): + if quick_queue[position] not in quick_map: + if not first: + first = quick_queue[position] + else: + second = quick_queue[position] + position += 1 + if first and second: + room = Room() + k = room_key() + rooms[k] = room + quick_map[first] = room + quick_map[second] = room + + qid = data["queue_id"] + if qid in quick_map: + return JSONResponse(request, {"room_id": quick_map[qid]}) + else: + return JSONResponse( + request, {} + ) # Client handles empty as continue to wait + + else: + qid = str(uuid.uuid4()) + quick_queue.append(qid) + return JSONResponse(request, {"queue_id": qid}) + + @app.GET("/") async def home(request): return render(request, "home.html")