-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
97 lines (77 loc) · 2.87 KB
/
app.js
File metadata and controls
97 lines (77 loc) · 2.87 KB
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
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const mongoose = require('mongoose');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
mongoose.connect('mongodb://localhost:27017/ChatApp', {
useNewUrlParser: true,
useUnifiedTopology: true
});
const { Schema } = mongoose;
const userSchema = new Schema({
username: String,
profilePicture: String,
});
const roomSchema = new Schema({
roomId: String,
messages: [{
sender: String,
message: String,
timestamp: String
}]
});
const User = mongoose.model('User', userSchema);
const Room = mongoose.model('Room', roomSchema);
const users = {}; // Track connected users and their details
app.use(express.static('client/build'));
io.on('connection', (socket) => {
console.log('New client connected');
socket.on('getUsers', async () => {
const usersList = await User.find();
socket.emit('users', usersList);
});
socket.on('join', async (data) => {
const { username, profilePicture } = data;
users[socket.id] = { username, profilePicture };
console.log(`User joined: ${username} with socket ID: ${socket.id}`);
const user = await User.findOneAndUpdate(
{ username },
{ username, profilePicture },
{ upsert: true, new: true }
);
io.emit('users', await User.find());
socket.emit('onlineUsers', Object.values(users).map(user => user.username));
});
socket.on('disconnect', async () => {
const user = users[socket.id];
if (user) {
delete users[socket.id];
io.emit('users', await User.find());
}
});
socket.on('privateMessage', async (data) => {
const { recipient, message, sender, timestamp, roomId } = data;
console.log('Server received message:', data);
const room = await Room.findOneAndUpdate(
{ roomId },
{ $push: { messages: { sender, message, timestamp } } },
{ upsert: true, new: true }
);
const recipientSocketId = Object.keys(users).find(key => users[key].username === recipient);
if (recipientSocketId) {
io.to(recipientSocketId).emit('receiveMessage', JSON.stringify({ sender, message, roomId, timestamp }));
}
});
socket.on('fetchMessages', async (roomId) => {
const room = await Room.findOne({ roomId });
if (room) {
const messages = room.messages.map(({ sender, message, timestamp }) => ({ sender, message, timestamp, roomId }));
socket.emit('loadMessages', JSON.stringify(messages));
} else {
socket.emit('loadMessages', JSON.stringify([]));
}
});
});
server.listen(5000, () => console.log('Server is running on port 5000'));