🚧 Some progress with ClassQuizController
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
import os
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from pydantic import BaseModel
|
||||
@@ -29,7 +30,7 @@ class JoinGameResponse(BaseModel):
|
||||
|
||||
|
||||
@router.post("/join")
|
||||
async def join_game(data: JoinGameInput):
|
||||
async def join_game(data: JoinGameInput) -> JoinGameResponse:
|
||||
controller = await Controllers.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:
|
||||
@@ -65,4 +66,17 @@ async def register_with_code(data: RegisterWithCodeInput) -> RegisterWithCodeRes
|
||||
await redis.delete(f"controller_setup:{data.code}")
|
||||
c_id = uuid.UUID(c_id)
|
||||
controller = await Controllers.objects.get(id=c_id)
|
||||
controller.first_seen = datetime.now()
|
||||
controller.last_seen = datetime.now()
|
||||
await controller.update()
|
||||
return RegisterWithCodeResponse(id=controller.id, secret_key=controller.secret_key)
|
||||
|
||||
|
||||
@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)
|
||||
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()
|
||||
|
||||
@@ -78,16 +78,16 @@ class WebSocketRequest(BaseModel):
|
||||
wss_clients = {}
|
||||
|
||||
|
||||
@router.websocket("/{id}")
|
||||
async def websocket_endpoint(ws: WebSocket, game_id: str, id: str):
|
||||
@router.websocket("/{game_id}")
|
||||
async def websocket_endpoint(ws: WebSocket, game_id: str):
|
||||
try:
|
||||
if id in wss_clients.keys():
|
||||
if game_id in wss_clients.keys():
|
||||
await ws.close(code=status.WS_1001_GOING_AWAY)
|
||||
print("Client {} already exists.".format(id))
|
||||
print("Client {} already exists.".format(game_id))
|
||||
return
|
||||
|
||||
print("hI!")
|
||||
await ws.accept()
|
||||
wss_clients[id] = ws
|
||||
wss_clients[game_id] = ws
|
||||
|
||||
player_id, game_pin = game_id.split(":")
|
||||
if player_id is None or game_pin is None:
|
||||
@@ -105,7 +105,10 @@ async def websocket_endpoint(ws: WebSocket, game_id: str, id: str):
|
||||
raw_data = await ws.receive_text()
|
||||
try:
|
||||
data = WebSocketRequest.parse_raw(raw_data)
|
||||
except ValidationError:
|
||||
except ValidationError as e:
|
||||
print("ValError")
|
||||
print(e)
|
||||
print(raw_data)
|
||||
await ws.send_text(WebSocketRequest(type=WebSocketTypes.Error, data="ValidationError").json())
|
||||
continue
|
||||
|
||||
@@ -116,10 +119,10 @@ async def websocket_endpoint(ws: WebSocket, game_id: str, 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(id, data))
|
||||
print("Data from client {}: {}".format(game_id, data))
|
||||
|
||||
except WebSocketDisconnect as ex:
|
||||
print("Client {} is disconnected: {}".format(id, ex))
|
||||
wss_clients.pop(id, None)
|
||||
print("Client {} is disconnected: {}".format(game_id, ex))
|
||||
wss_clients.pop(game_id, None)
|
||||
|
||||
@@ -75,3 +75,14 @@ async def modify_controller(
|
||||
controller.name = data.name
|
||||
await controller.update()
|
||||
return GetControllerResponse(**controller.dict())
|
||||
|
||||
|
||||
@router.get("/list")
|
||||
async def get_all_controllers(user: User = Depends(get_current_user)) -> list[GetControllerResponse]:
|
||||
controllers = await Controllers.objects.all(user=user.id)
|
||||
if len(controllers) == 0:
|
||||
return []
|
||||
return_list = []
|
||||
for controller in controllers:
|
||||
return_list.append(GetControllerResponse(**controller.dict()))
|
||||
return return_list
|
||||
|
||||
@@ -8,7 +8,7 @@ from fastapi import APIRouter
|
||||
from classquiz.config import settings, meilisearch
|
||||
from uuid import UUID
|
||||
from typing import Optional, List, Any
|
||||
from meilisearch.errors import MeiliSearchApiError
|
||||
from meilisearch.errors import MeilisearchApiError
|
||||
from classquiz.helpers import meilisearch_init
|
||||
|
||||
settings = settings()
|
||||
@@ -53,7 +53,7 @@ async def _perform_search(query: str, params: dict) -> dict[str, Any]:
|
||||
try:
|
||||
index = meilisearch.get_index(settings.meilisearch_index)
|
||||
return index.search(query, params)
|
||||
except MeiliSearchApiError:
|
||||
except MeilisearchApiError:
|
||||
await meilisearch_init()
|
||||
index = meilisearch.get_index(settings.meilisearch_index)
|
||||
return index.search(query, params)
|
||||
|
||||
Reference in New Issue
Block a user