Add concurrently

This commit is contained in:
Ralex91
2024-02-08 16:32:05 +01:00
parent 31122b9d2f
commit 8a9b8df7d2
14 changed files with 252 additions and 298 deletions

105
socket/roles/manager.js Normal file
View File

@@ -0,0 +1,105 @@
import { GAME_STATE_INIT } from "../quizz.config.js"
import { startRound } from "../utils/round.js"
import generateRoomId from "../utils/generateRoomId.js"
import { cooldown, sleep } from "../utils/cooldown.js"
import deepClone from "../utils/deepClone.js"
const Manager = {
createRoom: (game, io, socket, password) => {
if (game.password !== password) {
io.to(socket.id).emit("game:errorMessage", "Bad Password")
return
}
if (game.manager || game.room) {
io.to(socket.id).emit("game:errorMessage", "Already manager")
return
}
let roomInvite = generateRoomId()
game.room = roomInvite
game.manager = socket.id
socket.join(roomInvite)
io.to(socket.id).emit("manager:inviteCode", roomInvite)
console.log("New room created: " + roomInvite)
},
kickPlayer: (game, io, socket, playerId) => {
if (game.manager !== socket.id) {
return
}
const player = game.players.find((p) => p.id === playerId)
game.players = game.players.filter((p) => p.id !== playerId)
io.in(playerId).socketsLeave(game.room)
io.to(player.id).emit("game:kick")
io.to(game.manager).emit("manager:playerKicked", player.id)
},
startGame: async (game, io, socket) => {
if (game.started || !game.room) {
return
}
game.started = true
io.to(game.room).emit("game:status", {
name: "SHOW_START",
data: {
time: 3,
subject: "Adobe",
},
})
await sleep(3)
io.to(game.room).emit("game:startCooldown")
await cooldown(3, io, game.room)
startRound(game, io, socket)
},
nextQuestion: (game, io, socket) => {
if (!game.started) {
return
}
if (socket.id !== game.manager) {
return
}
if (!game.questions[game.currentQuestion + 1]) {
return
}
game.currentQuestion++
startRound(game, io, socket)
},
showLoaderboard: (game, io, socket) => {
if (!game.questions[game.currentQuestion + 1]) {
socket.emit("game:status", {
name: "FINISH",
data: {
subject: game.subject,
top: game.players.slice(0, 3).sort((a, b) => b.points - a.points),
},
})
game = deepClone(GAME_STATE_INIT)
return
}
socket.emit("game:status", {
name: "SHOW_LEADERBOARD",
data: {
leaderboard: game.players
.sort((a, b) => b.points - a.points)
.slice(0, 5),
},
})
},
}
export default Manager

92
socket/roles/player.js Normal file
View File

@@ -0,0 +1,92 @@
import convertTimeToPoint from "../utils/convertTimeToPoint.js"
import { abortCooldown } from "../utils/cooldown.js"
import { inviteCodeValidator, usernameValidator } from "../validator.js"
const Player = {
checkRoom: async (game, io, socket, roomId) => {
try {
await inviteCodeValidator.validate(roomId)
} catch (error) {
socket.emit("game:errorMessage", error.errors[0])
return
}
if (!game.room || roomId !== game.room) {
socket.emit("game:errorMessage", "Room not found")
return
}
socket.emit("game:successRoom", roomId)
},
join: async (game, io, socket, player) => {
try {
await usernameValidator.validate(player.username)
} catch (error) {
socket.emit("game:errorMessage", error.errors[0])
return
}
if (!game.room || player.room !== game.room) {
socket.emit("game:errorMessage", "Room not found")
return
}
if (game.players.find((p) => p.username === player.username)) {
socket.emit("game:errorMessage", "Username already exists")
return
}
if (game.started) {
socket.emit("game:errorMessage", "Game already started")
return
}
console.log("New Player", player)
socket.join(player.room)
let playerData = {
username: player.username,
room: player.room,
id: socket.id,
points: 0,
}
socket.to(player.room).emit("manager:newPlayer", { ...playerData })
game.players.push(playerData)
socket.emit("game:successJoin")
},
selectedAnswer: (game, io, socket, answerKey) => {
const player = game.players.find((player) => player.id === socket.id)
const question = game.questions[game.currentQuestion]
if (!player) {
return
}
if (game.playersAnswer.find((p) => p.id === socket.id)) {
return
}
game.playersAnswer.push({
id: socket.id,
answer: answerKey,
points: convertTimeToPoint(game.roundStartTime, question.time),
})
socket.emit("game:status", {
name: "WAIT",
data: { text: "Waiting for the players to answer" },
})
socket.to(game.room).emit("game:playerAnswer", game.playersAnswer.length)
if (game.playersAnswer.length === game.players.length) {
abortCooldown()
}
},
}
export default Player