✨ Closes #112
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user