-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
135 lines (109 loc) · 3.87 KB
/
app.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 socket = require('socket.io');
const formatMessage = require('./utils/messages');
const { userJoin, getCurrentUser, userLeave, getRoomUsers } = require('./utils/users');
const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-';
const ROOM_SIZE = 5; // maximum room size
const LENGTH = 20;
// stores room codes
let roomCodes = new Set();
// creating the app
const app = express();
// start listening on port 3000
const server = app.listen(3000, () => {
console.log("listening on port 3000");
console.log("Press ctrl + C to exit");
});
// registering view engine
app.set('view engine', 'ejs');
app.set('views', 'public/views');
// set static folder
app.use(express.static(__dirname + '/public'));
// passing server to the socket to allow bidirectional communication
const io = socket(server);
io.on("connection", socket => {
// console.log("Made socket connection", socket.id);
// run when a user joins
socket.on('joinRoom', ({ username, roomname }) => {
// add user to list of users
const user = userJoin(socket.id, username, roomname);
socket.join(user.room);
// welcome user
socket.emit('message', formatMessage( '',`Welcome! ${user.username}`));
// send to everyone in the room that a user has joined
socket.broadcast.to(user.room).emit('message', formatMessage('', `${user.username} has joined the chat`));
// send room details to client
io.to(user.room).emit('roomUsers', { room: user.room, users: getRoomUsers(user.room) });
});
// listen for messages from users
socket.on('chatMessage', msg => {
const user = getCurrentUser(socket.id);
// console.log(msg);
io.to(user.room).emit('message', formatMessage(user.username, msg));
});
// when user disconnects
socket.on('disconnect', () => {
// console.log("Socket disconnected", socket.id);
const user = userLeave(socket.id);
if (user !== undefined) {
// remove user from list of users
io.to(user.room).emit('message', formatMessage('', `${user.username} has left the chat`));
// send room details to client
io.to(user.room).emit('roomUsers', { room: user.room, users: getRoomUsers(user.room) });
// delete room if there are no users in the room
if (getRoomUsers(user.room).length === 0) {
roomCodes.delete(user.room);
}
}
});
// listening to code requests from users
socket.on('newCodeRequest', () => {
// sending new code to user
socket.emit('newCodeResponse', generateNewCode());
});
// listening to roomcode validation requests from users
socket.on('checkCode', roomcode => {
// sending response to user
socket.emit('checkCodeResponse', codeInSet(roomcode));
});
socket.on('addRoom', (room) => {
roomCodes.add(room);
});
});
// handling routes
app.get('/', (req, res) => {
res.render('index');
});
app.get('/chat', (req, res) => {
res.render('chat');
});
app.get('/invalid', (req, res) => {
res.render('invalid');
});
app.get('*', (req, res) => {
res.render('404');
});
// function to generate a code
function generateCode() {
let code = '';
for (let i = 0; i < LENGTH; i++) {
code += characters[Math.floor(Math.random() * characters.length)];
}
return code;
}
// function to generate a code that is not in the set of room codes
function generateNewCode() {
let code = generateCode();
while (roomCodes.has(code)) {
code = generateCode();
}
roomCodes.add(code);
return code;
}
// function that checks if a code is in set of room codes
function codeInSet(code) {
if (roomCodes.has(code)) {
return (getRoomUsers(code).length === ROOM_SIZE ? 2 : 1)
}
return 0;
}