mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 03:26:04 +01:00
interim commit - removed calls to websockets.js, beginning porting to namespaced files
This commit is contained in:
11
app.js
11
app.js
@@ -94,9 +94,11 @@
|
|||||||
|
|
||||||
var templates = require('./public/src/templates'),
|
var templates = require('./public/src/templates'),
|
||||||
translator = require('./public/src/translator'),
|
translator = require('./public/src/translator'),
|
||||||
webserver = require('./src/webserver'),
|
webserver = require('./src/webserver');
|
||||||
SocketIO = require('socket.io').listen(global.server, { log: false, transports: ['websocket', 'xhr-polling', 'jsonp-polling', 'flashsocket'], 'browser client minification': true}),
|
console.log('here now');
|
||||||
websockets = require('./src/websockets'),
|
// SocketIO = require('socket.io').listen(global.server, { log: false, transports: ['websocket', 'xhr-polling', 'jsonp-polling', 'flashsocket'], 'browser client minification': true}),
|
||||||
|
// websockets = require('./src/websockets'),
|
||||||
|
var sockets = require('./src/socket.io'),
|
||||||
plugins = require('./src/plugins'),
|
plugins = require('./src/plugins'),
|
||||||
notifications = require('./src/notifications'),
|
notifications = require('./src/notifications'),
|
||||||
upgrade = require('./src/upgrade');
|
upgrade = require('./src/upgrade');
|
||||||
@@ -105,7 +107,8 @@
|
|||||||
|
|
||||||
upgrade.check(function(schema_ok) {
|
upgrade.check(function(schema_ok) {
|
||||||
if (schema_ok || nconf.get('check-schema') === false) {
|
if (schema_ok || nconf.get('check-schema') === false) {
|
||||||
websockets.init(SocketIO);
|
// websockets.init(SocketIO);
|
||||||
|
sockets.init();
|
||||||
|
|
||||||
plugins.init();
|
plugins.init();
|
||||||
global.templates = {};
|
global.templates = {};
|
||||||
|
|||||||
@@ -45,7 +45,8 @@
|
|||||||
"cron": "~1.0.1",
|
"cron": "~1.0.1",
|
||||||
"semver": "~2.2.1",
|
"semver": "~2.2.1",
|
||||||
"string": "~1.7.0",
|
"string": "~1.7.0",
|
||||||
"xregexp": "~2.0.0"
|
"xregexp": "~2.0.0",
|
||||||
|
"socket.io-wildcard": "~0.1.1"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"redis": "0.8.3",
|
"redis": "0.8.3",
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
var db = require('./database'),
|
var db = require('./database'),
|
||||||
posts = require('./posts'),
|
posts = require('./posts'),
|
||||||
user = require('./user'),
|
user = require('./user'),
|
||||||
websockets = require('./websockets')
|
|
||||||
translator = require('./../public/src/translator');
|
translator = require('./../public/src/translator');
|
||||||
|
|
||||||
(function (Favourites) {
|
(function (Favourites) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
Favourites.favourite = function (pid, room_id, uid, socket) {
|
Favourites.favourite = function (pid, room_id, uid, socket) {
|
||||||
|
var websockets = require('./socket.io');
|
||||||
|
|
||||||
if (uid === 0) {
|
if (uid === 0) {
|
||||||
|
|
||||||
@@ -56,6 +56,8 @@ var db = require('./database'),
|
|||||||
};
|
};
|
||||||
|
|
||||||
Favourites.unfavourite = function (pid, room_id, uid, socket) {
|
Favourites.unfavourite = function (pid, room_id, uid, socket) {
|
||||||
|
var websockets = require('./socket.io');
|
||||||
|
|
||||||
if (uid === 0) {
|
if (uid === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,10 +3,7 @@ var async = require('async'),
|
|||||||
cron = require('cron').CronJob,
|
cron = require('cron').CronJob,
|
||||||
|
|
||||||
db = require('./database'),
|
db = require('./database'),
|
||||||
utils = require('../public/src/utils'),
|
utils = require('../public/src/utils');
|
||||||
websockets = require('./websockets');
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(function(Notifications) {
|
(function(Notifications) {
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -71,6 +68,7 @@ var async = require('async'),
|
|||||||
}
|
}
|
||||||
|
|
||||||
Notifications.push = function(nid, uids, callback) {
|
Notifications.push = function(nid, uids, callback) {
|
||||||
|
var websockets = require('./socket.io');
|
||||||
if (!Array.isArray(uids)) {
|
if (!Array.isArray(uids)) {
|
||||||
uids = [uids];
|
uids = [uids];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ var winston = require('winston'),
|
|||||||
topics = require('./topics'),
|
topics = require('./topics'),
|
||||||
threadTools = require('./threadTools'),
|
threadTools = require('./threadTools'),
|
||||||
user = require('./user'),
|
user = require('./user'),
|
||||||
websockets = require('./websockets'),
|
|
||||||
utils = require('../public/src/utils'),
|
utils = require('../public/src/utils'),
|
||||||
plugins = require('./plugins'),
|
plugins = require('./plugins'),
|
||||||
events = require('./events'),
|
events = require('./events'),
|
||||||
@@ -70,8 +69,8 @@ var winston = require('winston'),
|
|||||||
|
|
||||||
|
|
||||||
PostTools.edit = function(uid, pid, title, content) {
|
PostTools.edit = function(uid, pid, title, content) {
|
||||||
|
var websockets = require('./socket.io'),
|
||||||
var success = function() {
|
success = function() {
|
||||||
posts.setPostFields(pid, {
|
posts.setPostFields(pid, {
|
||||||
edited: Date.now(),
|
edited: Date.now(),
|
||||||
editor: uid,
|
editor: uid,
|
||||||
|
|||||||
@@ -131,7 +131,7 @@
|
|||||||
if (req.user && req.user.uid > 0) {
|
if (req.user && req.user.uid > 0) {
|
||||||
winston.info('[Auth] Session ' + req.sessionID + ' logout (uid: ' + req.user.uid + ')');
|
winston.info('[Auth] Session ' + req.sessionID + ' logout (uid: ' + req.user.uid + ')');
|
||||||
|
|
||||||
var ws = require('./../websockets');
|
var ws = require('../socket.io');
|
||||||
ws.logoutUser(req.user.uid);
|
ws.logoutUser(req.user.uid);
|
||||||
|
|
||||||
req.logout();
|
req.logout();
|
||||||
@@ -203,7 +203,7 @@
|
|||||||
uid: uid
|
uid: uid
|
||||||
}, function() {
|
}, function() {
|
||||||
|
|
||||||
require('./../websockets').emitUserCount();
|
require('../socket.io').emitUserCount();
|
||||||
|
|
||||||
if(req.body.referrer)
|
if(req.body.referrer)
|
||||||
res.redirect(req.body.referrer);
|
res.redirect(req.body.referrer);
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ var fs = require('fs'),
|
|||||||
postTools = require('../postTools'),
|
postTools = require('../postTools'),
|
||||||
utils = require('./../../public/src/utils'),
|
utils = require('./../../public/src/utils'),
|
||||||
meta = require('./../meta'),
|
meta = require('./../meta'),
|
||||||
db = require('./../database'),
|
db = require('./../database');
|
||||||
websockets = require('./../websockets');
|
|
||||||
|
|
||||||
(function (User) {
|
(function (User) {
|
||||||
User.createRoutes = function (app) {
|
User.createRoutes = function (app) {
|
||||||
@@ -485,6 +484,8 @@ var fs = require('fs'),
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getOnlineUsers(req, res) {
|
function getOnlineUsers(req, res) {
|
||||||
|
var websockets = require('../socket.io');
|
||||||
|
|
||||||
user.getUsers('users:online', 0, 49, function (err, data) {
|
user.getUsers('users:online', 0, 49, function (err, data) {
|
||||||
|
|
||||||
var onlineUsers = [];
|
var onlineUsers = [];
|
||||||
|
|||||||
297
src/socket.io/index.js
Normal file
297
src/socket.io/index.js
Normal file
@@ -0,0 +1,297 @@
|
|||||||
|
var SocketIO = require('socket.io'),
|
||||||
|
socketioWildcard = require('socket.io-wildcard'),
|
||||||
|
util = require('util'),
|
||||||
|
async = require('async'),
|
||||||
|
fs = require('fs'),
|
||||||
|
nconf = require('nconf'),
|
||||||
|
express = require('express'),
|
||||||
|
socketCookieParser = express.cookieParser(nconf.get('secret')),
|
||||||
|
winston = require('winston'),
|
||||||
|
|
||||||
|
db = require('../database'),
|
||||||
|
user = require('../user'),
|
||||||
|
topics = require('../topics'),
|
||||||
|
logger = require('../logger'),
|
||||||
|
|
||||||
|
Sockets = {},
|
||||||
|
Namespaces = {};
|
||||||
|
|
||||||
|
/* === */
|
||||||
|
|
||||||
|
var users = {},
|
||||||
|
userSockets = {},
|
||||||
|
rooms = {},
|
||||||
|
io;
|
||||||
|
|
||||||
|
Sockets.init = function() {
|
||||||
|
io = socketioWildcard(SocketIO).listen(global.server, {
|
||||||
|
log: false,
|
||||||
|
transports: ['websocket', 'xhr-polling', 'jsonp-polling', 'flashsocket'],
|
||||||
|
'browser client minification': true
|
||||||
|
});
|
||||||
|
|
||||||
|
io.sockets.on('connection', function(socket) {
|
||||||
|
var hs = socket.handshake,
|
||||||
|
sessionID, uid, lastPostTime = 0;
|
||||||
|
|
||||||
|
// Validate the session, if present
|
||||||
|
socketCookieParser(hs, {}, function(err) {
|
||||||
|
sessionID = socket.handshake.signedCookies["express.sid"];
|
||||||
|
db.sessionStore.get(sessionID, function(err, sessionData) {
|
||||||
|
if (!err && sessionData && sessionData.passport && sessionData.passport.user) {
|
||||||
|
uid = users[sessionID] = sessionData.passport.user;
|
||||||
|
} else {
|
||||||
|
uid = users[sessionID] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
userSockets[uid] = userSockets[uid] || [];
|
||||||
|
userSockets[uid].push(socket);
|
||||||
|
|
||||||
|
/* Need to save some state for the logger & maybe some other modules later on */
|
||||||
|
socket.state = {
|
||||||
|
user : {
|
||||||
|
uid : uid
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* If meta.config.loggerIOStatus > 0, logger.io_one will hook into this socket */
|
||||||
|
logger.io_one(socket,uid);
|
||||||
|
|
||||||
|
if (uid) {
|
||||||
|
|
||||||
|
db.sortedSetAdd('users:online', Date.now(), uid, function(err, data) {
|
||||||
|
socket.join('uid_' + uid);
|
||||||
|
|
||||||
|
user.getUserField(uid, 'username', function(err, username) {
|
||||||
|
socket.emit('event:connect', {
|
||||||
|
status: 1,
|
||||||
|
username: username,
|
||||||
|
uid: uid
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
io.sockets.in('global').emit('api:user.isOnline', isUserOnline(uid));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('disconnect', function() {
|
||||||
|
|
||||||
|
var index = (userSockets[uid] || []).indexOf(socket);
|
||||||
|
if (index !== -1) {
|
||||||
|
userSockets[uid].splice(index, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (userSockets[uid] && userSockets[uid].length === 0) {
|
||||||
|
delete users[sessionID];
|
||||||
|
delete userSockets[uid];
|
||||||
|
if (uid) {
|
||||||
|
db.sortedSetRemove('users:online', uid, function(err, data) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
io.sockets.in('global').emit('api:user.isOnline', isUserOnline(uid));
|
||||||
|
|
||||||
|
emitOnlineUserCount();
|
||||||
|
|
||||||
|
for (var roomName in rooms) {
|
||||||
|
|
||||||
|
socket.leave(roomName);
|
||||||
|
|
||||||
|
if (rooms[roomName][socket.id]) {
|
||||||
|
delete rooms[roomName][socket.id];
|
||||||
|
}
|
||||||
|
|
||||||
|
updateRoomBrowsingText(roomName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('reconnected', function() {
|
||||||
|
if (uid) {
|
||||||
|
topics.pushUnreadCount(uid);
|
||||||
|
user.pushNotifCount(uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV === 'development') {
|
||||||
|
if (uid) {
|
||||||
|
winston.info('[socket] uid ' + uid + ' (' + sessionID + ') has successfully reconnected.');
|
||||||
|
} else {
|
||||||
|
winston.info('[socket] An anonymous user (' + sessionID + ') has successfully reconnected.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('*', function(payload) {
|
||||||
|
// Ignore all non-api messages
|
||||||
|
if (payload.name.substr(0, 4) !== 'api:') {
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// Deconstruct the message
|
||||||
|
var parts = payload.name.split('.'),
|
||||||
|
namespace = parts[0],
|
||||||
|
command = parts[1],
|
||||||
|
subcommand = parts[2], // MUST ADD RECURSION (:P)
|
||||||
|
executeHandler = function(args) {
|
||||||
|
if (!subcommand) {
|
||||||
|
Namespaces[namespace][command](args);
|
||||||
|
} else {
|
||||||
|
Namespaces[namespace][command][subcommand](args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Namespaces[namespace]) {
|
||||||
|
executeHandler(payload.args);
|
||||||
|
} else {
|
||||||
|
fs.exists(path.join(__dirname, namespace + '.js'), function(exists) {
|
||||||
|
if (exists) {
|
||||||
|
Namespaces[namespace] = require('./' + namespace);
|
||||||
|
executeHandler(payload.args);
|
||||||
|
} else {
|
||||||
|
winston.warn('[socket.io] Unrecognized message: ' + payload.name);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log('message!', arguments);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Sockets.logoutUser = function(uid) {
|
||||||
|
if(userSockets[uid] && userSockets[uid].length) {
|
||||||
|
for(var i=0; i< userSockets[uid].length; ++i) {
|
||||||
|
userSockets[uid][i].emit('event:disconnect');
|
||||||
|
userSockets[uid][i].disconnect();
|
||||||
|
|
||||||
|
if(!userSockets[uid]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Sockets.emitUserCount = function() {
|
||||||
|
db.getObjectField('global', 'userCount', function(err, count) {
|
||||||
|
io.sockets.emit('user.count', {
|
||||||
|
count: count
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Sockets.in = function(room) {
|
||||||
|
return io.sockets.in(room);
|
||||||
|
};
|
||||||
|
|
||||||
|
Sockets.getConnectedClients = function() {
|
||||||
|
return userSockets;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sockets.getOnlineAnonCount = function () {
|
||||||
|
return userSockets[0] ? userSockets[0].length : 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Helpers */
|
||||||
|
|
||||||
|
function isUserOnline(uid) {
|
||||||
|
return !!userSockets[uid] && userSockets[uid].length > 0;
|
||||||
|
}
|
||||||
|
Sockets.isUserOnline = isUserOnline;
|
||||||
|
|
||||||
|
function updateRoomBrowsingText(roomName) {
|
||||||
|
|
||||||
|
function getUidsInRoom(room) {
|
||||||
|
var uids = [];
|
||||||
|
for (var socketId in room) {
|
||||||
|
if (uids.indexOf(room[socketId]) === -1)
|
||||||
|
uids.push(room[socketId]);
|
||||||
|
}
|
||||||
|
return uids;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAnonymousCount(roomName) {
|
||||||
|
var clients = io.sockets.clients(roomName);
|
||||||
|
var anonCount = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < clients.length; ++i) {
|
||||||
|
var hs = clients[i].handshake;
|
||||||
|
if (hs && clients[i].state && clients[i].state.user.uid === 0) {
|
||||||
|
++anonCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return anonCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
var uids = getUidsInRoom(rooms[roomName]),
|
||||||
|
anonymousCount = getAnonymousCount(roomName);
|
||||||
|
|
||||||
|
if (uids.length === 0) {
|
||||||
|
io.sockets.in(roomName).emit('api:get_users_in_room', { users: [], anonymousCount: anonymousCount });
|
||||||
|
} else {
|
||||||
|
user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], function(err, users) {
|
||||||
|
if(!err)
|
||||||
|
io.sockets.in(roomName).emit('api:get_users_in_room', { users: users, anonymousCount: anonymousCount });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitTopicPostStats() {
|
||||||
|
db.getObjectFields('global', ['topicCount', 'postCount'], function(err, data) {
|
||||||
|
if (err) {
|
||||||
|
return winston.err(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
var stats = {
|
||||||
|
topics: data.topicCount ? data.topicCount : 0,
|
||||||
|
posts: data.postCount ? data.postCount : 0
|
||||||
|
};
|
||||||
|
|
||||||
|
io.sockets.emit('post.stats', stats);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitOnlineUserCount() {
|
||||||
|
var anon = userSockets[0] ? userSockets[0].length : 0;
|
||||||
|
var registered = Object.keys(userSockets).length;
|
||||||
|
if (anon)
|
||||||
|
registered = registered - 1;
|
||||||
|
|
||||||
|
var returnObj = {
|
||||||
|
users: registered + anon,
|
||||||
|
anon: anon
|
||||||
|
};
|
||||||
|
io.sockets.emit('api:user.active.get', returnObj)
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitAlert(socket, title, message) {
|
||||||
|
socket.emit('event:alert', {
|
||||||
|
type: 'danger',
|
||||||
|
timeout: 2000,
|
||||||
|
title: title,
|
||||||
|
message: message,
|
||||||
|
alert_id: 'post_error'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitContentTooShortAlert(socket) {
|
||||||
|
socket.emit('event:alert', {
|
||||||
|
type: 'danger',
|
||||||
|
timeout: 2000,
|
||||||
|
title: 'Content too short',
|
||||||
|
message: "Please enter a longer post. At least " + meta.config.minimumPostLength + " characters.",
|
||||||
|
alert_id: 'post_error'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitTooManyPostsAlert(socket) {
|
||||||
|
socket.emit('event:alert', {
|
||||||
|
title: 'Too many posts!',
|
||||||
|
message: 'You can only post every ' + meta.config.postDelay + ' seconds.',
|
||||||
|
type: 'danger',
|
||||||
|
timeout: 2000
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Exporting */
|
||||||
|
module.exports = Sockets;
|
||||||
@@ -10,7 +10,7 @@ var winston = require('winston'),
|
|||||||
notifications = require('./notifications'),
|
notifications = require('./notifications'),
|
||||||
posts = require('./posts'),
|
posts = require('./posts'),
|
||||||
meta = require('./meta'),
|
meta = require('./meta'),
|
||||||
websockets = require('./websockets'),
|
websockets = require('./socket.io'),
|
||||||
events = require('./events');
|
events = require('./events');
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,10 +17,7 @@ var async = require('async'),
|
|||||||
notifications = require('./notifications'),
|
notifications = require('./notifications'),
|
||||||
feed = require('./feed'),
|
feed = require('./feed'),
|
||||||
favourites = require('./favourites'),
|
favourites = require('./favourites'),
|
||||||
meta = require('./meta')
|
meta = require('./meta');
|
||||||
|
|
||||||
websockets = require('./websockets');
|
|
||||||
|
|
||||||
|
|
||||||
(function(Topics) {
|
(function(Topics) {
|
||||||
|
|
||||||
@@ -589,6 +586,8 @@ var async = require('async'),
|
|||||||
};
|
};
|
||||||
|
|
||||||
Topics.pushUnreadCount = function(uids, callback) {
|
Topics.pushUnreadCount = function(uids, callback) {
|
||||||
|
var websockets = require('./socket.io');
|
||||||
|
|
||||||
if (!uids) {
|
if (!uids) {
|
||||||
clients = websockets.getConnectedClients();
|
clients = websockets.getConnectedClients();
|
||||||
uids = Object.keys(clients);
|
uids = Object.keys(clients);
|
||||||
|
|||||||
@@ -15,8 +15,7 @@ var bcrypt = require('bcrypt'),
|
|||||||
notifications = require('./notifications'),
|
notifications = require('./notifications'),
|
||||||
topics = require('./topics'),
|
topics = require('./topics'),
|
||||||
events = require('./events'),
|
events = require('./events'),
|
||||||
Emailer = require('./emailer'),
|
Emailer = require('./emailer');
|
||||||
websockets = require('./websockets');
|
|
||||||
|
|
||||||
(function(User) {
|
(function(User) {
|
||||||
'use strict';
|
'use strict';
|
||||||
@@ -888,6 +887,8 @@ var bcrypt = require('bcrypt'),
|
|||||||
};
|
};
|
||||||
|
|
||||||
User.pushNotifCount = function(uid) {
|
User.pushNotifCount = function(uid) {
|
||||||
|
var websockets = require('./socket.io');
|
||||||
|
|
||||||
User.notifications.getUnreadCount(uid, function(err, count) {
|
User.notifications.getUnreadCount(uid, function(err, count) {
|
||||||
if (!err) {
|
if (!err) {
|
||||||
websockets.in('uid_' + uid).emit('event:notifications.updateCount', count);
|
websockets.in('uid_' + uid).emit('event:notifications.updateCount', count);
|
||||||
|
|||||||
@@ -1,23 +1,21 @@
|
|||||||
|
console.log('HEY NIB, I STILL GOT CALLED');
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var cookie = require('cookie'),
|
var cookie = require('cookie'),
|
||||||
express = require('express'),
|
|
||||||
util = require('util'),
|
|
||||||
async = require('async'),
|
|
||||||
fs = require('fs'),
|
|
||||||
nconf = require('nconf'),
|
|
||||||
gravatar = require('gravatar'),
|
gravatar = require('gravatar'),
|
||||||
winston = require('winston'),
|
|
||||||
S = require('string'),
|
S = require('string'),
|
||||||
|
|
||||||
db = require('./database'),
|
|
||||||
|
|
||||||
user = require('./user'),
|
|
||||||
|
|
||||||
groups = require('./groups'),
|
groups = require('./groups'),
|
||||||
posts = require('./posts'),
|
posts = require('./posts'),
|
||||||
favourites = require('./favourites'),
|
favourites = require('./favourites'),
|
||||||
utils = require('../public/src/utils'),
|
utils = require('../public/src/utils'),
|
||||||
topics = require('./topics'),
|
|
||||||
categories = require('./categories'),
|
categories = require('./categories'),
|
||||||
CategoryTools = require('./categoryTools'),
|
CategoryTools = require('./categoryTools'),
|
||||||
notifications = require('./notifications'),
|
notifications = require('./notifications'),
|
||||||
@@ -25,8 +23,8 @@ var cookie = require('cookie'),
|
|||||||
postTools = require('./postTools'),
|
postTools = require('./postTools'),
|
||||||
Messaging = require('./messaging'),
|
Messaging = require('./messaging'),
|
||||||
meta = require('./meta'),
|
meta = require('./meta'),
|
||||||
logger = require('./logger'),
|
|
||||||
socketCookieParser = express.cookieParser(nconf.get('secret')),
|
|
||||||
admin = {
|
admin = {
|
||||||
'categories': require('./admin/categories'),
|
'categories': require('./admin/categories'),
|
||||||
'user': require('./admin/user')
|
'user': require('./admin/user')
|
||||||
@@ -35,163 +33,12 @@ var cookie = require('cookie'),
|
|||||||
|
|
||||||
(function(websockets) {
|
(function(websockets) {
|
||||||
|
|
||||||
var users = {},
|
|
||||||
userSockets = {},
|
|
||||||
rooms = {};
|
|
||||||
|
|
||||||
websockets.logoutUser = function(uid) {
|
|
||||||
if(userSockets[uid] && userSockets[uid].length) {
|
|
||||||
for(var i=0; i< userSockets[uid].length; ++i) {
|
|
||||||
userSockets[uid][i].emit('event:disconnect');
|
|
||||||
userSockets[uid][i].disconnect();
|
|
||||||
|
|
||||||
if(!userSockets[uid]) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function isUserOnline(uid) {
|
|
||||||
return !!userSockets[uid] && userSockets[uid].length > 0;
|
|
||||||
}
|
|
||||||
websockets.isUserOnline = isUserOnline;
|
|
||||||
|
|
||||||
websockets.init = function(io) {
|
websockets.init = function(io) {
|
||||||
io.sockets.on('connection', function(socket) {
|
|
||||||
var hs = socket.handshake,
|
|
||||||
sessionID, uid, lastPostTime = 0;
|
|
||||||
|
|
||||||
// Validate the session, if present
|
|
||||||
socketCookieParser(hs, {}, function(err) {
|
|
||||||
sessionID = socket.handshake.signedCookies["express.sid"];
|
|
||||||
db.sessionStore.get(sessionID, function(err, sessionData) {
|
|
||||||
if (!err && sessionData && sessionData.passport && sessionData.passport.user) {
|
|
||||||
uid = users[sessionID] = sessionData.passport.user;
|
|
||||||
} else {
|
|
||||||
uid = users[sessionID] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
userSockets[uid] = userSockets[uid] || [];
|
|
||||||
userSockets[uid].push(socket);
|
|
||||||
|
|
||||||
/* Need to save some state for the logger & maybe some other modules later on */
|
|
||||||
socket.state = {
|
|
||||||
user : {
|
|
||||||
uid : uid
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* If meta.config.loggerIOStatus > 0, logger.io_one will hook into this socket */
|
|
||||||
logger.io_one(socket,uid);
|
|
||||||
|
|
||||||
if (uid) {
|
|
||||||
|
|
||||||
db.sortedSetAdd('users:online', Date.now(), uid, function(err, data) {
|
|
||||||
socket.join('uid_' + uid);
|
|
||||||
|
|
||||||
user.getUserField(uid, 'username', function(err, username) {
|
|
||||||
socket.emit('event:connect', {
|
|
||||||
status: 1,
|
|
||||||
username: username,
|
|
||||||
uid: uid
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
io.sockets.in('global').emit('api:user.isOnline', isUserOnline(uid));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
socket.on('disconnect', function() {
|
|
||||||
|
|
||||||
var index = (userSockets[uid] || []).indexOf(socket);
|
|
||||||
if (index !== -1) {
|
|
||||||
userSockets[uid].splice(index, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (userSockets[uid] && userSockets[uid].length === 0) {
|
|
||||||
delete users[sessionID];
|
|
||||||
delete userSockets[uid];
|
|
||||||
if (uid) {
|
|
||||||
db.sortedSetRemove('users:online', uid, function(err, data) {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
io.sockets.in('global').emit('api:user.isOnline', isUserOnline(uid));
|
|
||||||
|
|
||||||
emitOnlineUserCount();
|
|
||||||
|
|
||||||
for (var roomName in rooms) {
|
|
||||||
|
|
||||||
socket.leave(roomName);
|
|
||||||
|
|
||||||
if (rooms[roomName][socket.id]) {
|
|
||||||
delete rooms[roomName][socket.id];
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRoomBrowsingText(roomName);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
socket.on('reconnected', function() {
|
|
||||||
if (uid) {
|
|
||||||
topics.pushUnreadCount(uid);
|
|
||||||
user.pushNotifCount(uid);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.env.NODE_ENV === 'development') {
|
|
||||||
if (uid) {
|
|
||||||
winston.info('[socket] uid ' + uid + ' (' + sessionID + ') has successfully reconnected.');
|
|
||||||
} else {
|
|
||||||
winston.info('[socket] An anonymous user (' + sessionID + ') has successfully reconnected.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
socket.on('api:get_all_rooms', function(data) {
|
socket.on('api:get_all_rooms', function(data) {
|
||||||
socket.emit('api:get_all_rooms', io.sockets.manager.rooms);
|
socket.emit('api:get_all_rooms', io.sockets.manager.rooms);
|
||||||
});
|
});
|
||||||
|
|
||||||
function updateRoomBrowsingText(roomName) {
|
|
||||||
|
|
||||||
function getUidsInRoom(room) {
|
|
||||||
var uids = [];
|
|
||||||
for (var socketId in room) {
|
|
||||||
if (uids.indexOf(room[socketId]) === -1)
|
|
||||||
uids.push(room[socketId]);
|
|
||||||
}
|
|
||||||
return uids;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getAnonymousCount(roomName) {
|
|
||||||
var clients = io.sockets.clients(roomName);
|
|
||||||
var anonCount = 0;
|
|
||||||
|
|
||||||
for (var i = 0; i < clients.length; ++i) {
|
|
||||||
var hs = clients[i].handshake;
|
|
||||||
if (hs && clients[i].state && clients[i].state.user.uid === 0) {
|
|
||||||
++anonCount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return anonCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
var uids = getUidsInRoom(rooms[roomName]),
|
|
||||||
anonymousCount = getAnonymousCount(roomName);
|
|
||||||
|
|
||||||
if (uids.length === 0) {
|
|
||||||
io.sockets.in(roomName).emit('api:get_users_in_room', { users: [], anonymousCount: anonymousCount });
|
|
||||||
} else {
|
|
||||||
user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], function(err, users) {
|
|
||||||
if(!err)
|
|
||||||
io.sockets.in(roomName).emit('api:get_users_in_room', { users: users, anonymousCount: anonymousCount });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
socket.on('event:enter_room', function(data) {
|
socket.on('event:enter_room', function(data) {
|
||||||
|
|
||||||
if (data.leave !== null) {
|
if (data.leave !== null) {
|
||||||
@@ -362,34 +209,7 @@ websockets.init = function(io) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function emitAlert(socket, title, message) {
|
|
||||||
socket.emit('event:alert', {
|
|
||||||
type: 'danger',
|
|
||||||
timeout: 2000,
|
|
||||||
title: title,
|
|
||||||
message: message,
|
|
||||||
alert_id: 'post_error'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function emitContentTooShortAlert(socket) {
|
|
||||||
socket.emit('event:alert', {
|
|
||||||
type: 'danger',
|
|
||||||
timeout: 2000,
|
|
||||||
title: 'Content too short',
|
|
||||||
message: "Please enter a longer post. At least " + meta.config.minimumPostLength + " characters.",
|
|
||||||
alert_id: 'post_error'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function emitTooManyPostsAlert(socket) {
|
|
||||||
socket.emit('event:alert', {
|
|
||||||
title: 'Too many posts!',
|
|
||||||
message: 'You can only post every ' + meta.config.postDelay + ' seconds.',
|
|
||||||
type: 'danger',
|
|
||||||
timeout: 2000
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
socket.on('api:topics.post', function(data) {
|
socket.on('api:topics.post', function(data) {
|
||||||
if (uid < 1 && parseInt(meta.config.allowGuestPosting, 10) === 0) {
|
if (uid < 1 && parseInt(meta.config.allowGuestPosting, 10) === 0) {
|
||||||
@@ -530,22 +350,9 @@ websockets.init = function(io) {
|
|||||||
callback(websockets.getOnlineAnonCount());
|
callback(websockets.getOnlineAnonCount());
|
||||||
});
|
});
|
||||||
|
|
||||||
websockets.getOnlineAnonCount = function () {
|
|
||||||
return userSockets[0] ? userSockets[0].length : 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
function emitOnlineUserCount() {
|
|
||||||
var anon = userSockets[0] ? userSockets[0].length : 0;
|
|
||||||
var registered = Object.keys(userSockets).length;
|
|
||||||
if (anon)
|
|
||||||
registered = registered - 1;
|
|
||||||
|
|
||||||
var returnObj = {
|
|
||||||
users: registered + anon,
|
|
||||||
anon: anon
|
|
||||||
};
|
|
||||||
io.sockets.emit('api:user.active.get', returnObj)
|
|
||||||
}
|
|
||||||
|
|
||||||
socket.on('api:user.active.get', function() {
|
socket.on('api:user.active.get', function() {
|
||||||
emitOnlineUserCount();
|
emitOnlineUserCount();
|
||||||
@@ -1233,40 +1040,9 @@ websockets.init = function(io) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
socket.on('api:admin.theme.set', meta.themes.set);
|
socket.on('api:admin.theme.set', meta.themes.set);
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
function emitTopicPostStats() {
|
|
||||||
db.getObjectFields('global', ['topicCount', 'postCount'], function(err, data) {
|
|
||||||
if (err) {
|
|
||||||
return winston.err(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
var stats = {
|
|
||||||
topics: data.topicCount ? data.topicCount : 0,
|
|
||||||
posts: data.postCount ? data.postCount : 0
|
|
||||||
};
|
|
||||||
|
|
||||||
io.sockets.emit('post.stats', stats);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
websockets.emitUserCount = function() {
|
|
||||||
db.getObjectField('global', 'userCount', function(err, count) {
|
|
||||||
io.sockets.emit('user.count', {
|
|
||||||
count: count
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
websockets.in = function(room) {
|
|
||||||
return io.sockets.in(room);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
websockets.getConnectedClients = function() {
|
|
||||||
return userSockets;
|
|
||||||
}
|
|
||||||
|
|
||||||
})(module.exports);
|
})(module.exports);
|
||||||
|
|||||||
Reference in New Issue
Block a user