diff --git a/loader.js b/loader.js index 98a569b531..8e1a00b672 100644 --- a/loader.js +++ b/loader.js @@ -137,8 +137,8 @@ Loader.addClusterEvents = function(callback) { Loader.primaryWorker = parseInt(worker.id, 10); } break; - case 'user:connect': - case 'user:disconnect': + // case 'user:connect': + // case 'user:disconnect': case 'config:update': Loader.notifyWorkers(message); break; diff --git a/src/controllers/users.js b/src/controllers/users.js index 84fde728fd..626d69da4a 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -15,7 +15,8 @@ usersController.getOnlineUsers = function(req, res, next) { user.getUsersFromSet('users:online', 0, 49, next); }, count: function(next) { - next(null, websockets.getConnectedClients().length); + var now = Date.now(); + db.sortedSetCount('users:online', now - 300000, now, next); }, isAdministrator: function(next) { user.isAdministrator(uid, next); diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 83f838d73b..9b75711c99 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -24,47 +24,6 @@ var SocketIO = require('socket.io'), var io; -var onlineUsers = []; - -process.on('message', onMessage); - -function onMessage(msg) { - if (typeof msg !== 'object') { - return; - } - - if (msg.action === 'user:connect') { - if (msg.uid && onlineUsers.indexOf(msg.uid) === -1) { - onlineUsers.push(msg.uid); - } - } else if(msg.action === 'user:disconnect') { - if (msg.uid && msg.socketCount <= 1) { - var index = onlineUsers.indexOf(msg.uid); - if (index !== -1) { - onlineUsers.splice(index, 1); - } - } - } -} - -function onUserConnect(uid, socketid) { - var msg = {action: 'user:connect', uid: uid, socketid: socketid}; - if (process.send) { - process.send(msg); - } else { - onMessage(msg); - } -} - -function onUserDisconnect(uid, socketid, socketCount) { - var msg = {action: 'user:disconnect', uid: uid, socketid: socketid, socketCount: socketCount}; - if (process.send) { - process.send(msg); - } else { - onMessage(msg); - } -} - Sockets.init = function(server) { var config = { transports: ['polling', 'websocket'], @@ -131,7 +90,6 @@ Sockets.init = function(server) { logger.io_one(socket, socket.uid); if (socket.uid) { - onUserConnect(socket.uid, socket.id); socket.join('uid_' + socket.uid); socket.join('online_users'); @@ -174,8 +132,6 @@ Sockets.init = function(server) { socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: 'offline'}); } - onUserDisconnect(socket.uid, socket.id, socketCount); - // for(var roomName in io.sockets.manager.roomClients[socket.id]) { // if (roomName.indexOf('topic') !== -1) { // io.sockets.in(roomName.slice(1)).emit('event:user_leave', socket.uid); @@ -291,10 +247,6 @@ Sockets.getSocketCount = function() { return Array.isArray(clients) ? clients.length : 0; }; -Sockets.getConnectedClients = function() { - return onlineUsers; -}; - Sockets.getUserSocketCount = function(uid) { return 0; @@ -305,10 +257,6 @@ Sockets.getUserSocketCount = function(uid) { return roomClients.length; }; -Sockets.getOnlineUserCount = function () { - return onlineUsers.length; -}; - Sockets.getOnlineAnonCount = function () { return 0; diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js index e067b03c02..d483591f65 100644 --- a/src/socket.io/meta.js +++ b/src/socket.io/meta.js @@ -86,62 +86,67 @@ SocketMeta.rooms.enter = function(socket, data, callback) { }; SocketMeta.rooms.getAll = function(socket, data, callback) { - var rooms = {}; //websockets.server.sockets.manager.rooms; doesnt work in socket.io 1.x - - var socketData = { - onlineGuestCount: websockets.getOnlineAnonCount(), - onlineRegisteredCount: websockets.getOnlineUserCount(), - socketCount: websockets.getSocketCount(), - users: { - home: rooms['/home'] ? rooms['/home'].length : 0, - topics: 0, - category: 0 - }, - topics: {} - }; - - var scores = {}, - topTenTopics = [], - tid; - - for (var room in rooms) { - if (rooms.hasOwnProperty(room)) { - if (tid = room.match(/^\/topic_(\d+)/)) { - var length = rooms[room].length; - socketData.users.topics += length; - - if (scores[length]) { - scores[length].push(tid[1]); - } else { - scores[length] = [tid[1]]; - } - } else if (room.match(/^\/category/)) { - socketData.users.category += rooms[room].length; - } - } - } - - var scoreKeys = Object.keys(scores), - mostActive = scoreKeys.sort(); - - while(topTenTopics.length < 10 && mostActive.length > 0) { - topTenTopics = topTenTopics.concat(scores[mostActive.pop()]); - } - - topTenTopics = topTenTopics.slice(0, 10); - - topics.getTopicsFields(topTenTopics, ['title'], function(err, titles) { + db.sortedSetCount('users:online', now - 300000, now, function(err, onlineRegisteredCount) { if (err) { return callback(err); } - topTenTopics.forEach(function(tid, id) { - socketData.topics[tid] = { - value: rooms['/topic_' + tid].length, - title: validator.escape(titles[id].title) - }; - }); - callback(null, socketData); + var rooms = {}; //websockets.server.sockets.manager.rooms; doesnt work in socket.io 1.x + var socketData = { + onlineGuestCount: websockets.getOnlineAnonCount(), + onlineRegisteredCount: onlineRegisteredCount, + socketCount: websockets.getSocketCount(), + users: { + home: rooms['/home'] ? rooms['/home'].length : 0, + topics: 0, + category: 0 + }, + topics: {} + }; + + var scores = {}, + topTenTopics = [], + tid; + + for (var room in rooms) { + if (rooms.hasOwnProperty(room)) { + if (tid = room.match(/^\/topic_(\d+)/)) { + var length = rooms[room].length; + socketData.users.topics += length; + + if (scores[length]) { + scores[length].push(tid[1]); + } else { + scores[length] = [tid[1]]; + } + } else if (room.match(/^\/category/)) { + socketData.users.category += rooms[room].length; + } + } + } + + var scoreKeys = Object.keys(scores), + mostActive = scoreKeys.sort(); + + while(topTenTopics.length < 10 && mostActive.length > 0) { + topTenTopics = topTenTopics.concat(scores[mostActive.pop()]); + } + + topTenTopics = topTenTopics.slice(0, 10); + + topics.getTopicsFields(topTenTopics, ['title'], function(err, titles) { + if (err) { + return callback(err); + } + topTenTopics.forEach(function(tid, id) { + socketData.topics[tid] = { + value: rooms['/topic_' + tid].length, + title: validator.escape(titles[id].title) + }; + }); + + callback(null, socketData); + }); }); }; diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 01b4e1f78f..f5052460cc 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -46,21 +46,24 @@ SocketPosts.reply = function(socket, data, callback) { socket.emit('event:new_post', result); - var uids = websockets.getConnectedClients(); - - privileges.categories.filterUids('read', postData.topic.cid, uids, function(err, uids) { + user.getUidsFromSet('users:online', 0, -1, function(err, uids) { if (err) { return; } - - plugins.fireHook('filter:sockets.sendNewPostToUids', {uidsTo: uids, uidFrom: data.uid, type: "newPost"}, function(err, data) { - uids = data.uidsTo; - - for(var i=0; i