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): class PlayGame(BaseModel):
"""
For JWT
"""
quiz_id: uuid.UUID | str quiz_id: uuid.UUID | str
description: str description: str
title: str title: str
@@ -110,6 +106,7 @@ class PlayGame(BaseModel):
game_id: uuid.UUID game_id: uuid.UUID
game_pin: str game_pin: str
started: bool = False started: bool = False
captcha_enabled: bool = False
class GamePlayer(BaseModel): class GamePlayer(BaseModel):
+15 -2
View File
@@ -6,7 +6,7 @@ from random import randint
from classquiz.helpers import get_meili_data from classquiz.helpers import get_meili_data
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from pydantic import ValidationError from pydantic import ValidationError, BaseModel
import bleach import bleach
from classquiz.auth import get_current_user from classquiz.auth import get_current_user
@@ -76,7 +76,7 @@ async def get_public_quiz(quiz_id: str):
@router.post("/start/{quiz_id}") @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: try:
quiz_id = uuid.UUID(quiz_id) quiz_id = uuid.UUID(quiz_id)
except ValueError: except ValueError:
@@ -94,11 +94,24 @@ async def start_quiz(quiz_id: str, user: User = Depends(get_current_user)):
game_id=uuid.uuid4(), game_id=uuid.uuid4(),
title=quiz.title, title=quiz.title,
description=quiz.description, description=quiz.description,
captcha_enabled=captcha_enabled,
) )
await redis.set(f"game:{str(game.game_pin)}", (game.json()), ex=18000) await redis.set(f"game:{str(game.game_pin)}", (game.json()), ex=18000)
return {**quiz.dict(exclude={"id"}), **game.dict(exclude={"questions"})} 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}") @router.get("/join/{game_pin}")
async def get_game_id(game_pin: str): async def get_game_id(game_pin: str):
redis_res = (await redis.get(f"game:{game_pin}")).decode() redis_res = (await redis.get(f"game:{game_pin}")).decode()
+2 -1
View File
@@ -13,6 +13,8 @@ settings = settings()
@sio.event @sio.event
async def join_game(sid, data): async def join_game(sid, data):
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session:
redis_res = await redis.get(f"game:{data['game_pin']}")
if json.loads(redis_res)["captcha_enabled"]:
try: try:
async with session.post( async with session.post(
"https://hcaptcha.com/siteverify", "https://hcaptcha.com/siteverify",
@@ -26,7 +28,6 @@ async def join_game(sid, data):
print("CAPTCHA FAILED") print("CAPTCHA FAILED")
return return
redis_res = await redis.get(f"game:{data['game_pin']}")
if redis_res is None: if redis_res is None:
await sio.emit("game_not_found", room=sid) await sio.emit("game_not_found", room=sid)
else: else:
+5
View File
@@ -44,6 +44,10 @@
return; return;
} }
let captcha_resp: string; let captcha_resp: string;
const captcha_enabled = (
await (await fetch(`/api/v1/quiz/play/check_captcha/${game_pin}`)).json()
).enabled;
if (captcha_enabled) {
try { try {
const { response } = await hcaptcha.execute(hcaptchaWidgetID, { const { response } = await hcaptcha.execute(hcaptchaWidgetID, {
async: true async: true
@@ -56,6 +60,7 @@
alert('Captcha failed, reloading the page probably helps!'); alert('Captcha failed, reloading the page probably helps!');
window.location.reload(); window.location.reload();
} }
}
socket.emit('join_game', { socket.emit('join_game', {
username: username, username: username,
game_pin: game_pin, game_pin: game_pin,
+9 -4
View File
@@ -48,12 +48,17 @@
const startGame = async (id: string): Promise<void> => { const startGame = async (id: string): Promise<void> => {
console.log('start game', id); 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' 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) { if (res.status !== 200) {
alert('Failed to start game!'); alert('Failed to start game!');
console.error(`Failed to start game, ${await res.text()}`); console.error(`Failed to start game, ${await res.text()}`);
+8 -4
View File
@@ -64,12 +64,16 @@
const startGame = async (id: string): Promise<void> => { const startGame = async (id: string): Promise<void> => {
console.log('start game', id); 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' 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) { if (res.status !== 200) {
throw new Error('Failed to start game'); throw new Error('Failed to start game');
} }