This commit is contained in:
Mawoka
2022-09-17 14:43:16 +02:00
parent afe1bb5f4c
commit cd2e4245d0
3 changed files with 34 additions and 22 deletions
+4 -4
View File
@@ -164,22 +164,22 @@ class GamePlayer(BaseModel):
sid: str sid: str
class GameAnser2(BaseModel): class GameAnswer2(BaseModel):
username: str username: str
right: bool right: bool
answer: str answer: str
class GameAnser1(BaseModel): class GameAnswer1(BaseModel):
id: int id: int
answers: list[GameAnser2] answers: list[GameAnswer2]
class GameSession(BaseModel): class GameSession(BaseModel):
admin: str admin: str
game_id: str game_id: str
players: list[GamePlayer | None] players: list[GamePlayer | None]
answers: list[GameAnser1 | None] answers: list[GameAnswer1 | None]
class UpdatePassword(BaseModel): class UpdatePassword(BaseModel):
+25 -1
View File
@@ -18,7 +18,7 @@ import bleach
from classquiz.auth import get_current_user from classquiz.auth import get_current_user
from classquiz.config import redis, settings, storage, meilisearch 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 from classquiz.kahoot_importer.import_quiz import import_quiz
import html import html
@@ -245,3 +245,27 @@ async def export_quiz_answers(export_token: str, game_pin: str):
media_type="application/vnd.ms-excel", media_type="application/vnd.ms-excel",
headers={"Content-Disposition": f"attachment;filename=ClassQuiz-{quiz.title}.xlsx"}, 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)
+5 -17
View File
@@ -10,7 +10,7 @@ import socketio
from typing import Any from typing import Any
from classquiz.config import redis, settings 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 from pydantic import BaseModel, ValidationError
sio = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins=[]) sio = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins=[])
@@ -34,18 +34,6 @@ class _JoinGameData(BaseModel):
captcha: str | None 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 @sio.event
async def join_game(sid: str, data: dict): async def join_game(sid: str, data: dict):
redis_res = await redis.get(f"game:{data['game_pin']}") 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.save_session(sid, session)
await sio.emit("joined_game", redis_res, room=sid) await sio.emit("joined_game", redis_res, room=sid)
redis_res = await redis.get(f"game_session:{data.game_pin}") redis_res = await redis.get(f"game_session:{data.game_pin}")
redis_res = _GameSession.parse_raw(redis_res) redis_res = GameSession.parse_raw(redis_res)
redis_res.players.append(_GameSessionPlayer(username=data.username, sid=sid)) redis_res.players.append(GamePlayer(username=data.username, sid=sid))
await redis.set( await redis.set(
f"game_session:{data.game_pin}", 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, ex=18000,
) )
await sio.emit( 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: if (await redis.get(f"game_session:{game_pin}")) is None:
await redis.set( await redis.set(
f"game_session:{game_pin}", 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, ex=18000,
) )