-
Notifications
You must be signed in to change notification settings - Fork 0
/
socketioEvents.js
81 lines (58 loc) · 2.63 KB
/
socketioEvents.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
const {Server} = require('socket.io');
let io;
const RoomMember = require('./models/RoomMember');
const Message = require('./models/Message');
const Room = require('./models/Room');
function initializeSocketIO (httpServer, session) {
const wrap = middleware => (socket, next) => middleware(socket.request, {}, next);
io = new Server(httpServer);
io.use(wrap(session));
io.on('connection', (socket) => {
const connectedUser = socket.request.session.user;
if(connectedUser == null) return socket.disconnect();
console.log(connectedUser);
socket.join(connectedUser.id);
getJoinedRooms(connectedUser.id).then( (rooms) => {
connectedUser.joinedRooms = rooms;
console.log(rooms);
rooms.forEach( (room => socket.join(room.id)));
socket.emit('rooms', rooms);
});
socket.emit('whoami', { username: connectedUser.username });
socket.on('chat message', (msg) => {
isRoomJoined = connectedUser.joinedRooms.find(room => room.id == msg.room.id);
// Checking if the user is not joined in the room
if(!isRoomJoined) return socket.emit('error', 'You are not joined in this room.');
msg.time = Date.now();
msg.user = connectedUser.id;
// Saving message to the database
Message.create(msg).catch( (err) => console.log(err) );
msg.user = connectedUser;
// Emiting message to all other users in the room
socket.to(msg.room.id).emit('chat message', msg);
});
socket.on('listenToRoom', async (roomId) => {
const membershipInfo = await RoomMember.findOne({ roomId: roomId, userId: connectedUser.id });
if(!membershipInfo) return;
socket.join(roomId);
let room = await Room.findById(roomId)
connectedUser.joinedRooms.push(room);
});
socket.on('disconnect', () => {
console.log(`User ${connectedUser.username} Disconnected`);
});
console.log(`User ${connectedUser.username} is connected`);
});
}
async function getJoinedRooms(userId) {
let joinedRoomsId = await findMyRoomsIds(userId);
return await Room.find({ '_id': {'$in': joinedRoomsId }}, { 'password': 0 });
}
function findMyRoomsIds (userId) {
return RoomMember.find({ userId: userId }).then( (joinRequests) => {
return joinRequests.map( (joinRequest) => joinRequest.roomId);
});
}
module.exports = {
initializeSocketIO
}