✨ Players can be kicked
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user