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;
+ };