This commit is contained in:
Mawoka
2022-05-02 16:18:27 +02:00
parent 4ac93b3624
commit 92b24d5a3e
6 changed files with 66 additions and 41 deletions
+1 -4
View File
@@ -99,10 +99,6 @@ class TokenData(BaseModel):
class PlayGame(BaseModel):
"""
For JWT
"""
quiz_id: uuid.UUID | str
description: str
title: str
@@ -110,6 +106,7 @@ class PlayGame(BaseModel):
game_id: uuid.UUID
game_pin: str
started: bool = False
captcha_enabled: bool = False
class GamePlayer(BaseModel):
+15 -2
View File
@@ -6,7 +6,7 @@ from random import randint
from classquiz.helpers import get_meili_data
from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import JSONResponse
from pydantic import ValidationError
from pydantic import ValidationError, BaseModel
import bleach
from classquiz.auth import get_current_user
@@ -76,7 +76,7 @@ async def get_public_quiz(quiz_id: str):
@router.post("/start/{quiz_id}")
async def start_quiz(quiz_id: str, user: User = Depends(get_current_user)):
async def start_quiz(quiz_id: str, captcha_enabled: bool = True, user: User = Depends(get_current_user)):
try:
quiz_id = uuid.UUID(quiz_id)
except ValueError:
@@ -94,11 +94,24 @@ async def start_quiz(quiz_id: str, user: User = Depends(get_current_user)):
game_id=uuid.uuid4(),
title=quiz.title,
description=quiz.description,
captcha_enabled=captcha_enabled,
)
await redis.set(f"game:{str(game.game_pin)}", (game.json()), ex=18000)
return {**quiz.dict(exclude={"id"}), **game.dict(exclude={"questions"})}
class CheckIfCaptchaEnabledResponse(BaseModel):
enabled: bool
@router.get("/play/check_captcha/{game_pin}", response_model=CheckIfCaptchaEnabledResponse)
async def check_if_captcha_enabled(game_pin: str):
game = await redis.get(f"game:{game_pin}")
if game is None:
return JSONResponse(status_code=404, content={"detail": "game not found"})
return CheckIfCaptchaEnabledResponse(**{"enabled": json.loads(game)["captcha_enabled"]})
@router.get("/join/{game_pin}")
async def get_game_id(game_pin: str):
redis_res = (await redis.get(f"game:{game_pin}")).decode()
+2 -1
View File
@@ -13,6 +13,8 @@ settings = settings()
@sio.event
async def join_game(sid, data):
async with aiohttp.ClientSession() as session:
redis_res = await redis.get(f"game:{data['game_pin']}")
if json.loads(redis_res)["captcha_enabled"]:
try:
async with session.post(
"https://hcaptcha.com/siteverify",
@@ -26,7 +28,6 @@ async def join_game(sid, data):
print("CAPTCHA FAILED")
return
redis_res = await redis.get(f"game:{data['game_pin']}")
if redis_res is None:
await sio.emit("game_not_found", room=sid)
else:
+5
View File
@@ -44,6 +44,10 @@
return;
}
let captcha_resp: string;
const captcha_enabled = (
await (await fetch(`/api/v1/quiz/play/check_captcha/${game_pin}`)).json()
).enabled;
if (captcha_enabled) {
try {
const { response } = await hcaptcha.execute(hcaptchaWidgetID, {
async: true
@@ -56,6 +60,7 @@
alert('Captcha failed, reloading the page probably helps!');
window.location.reload();
}
}
socket.emit('join_game', {
username: username,
game_pin: game_pin,
+9 -4
View File
@@ -48,12 +48,17 @@
const startGame = async (id: string): Promise<void> => {
console.log('start game', id);
const res = await fetch(`/api/v1/quiz/start/${id}`, {
let res;
if (window.confirm('Do you want to enable the captcha for players?')) {
res = await fetch(`/api/v1/quiz/start/${id}?captcha_enabled=True`, {
method: 'POST'
// headers: {
// 'Content-Type': 'application/json'
// }
});
} else {
res = await fetch(`/api/v1/quiz/start/${id}?captcha_enabled=False`, {
method: 'POST'
});
}
if (res.status !== 200) {
alert('Failed to start game!');
console.error(`Failed to start game, ${await res.text()}`);
+8 -4
View File
@@ -64,12 +64,16 @@
const startGame = async (id: string): Promise<void> => {
console.log('start game', id);
const res = await fetch(`/api/v1/quiz/start/${id}`, {
let res;
if (window.confirm('Do you want to enable the captcha for players?')) {
res = await fetch(`/api/v1/quiz/start/${id}?captcha_enabled=True`, {
method: 'POST'
// headers: {
// 'Content-Type': 'application/json'
// }
});
} else {
res = await fetch(`/api/v1/quiz/start/${id}?captcha_enabled=False`, {
method: 'POST'
});
}
if (res.status !== 200) {
throw new Error('Failed to start game');
}