✨ Improved ClassQuizController
This commit is contained in:
@@ -10,9 +10,10 @@ import uuid
|
||||
from datetime import datetime
|
||||
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from fastapi.responses import PlainTextResponse
|
||||
from pydantic import BaseModel
|
||||
from classquiz.config import redis
|
||||
from classquiz.db.models import PlayGame, Controllers
|
||||
from classquiz.db.models import PlayGame, Controller
|
||||
from classquiz.routers.box_controller.embedded.socket import router as socket_router
|
||||
|
||||
router = APIRouter()
|
||||
@@ -31,7 +32,7 @@ class JoinGameResponse(BaseModel):
|
||||
|
||||
@router.post("/join")
|
||||
async def join_game(data: JoinGameInput) -> JoinGameResponse:
|
||||
controller = await Controllers.objects.get_or_none(id=data.id, secret_key=data.secret_key)
|
||||
controller = await Controller.objects.get_or_none(id=data.id, secret_key=data.secret_key)
|
||||
game_pin = await redis.get(f"game:cqc:code:{data.code}")
|
||||
if game_pin is None:
|
||||
raise HTTPException(status_code=404, detail="Game not found")
|
||||
@@ -65,7 +66,7 @@ async def register_with_code(data: RegisterWithCodeInput) -> RegisterWithCodeRes
|
||||
raise HTTPException(status_code=404, detail="Code not found")
|
||||
await redis.delete(f"controller_setup:{data.code}")
|
||||
c_id = uuid.UUID(c_id)
|
||||
controller = await Controllers.objects.get(id=c_id)
|
||||
controller = await Controller.objects.get(id=c_id)
|
||||
controller.first_seen = datetime.now()
|
||||
controller.last_seen = datetime.now()
|
||||
await controller.update()
|
||||
@@ -74,9 +75,19 @@ async def register_with_code(data: RegisterWithCodeInput) -> RegisterWithCodeRes
|
||||
|
||||
@router.get("/ping")
|
||||
async def ping_server(id: uuid.UUID, secret_key: str, version: str):
|
||||
controller = await Controllers.objects.get_or_none(id=id, secret_key=secret_key)
|
||||
controller = await Controller.objects.get_or_none(id=id, secret_key=secret_key)
|
||||
if controller is None:
|
||||
raise HTTPException(status_code=404, detail="Key and/or id invalid")
|
||||
controller.last_seen = datetime.now()
|
||||
controller.os_version = version
|
||||
await controller.update()
|
||||
|
||||
|
||||
@router.get("/update")
|
||||
async def get_firmware_version(id: uuid.UUID, secret_key: str) -> PlainTextResponse:
|
||||
controller = await Controller.objects.get_or_none(id=id, secret_key=secret_key)
|
||||
if controller is None:
|
||||
return PlainTextResponse(status_code=404, content="Key and/or id invalid")
|
||||
if controller.wanted_os_version is None:
|
||||
return PlainTextResponse(status_code=400, content="No update needed")
|
||||
return PlainTextResponse(status_code=200, content=controller.wanted_os_version)
|
||||
|
||||
@@ -62,7 +62,7 @@ async def submit_answer_fn(data_answer: int, game_pin: str, player_id: str, now:
|
||||
await sio.emit("everyone_answered", {})
|
||||
|
||||
|
||||
button_to_index_map = {"b": 0, "g": 2, "y": 1, "r": 3}
|
||||
button_to_index_map = {"y": 0, "r": 2, "g": 1, "b": 3}
|
||||
|
||||
|
||||
class WebSocketTypes(enum.Enum):
|
||||
@@ -85,7 +85,6 @@ async def websocket_endpoint(ws: WebSocket, game_id: str):
|
||||
await ws.close(code=status.WS_1001_GOING_AWAY)
|
||||
print("Client {} already exists.".format(game_id))
|
||||
return
|
||||
print("hI!")
|
||||
await ws.accept()
|
||||
wss_clients[game_id] = ws
|
||||
|
||||
@@ -119,9 +118,7 @@ async def websocket_endpoint(ws: WebSocket, game_id: str):
|
||||
except (KeyError, AttributeError):
|
||||
await ws.send_text(WebSocketRequest(type=WebSocketTypes.Error, data="InvalidButton").json())
|
||||
continue
|
||||
print(data)
|
||||
await submit_answer_fn(answer_index, game_pin, player_id, now)
|
||||
print("Data from client {}: {}".format(game_id, data))
|
||||
|
||||
except WebSocketDisconnect as ex:
|
||||
print("Client {} is disconnected: {}".format(game_id, ex))
|
||||
|
||||
Reference in New Issue
Block a user