various fixes for socket.io cluster
display user presence correctly
This commit is contained in:
barisusakli
2015-03-25 22:33:14 -04:00
parent 1a58ea6520
commit 77e956861a
7 changed files with 194 additions and 100 deletions

View File

@@ -12,6 +12,7 @@ var nconf = require('nconf'),
logger = require('../logger'),
plugins = require('../plugins'),
emitter = require('../emitter'),
rooms = require('./rooms'),
websockets = require('./'),
@@ -58,7 +59,7 @@ SocketMeta.rooms.enter = function(socket, data, callback) {
}
if (socket.currentRoom) {
socket.leave(socket.currentRoom);
rooms.leave(socket, socket.currentRoom);
if (socket.currentRoom.indexOf('topic') !== -1) {
websockets.in(socket.currentRoom).emit('event:user_leave', socket.uid);
}
@@ -66,7 +67,7 @@ SocketMeta.rooms.enter = function(socket, data, callback) {
}
if (data.enter) {
socket.join(data.enter);
rooms.enter(socket, data.enter);
socket.currentRoom = data.enter;
if (data.enter.indexOf('topic') !== -1) {
data.uid = socket.uid;
@@ -80,69 +81,64 @@ SocketMeta.rooms.enter = function(socket, data, callback) {
};
SocketMeta.rooms.getAll = function(socket, data, callback) {
var now = Date.now();
db.sortedSetCount('users:online', now - 300000, now, function(err, onlineRegisteredCount) {
var roomClients = rooms.roomClients();
var socketData = {
onlineGuestCount: websockets.getOnlineAnonCount(),
onlineRegisteredCount: websockets.getOnlineUserCount(),
socketCount: websockets.getSocketCount(),
users: {
categories: roomClients.categories ? roomClients.categories.length : 0,
topics: 0,
category: 0
},
topics: {}
};
var scores = {},
topTenTopics = [],
tid;
for (var room in roomClients) {
if (roomClients.hasOwnProperty(room)) {
tid = room.match(/^topic_(\d+)/);
if (tid) {
var length = roomClients[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 += roomClients[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);
}
var rooms = {}; // TODO: 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: {}
topTenTopics.forEach(function(tid, id) {
socketData.topics[tid] = {
value: Array.isArray(roomClients['topic_' + tid]) ? roomClients['topic_' + tid].length : 0,
title: validator.escape(titles[id].title)
};
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);
});
callback(null, socketData);
});
};
/* Exports */