|
|
@ -23,10 +23,13 @@ var SocketIO = require('socket.io'),
|
|
|
|
/* === */
|
|
|
|
/* === */
|
|
|
|
|
|
|
|
|
|
|
|
var users = {},
|
|
|
|
var users = {},
|
|
|
|
userSockets = {},
|
|
|
|
|
|
|
|
rooms = {},
|
|
|
|
|
|
|
|
io;
|
|
|
|
io;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sockets.userSockets = {};
|
|
|
|
|
|
|
|
Sockets.rooms = {};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sockets.init = function() {
|
|
|
|
Sockets.init = function() {
|
|
|
|
|
|
|
|
|
|
|
|
io = socketioWildcard(SocketIO).listen(global.server, {
|
|
|
|
io = socketioWildcard(SocketIO).listen(global.server, {
|
|
|
@ -35,6 +38,8 @@ Sockets.init = function() {
|
|
|
|
'browser client minification': true
|
|
|
|
'browser client minification': true
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sockets.server = io;
|
|
|
|
|
|
|
|
|
|
|
|
fs.readdir(__dirname, function(err, files) {
|
|
|
|
fs.readdir(__dirname, function(err, files) {
|
|
|
|
files.splice(files.indexOf('index.js'), 1);
|
|
|
|
files.splice(files.indexOf('index.js'), 1);
|
|
|
|
|
|
|
|
|
|
|
@ -59,8 +64,10 @@ Sockets.init = function() {
|
|
|
|
uid = users[sessionID] = 0;
|
|
|
|
uid = users[sessionID] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
userSockets[uid] = userSockets[uid] || [];
|
|
|
|
socket.uid = uid;
|
|
|
|
userSockets[uid].push(socket);
|
|
|
|
|
|
|
|
|
|
|
|
Sockets.userSockets[uid] = Sockets.userSockets[uid] || [];
|
|
|
|
|
|
|
|
Sockets.userSockets[uid].push(socket);
|
|
|
|
|
|
|
|
|
|
|
|
/* Need to save some state for the logger & maybe some other modules later on */
|
|
|
|
/* Need to save some state for the logger & maybe some other modules later on */
|
|
|
|
socket.state = {
|
|
|
|
socket.state = {
|
|
|
@ -93,14 +100,14 @@ Sockets.init = function() {
|
|
|
|
|
|
|
|
|
|
|
|
socket.on('disconnect', function() {
|
|
|
|
socket.on('disconnect', function() {
|
|
|
|
|
|
|
|
|
|
|
|
var index = (userSockets[uid] || []).indexOf(socket);
|
|
|
|
var index = (Sockets.userSockets[uid] || []).indexOf(socket);
|
|
|
|
if (index !== -1) {
|
|
|
|
if (index !== -1) {
|
|
|
|
userSockets[uid].splice(index, 1);
|
|
|
|
Sockets.userSockets[uid].splice(index, 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (userSockets[uid] && userSockets[uid].length === 0) {
|
|
|
|
if (Sockets.userSockets[uid] && Sockets.userSockets[uid].length === 0) {
|
|
|
|
delete users[sessionID];
|
|
|
|
delete users[sessionID];
|
|
|
|
delete userSockets[uid];
|
|
|
|
delete Sockets.userSockets[uid];
|
|
|
|
if (uid) {
|
|
|
|
if (uid) {
|
|
|
|
db.sortedSetRemove('users:online', uid, function(err, data) {
|
|
|
|
db.sortedSetRemove('users:online', uid, function(err, data) {
|
|
|
|
});
|
|
|
|
});
|
|
|
@ -111,12 +118,12 @@ Sockets.init = function() {
|
|
|
|
|
|
|
|
|
|
|
|
emitOnlineUserCount();
|
|
|
|
emitOnlineUserCount();
|
|
|
|
|
|
|
|
|
|
|
|
for (var roomName in rooms) {
|
|
|
|
for (var roomName in Sockets.rooms) {
|
|
|
|
if (rooms.hasOwnProperty(roomName)) {
|
|
|
|
if (Sockets.rooms.hasOwnProperty(roomName)) {
|
|
|
|
socket.leave(roomName);
|
|
|
|
socket.leave(roomName);
|
|
|
|
|
|
|
|
|
|
|
|
if (rooms[roomName][socket.id]) {
|
|
|
|
if (Sockets.rooms[roomName][socket.id]) {
|
|
|
|
delete rooms[roomName][socket.id];
|
|
|
|
delete Sockets.rooms[roomName][socket.id];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
updateRoomBrowsingText(roomName);
|
|
|
|
updateRoomBrowsingText(roomName);
|
|
|
@ -125,12 +132,16 @@ Sockets.init = function() {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
socket.on('*', function(payload, callback) {
|
|
|
|
socket.on('*', function(payload, callback) {
|
|
|
|
// Ignore all non-api messages
|
|
|
|
function callMethod(method) {
|
|
|
|
if (payload.name.substr(0, 4) !== 'api:') {
|
|
|
|
method.call(socket, args[0]?args[0]:null, function(err, result) {
|
|
|
|
return;
|
|
|
|
if(callback) {
|
|
|
|
} else {
|
|
|
|
callback(err?{message:err.message}:null, result);
|
|
|
|
// Deconstruct the message
|
|
|
|
}
|
|
|
|
var parts = payload.name.slice(4).split('.'),
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var parts = payload.name.split('.'),
|
|
|
|
namespace = parts.slice(0, 1),
|
|
|
|
namespace = parts.slice(0, 1),
|
|
|
|
methodToCall = parts.reduce(function(prev, cur) {
|
|
|
|
methodToCall = parts.reduce(function(prev, cur) {
|
|
|
|
if (prev !== null && prev[cur]) {
|
|
|
|
if (prev !== null && prev[cur]) {
|
|
|
@ -141,56 +152,28 @@ Sockets.init = function() {
|
|
|
|
}, Namespaces);
|
|
|
|
}, Namespaces);
|
|
|
|
|
|
|
|
|
|
|
|
if (methodToCall !== null) {
|
|
|
|
if (methodToCall !== null) {
|
|
|
|
var sessionData = {
|
|
|
|
|
|
|
|
uid: uid,
|
|
|
|
|
|
|
|
socket: socket,
|
|
|
|
|
|
|
|
rooms: rooms,
|
|
|
|
|
|
|
|
server: io,
|
|
|
|
|
|
|
|
userSockets: userSockets
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
socketArgs = [];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Construct the arguments that'll get passed into each socket method
|
|
|
|
|
|
|
|
if (payload.args.length) {
|
|
|
|
|
|
|
|
socketArgs = socketArgs.concat(payload.args);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (callback !== undefined) {
|
|
|
|
|
|
|
|
socketArgs.push(callback);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
socketArgs.push(sessionData);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Call the requested method
|
|
|
|
|
|
|
|
if (Namespaces[namespace].before) {
|
|
|
|
if (Namespaces[namespace].before) {
|
|
|
|
Namespaces[namespace].before(sessionData, function() {
|
|
|
|
Namespaces[namespace].before(socket, function() {
|
|
|
|
try {
|
|
|
|
callMethod(methodToCall);
|
|
|
|
methodToCall.apply(Namespaces, socketArgs);
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
winston.error(e.message);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
callMethod(methodToCall);
|
|
|
|
methodToCall.apply(Namespaces, socketArgs);
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
winston.error(e.message);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// winston.info('[socket.io] Executing: ' + payload.name);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
winston.warn('[socket.io] Unrecognized message: ' + payload.name);
|
|
|
|
winston.warn('[socket.io] Unrecognized message: ' + payload.name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Sockets.logoutUser = function(uid) {
|
|
|
|
Sockets.logoutUser = function(uid) {
|
|
|
|
if(userSockets[uid] && userSockets[uid].length) {
|
|
|
|
if(Sockets.userSockets[uid] && Sockets.userSockets[uid].length) {
|
|
|
|
for(var i=0; i< userSockets[uid].length; ++i) {
|
|
|
|
for(var i=0; i< Sockets.userSockets[uid].length; ++i) {
|
|
|
|
userSockets[uid][i].emit('event:disconnect');
|
|
|
|
Sockets.userSockets[uid][i].emit('event:disconnect');
|
|
|
|
userSockets[uid][i].disconnect();
|
|
|
|
Sockets.userSockets[uid][i].disconnect();
|
|
|
|
|
|
|
|
|
|
|
|
if(!userSockets[uid]) {
|
|
|
|
if(!Sockets.userSockets[uid]) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -211,18 +194,18 @@ Sockets.in = function(room) {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Sockets.getConnectedClients = function() {
|
|
|
|
Sockets.getConnectedClients = function() {
|
|
|
|
return userSockets;
|
|
|
|
return Sockets.userSockets;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Sockets.getOnlineAnonCount = function () {
|
|
|
|
Sockets.getOnlineAnonCount = function () {
|
|
|
|
return userSockets[0] ? userSockets[0].length : 0;
|
|
|
|
return Sockets.userSockets[0] ? Sockets.userSockets[0].length : 0;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* Helpers */
|
|
|
|
/* Helpers */
|
|
|
|
|
|
|
|
|
|
|
|
Sockets.isUserOnline = isUserOnline;
|
|
|
|
Sockets.isUserOnline = isUserOnline;
|
|
|
|
function isUserOnline(uid) {
|
|
|
|
function isUserOnline(uid) {
|
|
|
|
return !!userSockets[uid] && userSockets[uid].length > 0;
|
|
|
|
return !!Sockets.userSockets[uid] && Sockets.userSockets[uid].length > 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Sockets.updateRoomBrowsingText = updateRoomBrowsingText;
|
|
|
|
Sockets.updateRoomBrowsingText = updateRoomBrowsingText;
|
|
|
@ -251,7 +234,7 @@ function updateRoomBrowsingText(roomName) {
|
|
|
|
return anonCount;
|
|
|
|
return anonCount;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var uids = getUidsInRoom(rooms[roomName]),
|
|
|
|
var uids = getUidsInRoom(Sockets.rooms[roomName]),
|
|
|
|
anonymousCount = getAnonymousCount(roomName);
|
|
|
|
anonymousCount = getAnonymousCount(roomName);
|
|
|
|
|
|
|
|
|
|
|
|
if (uids.length === 0) {
|
|
|
|
if (uids.length === 0) {
|
|
|
@ -287,8 +270,8 @@ function emitTopicPostStats(callback) {
|
|
|
|
|
|
|
|
|
|
|
|
Sockets.emitOnlineUserCount = emitOnlineUserCount;
|
|
|
|
Sockets.emitOnlineUserCount = emitOnlineUserCount;
|
|
|
|
function emitOnlineUserCount(callback) {
|
|
|
|
function emitOnlineUserCount(callback) {
|
|
|
|
var anon = userSockets[0] ? userSockets[0].length : 0;
|
|
|
|
var anon = Sockets.userSockets[0] ? Sockets.userSockets[0].length : 0;
|
|
|
|
var registered = Object.keys(userSockets).length;
|
|
|
|
var registered = Object.keys(Sockets.userSockets).length;
|
|
|
|
if (anon) {
|
|
|
|
if (anon) {
|
|
|
|
registered = registered - 1;
|
|
|
|
registered = registered - 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|