diff --git a/backend/app.js b/backend/app.js index fd56d82..5bdcc99 100644 --- a/backend/app.js +++ b/backend/app.js @@ -15,86 +15,8 @@ mongoose const app = express(); const http = require("http"); const server = http.createServer(app); -const { Server } = require("socket.io"); -const { sendEmail } = require("./mail"); -const { User } = require("./models/user"); -const io = new Server(server, { cors: { origin: "*" } }); +const { socketIOServerInit } = require("./socket"); -const activeRooms = new Map(); -const pendingChallenges = new Map(); - -io.on("connection", (socket) => { - console.log("Client connected:", socket.id); - - socket.on("disconnect", () => { - console.log("Disconnecting"); - }); - - // Handle join event - socket.on("join-room", async (roomID, playerUsername, challengedPlayerUsername, gameData) => { - // room exists - console.log(roomID, playerUsername, challengedPlayerUsername); - console.log("activeRooms", activeRooms); - console.log("pendingChallenges", pendingChallenges); - // if (activeRooms.has(roomID)) { - // socket.emit("room-full"); - // console.log('Room full'); - // return; - // } else - if (pendingChallenges.has(roomID)) { - const challenge = pendingChallenges.get(roomID); - pendingChallenges.delete(roomID); - let newRoom = { - id: roomID, - players: { - challenger: { - id: challenge.challengerID, - name: challenge.challengerUsername, - }, - challenged: { - id: socket.id, - name: playerUsername, - }, - }, - }; - console.log("New room created", roomID); - socket.join(roomID); - activeRooms.set(roomID, newRoom); - socket.emit("joined-room", { - color: challenge.challengerColor === "w" ? "b" : "w", - timeLimit: challenge.timeLimit, - }); - // io.to(roomID).emit("joined-room"); - } else { - // no room on pending challenges found - const challenge = { - roomID, - challengerID: socket.id, - challengerUsername: playerUsername, - challengedUsername: challengedPlayerUsername, - challengerColor: gameData.color, - timeLimit: gameData.timeLimit, - }; - pendingChallenges.set(roomID, challenge); - - console.log(challengedPlayerUsername); - // notify the challenged player - const email = (await User.findOne({ username: challengedPlayerUsername })).email; - sendEmail( - email, - `Challenge from ${playerUsername}`, - `To accept the challenge follow the link: http://192.168.136.99:5173/game/challenges/${challengedPlayerUsername}/${roomID} \n login through: http://192.168.136.99:5173/login \n roomid:${roomID}` - ); - - socket.join(roomID); - socket.emit("joined-room"); - } - }); - - socket.on("move", (roomID, moveData) => { - socket.to(roomID).emit("opponent-move", moveData); - }); -}); app.use(cors({ origin: "*" })); app.use(bodyParser.json()); @@ -105,6 +27,8 @@ app.use((req, res, next) => { next(); }); +socketIOServerInit(server); + app.use((req, res, next) => { console.log(req.url); next(); diff --git a/backend/mail.js b/backend/mail.js index 8cfa8f8..e955e9b 100644 --- a/backend/mail.js +++ b/backend/mail.js @@ -8,7 +8,6 @@ const transporter = nodemailer.createTransport({ }); const sendEmail = (receiverEmail, subject, data) => { - console.log(process.env.MAIL_SERVER_PASSWORD); let mailDetails = { from: "chessroyalemail@gmail.com", to: receiverEmail, diff --git a/backend/socket.js b/backend/socket.js new file mode 100644 index 0000000..e0d1102 --- /dev/null +++ b/backend/socket.js @@ -0,0 +1,65 @@ +const socket = require("socket.io"); + +let activeRooms = new Map(); + +function createRoom(roomID, timeLimit) { + activeRooms.set(roomID, { timeLimit, players: [] }); +} + +// structure of userDetails: {username,color} +function addUserToRoom(roomID, userDetails) { + let { username, color } = userDetails; + let room = activeRooms.get(roomID); + + if (room.players) { + // room is full + if (Object.keys(room.players).length > 1) { + return "room-full"; + } else { + // only one user in room + room.players[username].color = color; + } + } else { + // add player in the room + room.players = {}; + room.players[username].color = color; + } + return "join-room-success"; +} + +// initialize the socket server with the given http server instance +function socketIOServerInit(server) { + const io = new socket.Server(server); + + io.on("connection", (socket) => { + let id = socket.id; + console.log(socket.id, "connected"); + + socket.on("disconnect", (reason) => { + console.log(id, "disconnected due to", reason); + }); + + // data is the metadata of the user joining the room played between the users + // structure: {username,color} + socket.on("join-room", (roomID, data) => { + if (activeRooms.has(roomID)) { + let result = addUserToRoom(roomID, data); + if (result === "join-room-success") { + socket.join(roomID); + io.to(roomID).emit("new user joined the room"); + socket.emit(result); // room joined successfully + } else { + socket.emit(result); // room is full + } + } else { + socket.emit("join-room-error", "room does not exist"); + } + }); + }); +} + +module.exports = { + createRoom, + addUserToRoom, + socketIOServerInit, +};