-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
135 lines (116 loc) · 3.97 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
const express = require("express");
const http = require("http");
const socketIo = require("socket.io");
const path = require("path");
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
app.use(express.static(path.join(__dirname)));
let rooms = {}; // stores room details including users and passwords
io.on("connection", (socket) => {
socket.emit("update room list", Object.keys(rooms));
const allUsers = Object.values(rooms).flatMap((room) => Object.values(room.users));
socket.emit("update user list", allUsers);
console.log("New client connected");
let addedUser = false;
let currentRoom = "";
socket.on("disconnect", () => {
if (addedUser && currentRoom) {
if (rooms[currentRoom]) {
delete rooms[currentRoom].users[socket.id];
io.in(currentRoom).emit(
"update user list",
Object.values(rooms[currentRoom].users),
);
io.in(currentRoom).emit("message", {
systemMessage: true,
message: `${socket.username} left the chat`,
});
}
console.log(`${socket.username} disconnected from ${currentRoom}`);
}
});
socket.on("add user", ({ username, room, password }) => {
if (addedUser && currentRoom && currentRoom !== room) {
validatePassword(room, password, (isValid) => {
if (isValid) {
switchRoom(socket, { room, username });
} else {
socket.emit("password incorrect");
console.log(`Password incorrect for room: ${room}`);
}
});
} else {
validatePassword(room, password, (isValid) => {
if (isValid) {
joinRoom(socket, { room, username, password });
} else {
socket.emit("password incorrect");
console.log(`Password incorrect for room: ${room}`);
}
});
}
});
function switchRoom(socket, { room, username }) {
if (currentRoom) {
socket.leave(currentRoom);
delete rooms[currentRoom].users[socket.id];
io.in(currentRoom).emit(
"update user list",
Object.values(rooms[currentRoom].users),
);
io.in(currentRoom).emit("message", {
systemMessage: true,
message: `${socket.username} left the chat`,
});
console.log(`${socket.username} left room: ${currentRoom}`);
}
joinRoom(socket, { room, username });
}
function validatePassword(room, password, callback) {
if (!rooms[room] || !rooms[room].password || rooms[room].password === password) {
callback(true);
} else {
callback(false);
}
}
function joinRoom(socket, { username, room, password }) {
socket.username = username;
if (!rooms[room]) {
rooms[room] = { password: password || null, users: {} };
console.log(`Room created: ${room} with password: ${password || "none"}`);
}
addedUser = true;
currentRoom = room;
rooms[room].users[socket.id] = username;
socket.join(room);
const usersInRoom = Object.values(rooms[room].users);
io.in(room).emit("update user list", usersInRoom);
io.emit("update room list", Object.keys(rooms));
socket.emit("user joined", { username: socket.username, room: room });
io.in(room).emit("message", {
systemMessage: true,
message: `${socket.username} joined the chat`,
});
console.log(`${socket.username} joined room: ${room}`);
}
socket.on("sendMessage", (data) => {
if (!addedUser || !currentRoom) return;
io.in(currentRoom).emit("message", {
username: socket.username,
message: data.message,
});
console.log(
`Message from ${socket.username} in room ${currentRoom}: ${data.message}`,
);
});
socket.on("get room info", (roomName, callback) => {
if (rooms[roomName]) {
callback({ passwordRequired: !!rooms[roomName].password });
} else {
callback({ passwordRequired: false });
}
});
});
const PORT = process.env.PORT || 1170;
server.listen(PORT, () => console.log(`Server running on port ${PORT}`));