Files
Rahoot/socket/index.js
2025-09-28 12:58:51 +02:00

75 lines
2.0 KiB
JavaScript

import { Server } from "socket.io"
import { GAME_STATE_INIT, WEBSOCKET_SERVER_PORT } from "../config.mjs"
import Manager from "./roles/manager.js"
import Player from "./roles/player.js"
import { abortCooldown } from "./utils/cooldown.js"
import deepClone from "./utils/deepClone.js"
let gameState = deepClone(GAME_STATE_INIT)
const io = new Server({
cors: {
origin: "*",
},
})
console.log(`Server running on port ${WEBSOCKET_SERVER_PORT}`)
io.listen(WEBSOCKET_SERVER_PORT)
io.on("connection", (socket) => {
console.log(`A user connected ${socket.id}`)
socket.on("player:checkRoom", (roomId) =>
Player.checkRoom(gameState, io, socket, roomId),
)
socket.on("player:join", (player) =>
Player.join(gameState, io, socket, player),
)
socket.on("manager:createRoom", (password) =>
Manager.createRoom(gameState, io, socket, password),
)
socket.on("manager:kickPlayer", (playerId) =>
Manager.kickPlayer(gameState, io, socket, playerId),
)
socket.on("manager:startGame", () => Manager.startGame(gameState, io, socket))
socket.on("player:selectedAnswer", (answerKey) =>
Player.selectedAnswer(gameState, io, socket, answerKey),
)
socket.on("manager:abortQuiz", () => Manager.abortQuiz(gameState, io, socket))
socket.on("manager:nextQuestion", () =>
Manager.nextQuestion(gameState, io, socket),
)
socket.on("manager:showLeaderboard", () =>
Manager.showLoaderboard(gameState, io, socket),
)
socket.on("disconnect", () => {
console.log(`user disconnected ${socket.id}`)
if (gameState.manager === socket.id) {
console.log("Reset game")
io.to(gameState.room).emit("game:reset")
gameState.started = false
gameState = deepClone(GAME_STATE_INIT)
abortCooldown()
return
}
const player = gameState.players.find((p) => p.id === socket.id)
if (player) {
gameState.players = gameState.players.filter((p) => p.id !== socket.id)
socket.to(gameState.manager).emit("manager:removePlayer", player.id)
}
})
})