✨ New Remote-Control page
This commit is contained in:
@@ -4,6 +4,8 @@
|
||||
|
||||
|
||||
import json
|
||||
import uuid
|
||||
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from pydantic import BaseModel, validator
|
||||
from classquiz.config import settings, redis
|
||||
@@ -155,17 +157,21 @@ async def get_game_user_count(game_pin: str, api_key: str, as_string: bool = Fal
|
||||
@router.get(
|
||||
"/players",
|
||||
)
|
||||
async def get_game_session(game_pin: str, api_key: str):
|
||||
async def get_game_session(game_pin: str, api_key: str | None = None, game_id: uuid.UUID | None = None):
|
||||
if game_id is None and api_key is None:
|
||||
raise HTTPException(status_code=401, detail="API-Key and Quiz-ID are missing")
|
||||
user_id = await check_api_key(api_key)
|
||||
redis_res = await redis.get(f"game_session:{game_pin}")
|
||||
if redis_res is None:
|
||||
game_pin = await redis.get(f"game_pin:{user_id}:{game_pin}")
|
||||
redis_res = await redis.get(f"game_session:{game_pin}")
|
||||
if redis_res is None or user_id is None:
|
||||
if redis_res is None:
|
||||
raise HTTPException(status_code=404, detail="Game not found or API key not found")
|
||||
data = GameSession.parse_raw(redis_res)
|
||||
if user_id is None and data.game_id != str(game_id):
|
||||
raise HTTPException(status_code=401, detail="Game not found or API key not found")
|
||||
game = PlayGame.parse_raw(await redis.get(f"game:{game_pin}"))
|
||||
if game.user_id != user_id:
|
||||
if game.user_id != user_id and data.game_id != str(game_id):
|
||||
raise HTTPException(status_code=404, detail="Game not found or API key not found")
|
||||
for i in range(0, len(game.questions)):
|
||||
res = await redis.get(f"game_session:{game_pin}:{i}")
|
||||
@@ -195,7 +201,7 @@ async def set_next_question(game_pin: str, question_number: int, api_key: str):
|
||||
if game_data.user_id != user_id:
|
||||
raise HTTPException(status_code=404, detail="Game not found or API key not found")
|
||||
game_data.current_question = question_number
|
||||
await redis.set(f"game:{game_pin}", game_data.json())
|
||||
await redis.set(f"game:{game_pin}", game_data.json(), ex=18000)
|
||||
await sio.emit(
|
||||
"set_question_number",
|
||||
{
|
||||
|
||||
@@ -18,7 +18,7 @@ import bleach
|
||||
|
||||
from classquiz.auth import get_current_user
|
||||
from classquiz.config import redis, settings, storage, meilisearch
|
||||
from classquiz.db.models import Quiz, QuizInput, User, PlayGame
|
||||
from classquiz.db.models import Quiz, QuizInput, User, PlayGame, GameInLobby
|
||||
from classquiz.kahoot_importer.import_quiz import import_quiz
|
||||
import html
|
||||
import urllib.parse
|
||||
@@ -129,6 +129,11 @@ async def start_quiz(
|
||||
)
|
||||
await redis.set(f"game:{str(game.game_pin)}", game.json(), ex=18000)
|
||||
await redis.set(f"game_pin:{user.id}:{quiz_id}", game_pin, ex=18000)
|
||||
await redis.set(
|
||||
f"game_in_lobby:{user.id.hex}",
|
||||
GameInLobby(game_id=game.game_id, game_pin=str(game_pin), quiz_title=quiz.title).json(),
|
||||
ex=900,
|
||||
)
|
||||
return {**quiz.dict(exclude={"id"}), **game.dict(exclude={"questions"})}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
|
||||
from classquiz.auth import get_current_user
|
||||
from classquiz.db.models import User, GameInLobby
|
||||
from classquiz.config import redis
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/game_waiting")
|
||||
async def get_game_in_lobby(user: User = Depends(get_current_user)):
|
||||
game_in_lobby_raw = await redis.get(f"game_in_lobby:{user.id.hex}")
|
||||
if game_in_lobby_raw is None:
|
||||
raise HTTPException(status_code=404, detail="No game waiting")
|
||||
game_in_lobby = GameInLobby.parse_raw(game_in_lobby_raw)
|
||||
return game_in_lobby
|
||||
Reference in New Issue
Block a user