From 0d41f24a42af1bc504aa2c9be4726f0be1eb9096 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Sun, 25 Sep 2022 17:12:25 +0200 Subject: [PATCH] :sparkles: Players can be kicked --- classquiz/socket_server/__init__.py | 29 ++++++++++++++++++++++++++ frontend/src/routes/admin/+page.svelte | 19 ++++++++++++++++- frontend/src/routes/play/+page.svelte | 23 ++++++++++++++++---- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/classquiz/socket_server/__init__.py b/classquiz/socket_server/__init__.py index 2778107..8ac4665 100644 --- a/classquiz/socket_server/__init__.py +++ b/classquiz/socket_server/__init__.py @@ -81,6 +81,10 @@ async def join_game(sid: str, data: dict): except TypeError: pass # --- END checking captcha --- + if await redis.get(f"game_session:{data.game_pin}:players:{data.username}") is not None: + await sio.emit("username_already_exists", room=sid) + return + session = { "game_pin": data.game_pin, "username": data.username, @@ -97,6 +101,7 @@ async def join_game(sid: str, data: dict): ) redis_res = await redis.get(f"game_session:{data.game_pin}") redis_res = GameSession.parse_raw(redis_res) + await redis.set(f"game_session:{data.game_pin}:players:{data.username}", sid, ex=18000) await redis.sadd(f"game_session:{data.game_pin}:players", GamePlayer(username=data.username, sid=sid).json()) # await redis.set( # f"game_session:{data.game_pin}", @@ -344,3 +349,27 @@ async def echo_time_sync(sid: str, data: str): delta = now - then async with sio.session(sid) as session: session["ping"] = delta.microseconds / 1000 + + +class _KickPlayerInput(BaseModel): + username: str + + +@sio.event +async def kick_player(sid: str, data: dict): + try: + data = _KickPlayerInput(**data) + except ValidationError as e: + await sio.emit("error", room=sid) + print(e) + return + + session: dict = await sio.get_session(sid) + if not session["admin"]: + return + + player_sid = await redis.get(f"game_session:{session['game_pin']}:players:{data.username}") + + print(player_sid, session["game_pin"]) + sio.leave_room(player_sid, session["game_pin"]) + await sio.emit("kick", room=player_sid) diff --git a/frontend/src/routes/admin/+page.svelte b/frontend/src/routes/admin/+page.svelte index 66f0ccd..e7ac679 100644 --- a/frontend/src/routes/admin/+page.svelte +++ b/frontend/src/routes/admin/+page.svelte @@ -104,6 +104,18 @@ (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches); } + + const kick_player = (username: string) => { + socket.emit('kick_player', { username: username }); + for (let i = 0; i < players.length; i++) { + console.log(players[i].username, username); + if (players[i].username === username) { + players.splice(i, 1); + break; + } + } + players = players; + }; @@ -147,7 +159,12 @@ {#if players.length > 0} {#each players as player}
  • - {player.username} + { + kick_player(player.username); + }}>{player.username}
  • {/each} diff --git a/frontend/src/routes/play/+page.svelte b/frontend/src/routes/play/+page.svelte index be0b848..cface64 100644 --- a/frontend/src/routes/play/+page.svelte +++ b/frontend/src/routes/play/+page.svelte @@ -47,16 +47,20 @@ let question; + let preventReload = true; + // Functions function restart() { unique = {}; } const confirmUnload = () => { - event.preventDefault(); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - event.returnValue = ''; + if (preventReload) { + event.preventDefault(); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + event.returnValue = ''; + } }; socket.on('time_sync', (data) => { @@ -96,6 +100,17 @@ } }); + socket.on('username_already_exists', () => { + window.alert('Username already exists!'); + }); + + socket.on('kick', () => { + window.alert('You got kicked'); + preventReload = false; + game_pin = ''; + username = ''; + window.location.reload(); + }); socket.on('final_results', (data) => { final_results = data; });