mirror of
https://github.com/randyjc/Rahoot.git
synced 2026-03-13 20:15:35 +01:00
Emit total players count to clients in the room on player join and kick events
This commit is contained in:
@@ -37,6 +37,9 @@ const Manager = {
|
|||||||
io.in(playerId).socketsLeave(game.room)
|
io.in(playerId).socketsLeave(game.room)
|
||||||
io.to(player.id).emit("game:kick")
|
io.to(player.id).emit("game:kick")
|
||||||
io.to(game.manager).emit("manager:playerKicked", player.id)
|
io.to(game.manager).emit("manager:playerKicked", player.id)
|
||||||
|
|
||||||
|
// Emit updated total players to all clients in the room
|
||||||
|
io.to(game.room).emit("game:totalPlayers", game.players.length)
|
||||||
},
|
},
|
||||||
|
|
||||||
startGame: async (game, io, socket) => {
|
startGame: async (game, io, socket) => {
|
||||||
|
|||||||
@@ -56,6 +56,9 @@ const Player = {
|
|||||||
|
|
||||||
game.players.push(playerData)
|
game.players.push(playerData)
|
||||||
|
|
||||||
|
// Emit total players to all players in the room
|
||||||
|
io.to(player.room).emit("game:totalPlayers", game.players.length)
|
||||||
|
|
||||||
socket.emit("game:successJoin")
|
socket.emit("game:successJoin")
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -82,6 +85,8 @@ const Player = {
|
|||||||
data: { text: "Waiting for the players to answer" },
|
data: { text: "Waiting for the players to answer" },
|
||||||
})
|
})
|
||||||
socket.to(game.room).emit("game:playerAnswer", game.playersAnswer.length)
|
socket.to(game.room).emit("game:playerAnswer", game.playersAnswer.length)
|
||||||
|
// Also emit total players to keep the UI updated
|
||||||
|
io.to(game.room).emit("game:totalPlayers", game.players.length)
|
||||||
|
|
||||||
if (game.playersAnswer.length === game.players.length) {
|
if (game.playersAnswer.length === game.players.length) {
|
||||||
abortCooldown()
|
abortCooldown()
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ export default function Answers({
|
|||||||
const [percentages, setPercentages] = useState([])
|
const [percentages, setPercentages] = useState([])
|
||||||
const [cooldown, setCooldown] = useState(time)
|
const [cooldown, setCooldown] = useState(time)
|
||||||
const [totalAnswer, setTotalAnswer] = useState(0)
|
const [totalAnswer, setTotalAnswer] = useState(0)
|
||||||
|
const [totalPlayer, setTotalPlayer] = useState(0)
|
||||||
|
|
||||||
const [sfxPop] = useSound(SFX_ANSWERS_SOUND, {
|
const [sfxPop] = useSound(SFX_ANSWERS_SOUND, {
|
||||||
volume: 0.1,
|
volume: 0.1,
|
||||||
@@ -102,9 +103,14 @@ export default function Answers({
|
|||||||
sfxPop()
|
sfxPop()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
socket.on("game:totalPlayers", (total) => {
|
||||||
|
setTotalPlayer(total)
|
||||||
|
})
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
socket.off("game:cooldown")
|
socket.off("game:cooldown")
|
||||||
socket.off("game:playerAnswer")
|
socket.off("game:playerAnswer")
|
||||||
|
socket.off("game:totalPlayers")
|
||||||
}
|
}
|
||||||
}, [sfxPop])
|
}, [sfxPop])
|
||||||
|
|
||||||
@@ -150,7 +156,7 @@ export default function Answers({
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col items-center rounded-full bg-black/40 px-4 text-lg font-bold">
|
<div className="flex flex-col items-center rounded-full bg-black/40 px-4 text-lg font-bold">
|
||||||
<span className="translate-y-1 text-sm">Answers</span>
|
<span className="translate-y-1 text-sm">Answers</span>
|
||||||
<span>{totalAnswer}</span>
|
<span>{totalAnswer}/{totalPlayer}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { useEffect, useState } from "react"
|
|||||||
export default function Room({ data: { text, inviteCode } }) {
|
export default function Room({ data: { text, inviteCode } }) {
|
||||||
const { socket } = useSocketContext()
|
const { socket } = useSocketContext()
|
||||||
const [playerList, setPlayerList] = useState([])
|
const [playerList, setPlayerList] = useState([])
|
||||||
|
const [totalPlayers, setTotalPlayers] = useState(0)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
socket.on("manager:newPlayer", (player) => {
|
socket.on("manager:newPlayer", (player) => {
|
||||||
@@ -18,10 +19,15 @@ export default function Room({ data: { text, inviteCode } }) {
|
|||||||
setPlayerList(playerList.filter((p) => p.id !== playerId))
|
setPlayerList(playerList.filter((p) => p.id !== playerId))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
socket.on("game:totalPlayers", (total) => {
|
||||||
|
setTotalPlayers(total)
|
||||||
|
})
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
socket.off("manager:newPlayer")
|
socket.off("manager:newPlayer")
|
||||||
socket.off("manager:removePlayer")
|
socket.off("manager:removePlayer")
|
||||||
socket.off("manager:playerKicked")
|
socket.off("manager:playerKicked")
|
||||||
|
socket.off("game:totalPlayers")
|
||||||
}
|
}
|
||||||
}, [playerList])
|
}, [playerList])
|
||||||
|
|
||||||
@@ -35,6 +41,12 @@ export default function Room({ data: { text, inviteCode } }) {
|
|||||||
{text}
|
{text}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
|
<div className="mb-6 flex items-center justify-center rounded-full bg-black/40 px-6 py-3">
|
||||||
|
<span className="text-2xl font-bold text-white drop-shadow-md">
|
||||||
|
Players Joined: {totalPlayers}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-wrap gap-3">
|
<div className="flex flex-wrap gap-3">
|
||||||
{playerList.map((player) => (
|
{playerList.map((player) => (
|
||||||
<div
|
<div
|
||||||
|
|||||||
Reference in New Issue
Block a user