Players can be kicked

This commit is contained in:
Mawoka
2022-09-25 17:12:25 +02:00
parent 0171d8a4b1
commit 0d41f24a42
3 changed files with 66 additions and 5 deletions
+29
View File
@@ -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)
+18 -1
View File
@@ -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;
};
</script>
<svelte:window on:beforeunload={confirmUnload} />
@@ -147,7 +159,12 @@
{#if players.length > 0}
{#each players as player}
<li>
<span>{player.username}</span>
<span
class="hover:line-through"
on:click={() => {
kick_player(player.username);
}}>{player.username}</span
>
<!-- <button>{$t('words.kick')}</button>-->
</li>
{/each}
+19 -4
View File
@@ -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;
});