diff --git a/classquiz/db/models.py b/classquiz/db/models.py index 461e5aa..8ea1a7e 100644 --- a/classquiz/db/models.py +++ b/classquiz/db/models.py @@ -164,22 +164,22 @@ class GamePlayer(BaseModel): sid: str -class GameAnser2(BaseModel): +class GameAnswer2(BaseModel): username: str right: bool answer: str -class GameAnser1(BaseModel): +class GameAnswer1(BaseModel): id: int - answers: list[GameAnser2] + answers: list[GameAnswer2] class GameSession(BaseModel): admin: str game_id: str players: list[GamePlayer | None] - answers: list[GameAnser1 | None] + answers: list[GameAnswer1 | None] class UpdatePassword(BaseModel): diff --git a/classquiz/routers/quiz.py b/classquiz/routers/quiz.py index b2439d4..b051d96 100644 --- a/classquiz/routers/quiz.py +++ b/classquiz/routers/quiz.py @@ -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, GameSession, GameAnswer1, GameAnswer2 from classquiz.kahoot_importer.import_quiz import import_quiz import html @@ -245,3 +245,27 @@ async def export_quiz_answers(export_token: str, game_pin: str): media_type="application/vnd.ms-excel", headers={"Content-Disposition": f"attachment;filename=ClassQuiz-{quiz.title}.xlsx"}, ) + + +class GetLiveDataResponse(BaseModel): + quiz: PlayGame + data: GameSession + + +@router.get("/live") +async def get_live_game_data(game_pin: int): + redis_res = await redis.get(f"game:{game_pin}") + if redis_res is None: + raise HTTPException(status_code=404, detail="Game not found") + game = PlayGame.parse_raw(redis_res) + data = GameSession.parse_raw(await redis.get(f"game_session:{game_pin}")) + for i in range(0, len(game.questions)): + res = await redis.get(f"game_session:{game_pin}:{i}") + if res is None: + break + else: + res = json.loads(res) + ga_1 = GameAnswer1(id=i, answers=[GameAnswer2.parse_obj(i) for i in res]) + data.answers.append(ga_1) + + return GetLiveDataResponse(quiz=game, data=data) diff --git a/classquiz/socket_server/__init__.py b/classquiz/socket_server/__init__.py index df2e397..7c0379f 100644 --- a/classquiz/socket_server/__init__.py +++ b/classquiz/socket_server/__init__.py @@ -10,7 +10,7 @@ import socketio from typing import Any from classquiz.config import redis, settings -from classquiz.db.models import PlayGame, QuizQuestionType +from classquiz.db.models import PlayGame, QuizQuestionType, GameSession, GamePlayer from pydantic import BaseModel, ValidationError sio = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins=[]) @@ -34,18 +34,6 @@ class _JoinGameData(BaseModel): captcha: str | None -class _GameSessionPlayer(BaseModel): - username: str - sid: str - - -class _GameSession(BaseModel): - admin: str - game_id: str - players: list[_GameSessionPlayer | None] - answers: list[Any] - - @sio.event async def join_game(sid: str, data: dict): redis_res = await redis.get(f"game:{data['game_pin']}") @@ -86,11 +74,11 @@ async def join_game(sid: str, data: dict): await sio.save_session(sid, session) await sio.emit("joined_game", redis_res, room=sid) redis_res = await redis.get(f"game_session:{data.game_pin}") - redis_res = _GameSession.parse_raw(redis_res) - redis_res.players.append(_GameSessionPlayer(username=data.username, sid=sid)) + redis_res = GameSession.parse_raw(redis_res) + redis_res.players.append(GamePlayer(username=data.username, sid=sid)) await redis.set( f"game_session:{data.game_pin}", - _GameSession(admin=redis_res.admin, game_id=redis_res.game_id, players=redis_res.players, answers=[]).json(), + GameSession(admin=redis_res.admin, game_id=redis_res.game_id, players=redis_res.players, answers=[]).json(), ex=18000, ) await sio.emit( @@ -126,7 +114,7 @@ async def register_as_admin(sid: str, data: dict): if (await redis.get(f"game_session:{game_pin}")) is None: await redis.set( f"game_session:{game_pin}", - _GameSession(admin=sid, game_id=game_id, answers=[], players=[]).json(), + GameSession(admin=sid, game_id=game_id, answers=[], players=[]).json(), ex=18000, )