-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.js
149 lines (130 loc) · 4.61 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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
const path = require('path');
const express = require('express');
const http = require('http');
const socketio = require('socket.io');
const session = require('express-session');
const bodyParser = require('body-parser');
const dotenv = require('dotenv');
const data = require('./data');
const messageToObject = require('./utils/messages');
const { joinUser, getCurrentUser, leaveUser, getOnline } = require('./utils/users')
const Pool = require('pg').Pool
const pool = new Pool({
user: 'me',
host: 'localhost',
database: 'messages',
password: 'password',
port: 5432,
})
dotenv.config();
const app = express();
const server = http.createServer(app);
const io = socketio(server);
const sessionMiddleware = session({
secret: 'secret',
resave: true,
saveUninitialized: true
});
app.use(sessionMiddleware);
app.use(bodyParser.urlencoded({extended : true}));
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'public')));
io.use(function(socket, next) {
sessionMiddleware(socket.request, socket.request.res || {}, next);
});
app.get('/', function(req, res) {
res.sendFile(path.join(__dirname + '/public/index.html'));
});
app.post('/login', async (req, res) => {
var username = req.body.username;
var password = req.body.password;
var success = false;
if (username && password) {
for (var user of data.getUsers()) {
if (user.username == username && user.password == password) {
req.session.loggedin = true;
req.session.username = username;
req.session.room = req.body.group + '-' + req.body.channel;
success = true;
req.session.save(function (err) {
res.redirect('/selectChannel');
})
}
}
if (!success) {
res.send('Incorrect username or password!');
}
} else {
res.send('Please enter Username and Password!');
}
});
app.get( '/selectChannel', (req,res) => {
if (req.session.loggedin) {
res.sendFile(path.join(__dirname + '/public/selectChannel.html'));
} else {
res.send('Please login to view this page!');
}
});
app.post('/chat', (req, res) => {
if (req.session.loggedin) {
req.session.room = req.body.group + '-' + req.body.channel;
res.sendFile(path.join(__dirname + '/public/chat.html'));
} else {
res.send('Please login to view this page!');
}
});
//client connects
io.on('connection', socket => {
//session info
const username = socket.request.session.username;
const room = socket.request.session.room
const [group, channel] = room.split('-');
//join user to the chat
const user = joinUser(socket.id, username, room);
socket.join(user.room);
//inform online users that a user is now online
socket.broadcast
.to(user.room)
.emit('message', messageToObject('BOT', `${user.username} is online.`));
//when a message is sent
socket.on('chat_message', (msg) => {
//convert message to {user,text,time)}
const messageObj = messageToObject(user.username, msg);
console.log([group, channel, messageObj.user, messageObj.text]);
//insert message to db
pool.query('INSERT INTO messages ' +
'(group_name, channel, username, time, text) VALUES ($1, $2, $3, $4, $5)',
[group, channel, messageObj.user, messageObj.time, messageObj.text], (error, results) => {
if (error) {
throw error;
}
})
//emit the message to others
io.to(user.room).emit('message', messageObj);
});
//emit online people info to front-end (main.js)
io.to(user.room).emit('online', {
room: user.room,
users: getOnline(user.room)
});
//query for all messages and emit channel messages to front-end (main.js)
pool.query('SELECT * FROM messages WHERE group_name = $1 AND channel = $2', [group, channel], (error, results) => {
if (error) {
throw error;
}
socket.emit("all_messages", results.rows);
});
socket.on('disconnect', () => {
const user = leaveUser(socket.id);
if (user) {
io.to(user.room).emit('message', messageToObject('BOT', `${user.username} has left to chat.`));
io.to(user.room).emit('online', {
room: user.room,
users: getOnline(user.room)
});
}
})
console.log("session", socket.request.session);
})
const PORT = process.env.PORT
server.listen(PORT, () => console.log(`Server running on port ${PORT}`));