-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
93 lines (85 loc) · 3.6 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
// set up ======================================================================
var express = require('express')
, app = express()
, bodyParser = require('body-parser')
, server = require('http').createServer(app)
, flash = require('connect-flash')
, io = require('socket.io').listen(server)
, port = 80
, chalk = require('chalk')
, db = require('./db');
const crypto = require('crypto');
// optimization ================================================================
var compress = require('compression');
app.use(compress());
// configuration ===============================================================
app.use(express.static('public'));
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
app.use(flash());
// set up the RethinkDB database
db.setup();
// routes ======================================================================
require('./routes')(app);
// socket.io ===================================================================
// s'executa quan un usuari es connecta a la pagina principal
io.on('connection', function(socket){
// var que emmagatzema l'info de l'usuari
var u_info = [];
var u_hash;
// s'executa quan creem un chat nou
socket.on('create_chat', function(private, password){
var current_time = new Date();
// funció per ºcrear el hash (url) de la pagina del chat
crypto.pbkdf2(current_time.getTime().toString(), 'salt', 100000, 4, 'sha256', (err, key) => {
if (err) throw err;
var hash = key.toString('hex');
// es crear la room del chat a la base de dades (private -> bool) (password -> string | null)
db.createChat(hash, private, password);
// s'executa l'event chat_created
socket.emit('chat_created', hash);
});
});
// s'executa quan l'usuaria s'afageix a la nova sala creada
socket.on('im_here', function(hash){
// afageix el nou usuari referenciat pel socket a la room referenciada pel hash (url)
u_hash = hash;
socket.join(hash);
});
// s'executa quan s'envia un missatge
socket.on('send_message', function(msg){
// variable nick que conté el nom de l'usuari en la room referenciada pel hash (url)
var nick = u_info[u_hash];
// broadcast del missatge envait per "nick" a tots els usuaris connectats a la room (hash - url)
socket.broadcast.to(u_hash).emit('receive_msg', msg, nick);
// TODO AFEGIR MISSATGE A LA DB (Amb timestamp)
});
// s'executa quan l'usuari obté un nickname nou
socket.on('nickname', function(nick){
u_info[u_hash] = nick;
db.addUserToRoom(u_hash, nick, function(users){
var users_pul = users['users'];
users_pul.push(nick);
socket.broadcast.to(u_hash).emit('update_users', users_pul);
socket.emit('update_users', users_pul);
});
// TODO Descarregar missatges de la DB (Per ordre de 'timestamp')
});
socket.on('disconnect', function (){
if (u_hash != null && u_info[u_hash] != null) {
db.removeUserFromRoom(u_hash, u_info[u_hash], function(new_users){
socket.broadcast.to(u_hash).emit('update_users', new_users);
socket.emit('update_users', new_users);
});
}
});
});
// launch ======================================================================
server.listen(port, function(){
var message = '[SERVER] Started server on localhost:'+port;
console.log(chalk.black.bgGreen(message));
});