removed rooms.js removed browsing users, removed chat syncing across sockets

use lastonline for online detection
v1.18.x
barisusakli 9 years ago
parent 1ecf27417a
commit 46c2563164

@ -8,12 +8,11 @@ define('forum/topic', [
'forum/topic/threadTools', 'forum/topic/threadTools',
'forum/topic/postTools', 'forum/topic/postTools',
'forum/topic/events', 'forum/topic/events',
'forum/topic/browsing',
'forum/topic/posts', 'forum/topic/posts',
'navigator', 'navigator',
'sort', 'sort',
'components' 'components'
], function(infinitescroll, threadTools, postTools, events, browsing, posts, navigator, sort, components) { ], function(infinitescroll, threadTools, postTools, events, posts, navigator, sort, components) {
var Topic = {}, var Topic = {},
currentUrl = ''; currentUrl = '';

@ -1,111 +0,0 @@
'use strict';
/* globals define, app, config, socket, ajaxify */
define('forum/topic/browsing', function() {
var Browsing = {};
Browsing.onUpdateUsersInRoom = function(data) {
if (data && data.room.indexOf('topic_' + ajaxify.data.tid) !== -1) {
$('[component="topic/browsing/list"]').parent().toggleClass('hidden', !data.users.length);
for (var i=0; i<data.users.length; ++i) {
addUserIcon(data.users[i]);
}
updateUserCount(data.hidden);
}
};
Browsing.onUserEnter = function(data) {
var browsingList = $('[component="topic/browsing/list"]');
var user = browsingList.find('a[data-uid="' + data.uid + '"]');
if (!user.length && browsingList.first().children().length < 10) {
addUserIcon(data);
} else if (user.length) {
user.attr('data-count', parseInt(user.attr('data-count'), 10) + 1);
} else {
increaseUserCount(1);
}
Browsing.onUserStatusChange(data);
};
Browsing.onUserLeave = function(uid) {
if (app.user.uid === parseInt(uid, 10)) {
return;
}
var browsingList = $('[component="topic/browsing/list"]');
var user = browsingList.find('a[data-uid="' + uid + '"]');
if (user.length) {
var count = Math.max(0, parseInt(user.attr('data-count'), 10) - 1);
user.attr('data-count', count);
if (count <= 0) {
user.parent().remove();
if (!browsingList.children(':not(.hidden)').length) {
browsingList.parent().addClass('hidden');
}
}
} else {
increaseUserCount(-1);
}
};
Browsing.onUserStatusChange = function(data) {
app.updateUserStatus($('[data-uid="' + data.uid + '"] [component="user/status"]'), data.status);
updateBrowsingUsers(data);
};
function updateBrowsingUsers(data) {
var browsingList = $('[component="topic/browsing/list"]');
var user = browsingList.find('a[data-uid="'+ data.uid + '"]');
if (user.length) {
user.parent().toggleClass('hidden', data.status === 'offline');
browsingList.parent().toggleClass('hidden', !browsingList.children(':not(.hidden)').length);
}
}
function addUserIcon(user) {
if (!user.userslug) {
return;
}
var browsingList = $('[component="topic/browsing/list"]');
var userEl = createUserIcon(user.uid, user.picture, user.userslug, user.username, user['icon:bgColor'], user['icon:text']);
var isSelf = parseInt(user.uid, 10) === parseInt(app.user.uid, 10);
if (isSelf) {
browsingList.prepend(userEl);
} else {
browsingList.append(userEl);
}
browsingList.find('a[data-uid]').tooltip({
placement: 'top'
});
}
function createUserIcon(uid, picture, userslug, username, iconBg, iconText) {
if (!$('[component="topic/browsing/list"]').find('[data-uid="' + uid + '"]').length) {
var imgOrIcon = picture ?
'<img src="'+ picture +'" />' :
'<div class="user-icon" style="background-color: ' + iconBg + ';">' + iconText + '</div>';
return $('<div class="inline-block"><a title="' + username + '" data-uid="' + uid + '" data-count="1" href="' + config.relative_path + '/user/' + userslug + '">' + imgOrIcon + '</a></div>');
}
}
function updateUserCount(count) {
count = parseInt(count, 10);
if (!count || count < 0) {
count = 0;
}
$('[component="topic/browsing/count"]').text(count).parent().toggleClass('hidden', count === 0);
}
function increaseUserCount(incr) {
updateUserCount(parseInt($('[component="topic/browsing/count"]').first().text(), 10) + incr);
}
return Browsing;
});

@ -10,9 +10,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
var chatsToggleEl = components.get('chat/dropdown'), var chatsToggleEl = components.get('chat/dropdown'),
chatsListEl = components.get('chat/list'); chatsListEl = components.get('chat/list');
// Sync open chats between all user socket sessions
module.sync();
chatsToggleEl.on('click', function() { chatsToggleEl.on('click', function() {
if (chatsToggleEl.parent().hasClass('open')) { if (chatsToggleEl.parent().hasClass('open')) {
return; return;
@ -94,32 +91,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
app.updateUserStatus(modal.find('[component="user/status"]'), data.status); app.updateUserStatus(modal.find('[component="user/status"]'), data.status);
}); });
socket.on('query:chats.sync', function(data, callback) {
var chats = Array.prototype.map.call(taskbar.get('chat'), function(chatObj) {
return {
username: chatObj.options.title,
uid: chatObj.options.touid,
new: chatObj.element.hasClass('new')
};
});
callback(null, chats);
});
socket.on('event:chats.open', function(data) {
data.silent = true;
module.createModal(data);
});
socket.on('event:chats.close', function(uid) {
module.close(module.getModal(uid), true);
});
socket.on('event:chats.toggleNew', function(data) {
var uuid = module.getModal(data.uid).attr('UUID');
module.toggleNew(uuid, data.state, true);
});
$(window).on('action:taskbar.toggleNew', function(ev, uuid) { $(window).on('action:taskbar.toggleNew', function(ev, uuid) {
var modal = $('.chat-modal[uuid="' + uuid + '"]'), var modal = $('.chat-modal[uuid="' + uuid + '"]'),
touid = modal.attr('touid'); touid = modal.attr('touid');
@ -318,10 +289,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
state: '' state: ''
}); });
if (!data.silent) {
socket.emit('modules.chats.open', data);
}
$(window).trigger('action:chat.loaded', chatModal); $(window).trigger('action:chat.loaded', chatModal);
if (typeof callback === 'function') { if (typeof callback === 'function') {
@ -343,10 +310,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
taskbar.discard('chat', chatModal.attr('UUID')); taskbar.discard('chat', chatModal.attr('UUID'));
Chats.notifyTyping(chatModal.attr('touid'), false); Chats.notifyTyping(chatModal.attr('touid'), false);
if (!silent) {
socket.emit('modules.chats.close', chatModal.attr('touid'));
}
if (chatModal.attr('data-mobile')) { if (chatModal.attr('data-mobile')) {
module.disableMobileBehaviour(chatModal); module.disableMobileBehaviour(chatModal);
} }
@ -423,27 +386,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
socket.emit('modules.chats.canMessage', toUid, callback); socket.emit('modules.chats.canMessage', toUid, callback);
}; };
module.sync = function() {
socket.emit('modules.chats.sync', function(err, users) {
if (err) {
return app.alertError(err.message);
}
users.forEach(function(user) {
if (!module.modalExists(user.uid)) {
module.createModal({
username: user.username,
touid: user.uid,
silent: true
}, function(modal) {
if (user.new) {
module.toggleNew(modal.attr('UUID'), true, true);
}
});
}
});
});
};
return module; return module;
}); });

@ -86,7 +86,7 @@ helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) {
userData['email:confirmed'] = !!parseInt(userData['email:confirmed'], 10); userData['email:confirmed'] = !!parseInt(userData['email:confirmed'], 10);
userData.profile_links = results.profile_links; userData.profile_links = results.profile_links;
userData.sso = results.sso.associations; userData.sso = results.sso.associations;
userData.status = require('../../socket.io').isUserOnline(userData.uid) ? (userData.status || 'online') : 'offline'; userData.status = user.getStatus(userData);
userData.banned = parseInt(userData.banned, 10) === 1; userData.banned = parseInt(userData.banned, 10) === 1;
userData.website = validator.escape(userData.website); userData.website = validator.escape(userData.website);
userData.websiteLink = !userData.website.startsWith('http') ? 'http://' + userData.website : userData.website; userData.websiteLink = !userData.website.startsWith('http') ? 'http://' + userData.website : userData.website;

@ -125,6 +125,7 @@ topicsController.get = function(req, res, callback) {
}); });
}, },
function (topicData, next) { function (topicData, next) {
var breadcrumbs = [ var breadcrumbs = [
{ {
text: topicData.category.name, text: topicData.category.name,

@ -266,7 +266,7 @@ var db = require('./database'),
db.isSortedSetMembers('uid:' + uid + ':chats:unread', uids, next); db.isSortedSetMembers('uid:' + uid + ':chats:unread', uids, next);
}, },
users: function(next) { users: function(next) {
user.getUsersFields(uids, ['uid', 'username', 'picture', 'status'] , next); user.getUsersFields(uids, ['uid', 'username', 'picture', 'status', 'lastonline'] , next);
}, },
teasers: function(next) { teasers: function(next) {
async.map(uids, function(fromuid, next) { async.map(uids, function(fromuid, next) {
@ -288,11 +288,11 @@ var db = require('./database'),
return callback(err); return callback(err);
} }
results.users.forEach(function(user, index) { results.users.forEach(function(userData, index) {
if (user && parseInt(user.uid, 10)) { if (userData && parseInt(userData.uid, 10)) {
user.unread = results.unread[index]; userData.unread = results.unread[index];
user.status = sockets.isUserOnline(user.uid) ? user.status : 'offline'; userData.status = user.getStatus(userData);
user.teaser = results.teasers[index]; userData.teaser = results.teasers[index];
} }
}); });
@ -416,35 +416,37 @@ var db = require('./database'),
}; };
function sendNotifications(fromuid, touid, messageObj, callback) { function sendNotifications(fromuid, touid, messageObj, callback) {
if (sockets.isUserOnline(touid)) { user.isOnline(touid, function(err, isOnline) {
return callback(); if (err || isOnline) {
} return callback(err);
notifications.create({
bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]',
bodyLong: messageObj.content,
nid: 'chat_' + fromuid + '_' + touid,
from: fromuid,
path: '/chats/' + messageObj.fromUser.username
}, function(err, notification) {
if (!err && notification) {
notifications.push(notification, [touid], callback);
} }
});
user.getSettings(messageObj.toUser.uid, function(err, settings) { notifications.create({
if (settings.sendChatNotifications && !parseInt(meta.config.disableEmailSubscriptions, 10)) { bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]',
emailer.send('notif_chat', touid, { bodyLong: messageObj.content,
subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]', nid: 'chat_' + fromuid + '_' + touid,
username: messageObj.toUser.username, from: fromuid,
userslug: utils.slugify(messageObj.toUser.username), path: '/chats/' + messageObj.fromUser.username
summary: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', }, function(err, notification) {
message: messageObj, if (!err && notification) {
site_title: meta.config.title || 'NodeBB', notifications.push(notification, [touid], callback);
url: nconf.get('url'), }
fromUserslug: utils.slugify(messageObj.fromUser.username) });
});
} user.getSettings(messageObj.toUser.uid, function(err, settings) {
if (settings.sendChatNotifications && !parseInt(meta.config.disableEmailSubscriptions, 10)) {
emailer.send('notif_chat', touid, {
subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]',
username: messageObj.toUser.username,
userslug: utils.slugify(messageObj.toUser.username),
summary: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]',
message: messageObj,
site_title: meta.config.title || 'NodeBB',
url: nconf.get('url'),
fromUserslug: utils.slugify(messageObj.fromUser.username)
});
}
});
}); });
} }

@ -52,7 +52,6 @@ module.exports = function(Meta) {
'public/src/client/recent.js', 'public/src/client/recent.js',
'public/src/client/unread.js', 'public/src/client/unread.js',
'public/src/client/topic.js', 'public/src/client/topic.js',
'public/src/client/topic/browsing.js',
'public/src/client/topic/events.js', 'public/src/client/topic/events.js',
'public/src/client/topic/flag.js', 'public/src/client/topic/flag.js',
'public/src/client/topic/fork.js', 'public/src/client/topic/fork.js',

@ -20,10 +20,7 @@ module.exports = function(Posts) {
user.getMultipleUserSettings(uids, next); user.getMultipleUserSettings(uids, next);
}, },
userData: function(next) { userData: function(next) {
user.getUsersFields(uids, ['uid', 'username', 'fullname', 'userslug', 'reputation', 'postcount', 'picture', 'signature', 'banned', 'status'], next); user.getUsersFields(uids, ['uid', 'username', 'fullname', 'userslug', 'reputation', 'postcount', 'picture', 'signature', 'banned', 'status', 'lastonline'], next);
},
online: function(next) {
require('../socket.io').isUsersOnline(uids, next);
} }
}, function(err, results) { }, function(err, results) {
if (err) { if (err) {
@ -47,7 +44,7 @@ module.exports = function(Posts) {
userData.selectedGroup = userData.groups[index]; userData.selectedGroup = userData.groups[index];
} }
}); });
userData.status = user.getStatus(userData.status, results.online[i]); userData.status = user.getStatus(userData);
}); });
async.map(userData, function(userData, next) { async.map(userData, function(userData, next) {

@ -11,7 +11,6 @@ var SocketIO = require('socket.io'),
user = require('../user'), user = require('../user'),
logger = require('../logger'), logger = require('../logger'),
ratelimit = require('../middleware/ratelimit'), ratelimit = require('../middleware/ratelimit'),
rooms = require('./rooms'),
Sockets = {}, Sockets = {},
Namespaces = {}; Namespaces = {};
@ -63,8 +62,8 @@ function onConnection(socket) {
function onConnect(socket) { function onConnect(socket) {
if (socket.uid) { if (socket.uid) {
rooms.enter(socket, 'uid_' + socket.uid); socket.join('uid_' + socket.uid);
rooms.enter(socket, 'online_users'); socket.join('online_users');
user.getUserFields(socket.uid, ['status'], function(err, userData) { user.getUserFields(socket.uid, ['status'], function(err, userData) {
if (err || !userData) { if (err || !userData) {
@ -76,7 +75,7 @@ function onConnect(socket) {
} }
}); });
} else { } else {
rooms.enter(socket, 'online_guests'); socket.join('online_guests');
} }
} }
@ -87,7 +86,6 @@ function onDisconnect(socket, data) {
socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: 'offline'}); socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: 'offline'});
} }
} }
rooms.leaveAll(socket, data.rooms);
} }
function onMessage(socket, payload) { function onMessage(socket, payload) {
@ -249,11 +247,13 @@ Sockets.reqFromSocket = function(socket) {
}; };
Sockets.isUserOnline = function(uid) { Sockets.isUserOnline = function(uid) {
return !!rooms.clients('uid_' + uid).length; winston.warn('[deprecated] Sockets.isUserOnline')
return false;
}; };
Sockets.isUsersOnline = function(uids, callback) { Sockets.isUsersOnline = function(uids, callback) {
callback(null, uids.map(Sockets.isUserOnline)); winston.warn('[deprecated] Sockets.isUsersOnline')
callback(null, uids.map(function() { return false; }));
}; };
Sockets.getUsersInRoom = function (uid, roomName, start, stop, callback) { Sockets.getUsersInRoom = function (uid, roomName, start, stop, callback) {

@ -1,12 +1,9 @@
'use strict'; 'use strict';
var validator = require('validator'), var meta = require('../meta'),
meta = require('../meta'),
user = require('../user'), user = require('../user'),
topics = require('../topics'), topics = require('../topics'),
emitter = require('../emitter'), emitter = require('../emitter'),
rooms = require('./rooms'),
websockets = require('./'), websockets = require('./'),
@ -50,7 +47,7 @@ SocketMeta.rooms.enter = function(socket, data, callback) {
leaveCurrentRoom(socket); leaveCurrentRoom(socket);
if (data.enter) { if (data.enter) {
rooms.enter(socket, data.enter); socket.join(data.enter);
socket.currentRoom = data.enter; socket.currentRoom = data.enter;
} }
callback(); callback();
@ -66,7 +63,7 @@ SocketMeta.rooms.leaveCurrent = function(socket, data, callback) {
function leaveCurrentRoom(socket) { function leaveCurrentRoom(socket) {
if (socket.currentRoom) { if (socket.currentRoom) {
rooms.leave(socket, socket.currentRoom); socket.leave(socket.currentRoom);
socket.currentRoom = ''; socket.currentRoom = '';
} }
} }

@ -7,7 +7,6 @@ var meta = require('../meta'),
async = require('async'), async = require('async'),
server = require('./'), server = require('./'),
rooms = require('./rooms'),
SocketModules = { SocketModules = {
chats: {}, chats: {},
@ -105,37 +104,6 @@ SocketModules.chats.getRecentChats = function(socket, data, callback) {
Messaging.getRecentChats(socket.uid, start, stop, callback); Messaging.getRecentChats(socket.uid, start, stop, callback);
}; };
SocketModules.chats.sync = function(socket, data, callback) {
var chats = [],
uids = [],
socketIds = rooms.clients('uid_' + socket.uid);
rooms.broadcast(socket, 'uid_' + socket.uid, 'query:chats.sync', {}, function(err, sessionData) {
sessionData.forEach(function(data) {
data.forEach(function(chat) {
if (uids.indexOf(chat.uid) === -1) {
chats.push(chat);
uids.push(chat.uid);
}
});
});
callback(err, chats);
});
};
SocketModules.chats.open = function(socket, data, callback) {
rooms.broadcast(socket, 'uid_' + socket.uid, 'event:chats.open', data);
};
SocketModules.chats.close = function(socket, data, callback) {
rooms.broadcast(socket, 'uid_' + socket.uid, 'event:chats.close', data);
};
SocketModules.chats.toggleNew = function(socket, data, callback) {
rooms.broadcast(socket, 'uid_' + socket.uid, 'event:chats.toggleNew', data);
};
/* Sounds */ /* Sounds */
SocketModules.sounds.getSounds = function(socket, data, callback) { SocketModules.sounds.getSounds = function(socket, data, callback) {

@ -1,129 +0,0 @@
'use strict';
// Temp solution until
// https://github.com/NodeBB/NodeBB/issues/2486
// and
// https://github.com/Automattic/socket.io/issues/1945
// are closed.
// Once they are closed switch to .clients() and async calls
var pubsub = require('../pubsub'),
async = require('async');
var rooms = {};
var clientRooms = {};
var roomClients = {};
rooms.enter = function(socket, room) {
socket.join(room);
//pubsub.publish('socket:join', {id: socket.id, room: room});
};
rooms.leave = function(socket, room) {
socket.leave(room);
//pubsub.publish('socket:leave', {id: socket.id, room: room});
};
rooms.leaveAll = function(socket, roomsToLeave) {
roomsToLeave.forEach(function(room) {
rooms.leave(socket, room);
});
};
rooms.broadcast = function(socket, room, msg, data, callback) {
var io = require('./'),
socketIds = rooms.clients(room);
callback = callback || function() {};
// Filter out socketIds that aren't actually connected
socketIds = socketIds.filter(function(id) {
return io.server.sockets.connected.hasOwnProperty(id);
});
async.map(socketIds, function(id, next) {
var timeout,
timeoutPassed = false;
if (socket.id === id) {
return setImmediate(next, null, []);
}
timeout = setTimeout(function() {
timeoutPassed = true;
next(null, []);
}, 500);
io.server.sockets.connected[id].emit(msg, data || {}, function(err, returnData) {
clearTimeout(timeout);
if (!timeoutPassed) {
next(null, returnData);
}
});
}, callback);
};
pubsub.on('socket:join', onSocketJoin);
pubsub.on('socket:leave', onSocketLeave);
function onSocketJoin(data) {
clientRooms[data.id] = clientRooms[data.id] || [];
if (clientRooms[data.id].indexOf(data.room) === -1) {
clientRooms[data.id].push(data.room);
}
roomClients[data.room] = roomClients[data.room] || [];
if (roomClients[data.room].indexOf(data.id) === -1) {
roomClients[data.room].push(data.id);
}
}
function onSocketLeave(data) {
var index;
if (Array.isArray(clientRooms[data.id])) {
index = clientRooms[data.id].indexOf(data.room);
if (index !== -1) {
clientRooms[data.id].splice(index, 1);
if (!clientRooms[data.id].length) {
delete clientRooms[data.id];
}
}
}
if (Array.isArray(roomClients[data.room])) {
index = roomClients[data.room].indexOf(data.id);
if (index !== -1) {
roomClients[data.room].splice(index, 1);
if (!roomClients[data.room].length) {
delete roomClients[data.room];
}
}
}
}
rooms.clients = function(room) {
return Array.isArray(roomClients[room]) ? roomClients[room] : [];
};
rooms.clientRooms = function(id) {
return Array.isArray(clientRooms[id]) ? clientRooms[id] : [];
};
rooms.socketCount = function() {
return Object.keys(clientRooms || {}).length;
};
rooms.roomClients = function() {
return roomClients;
};
module.exports = rooms;

@ -8,15 +8,12 @@ module.exports = function(SocketUser) {
if (!socket.uid) { if (!socket.uid) {
return callback('[[error:invalid-uid]]'); return callback('[[error:invalid-uid]]');
} }
var online = websockets.isUserOnline(uid);
if (!online) { user.getUserFields(uid, ['lastonline', 'status'], function(err, userData) {
return callback(null, 'offline');
}
user.getUserField(uid, 'status', function(err, status) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
status = status || 'online'; var status = user.getStatus(userData);
callback(null, status); callback(null, status);
}); });
}; };

@ -272,13 +272,13 @@ module.exports = function(Topics) {
var tid = postData.tid; var tid = postData.tid;
var uid = postData.uid; var uid = postData.uid;
async.waterfall([ async.waterfall([
function(next) { function (next) {
Topics.markAsUnreadForAll(tid, next); Topics.markAsUnreadForAll(tid, next);
}, },
function(next) { function (next) {
Topics.markAsRead([tid], uid, next); Topics.markAsRead([tid], uid, next);
}, },
function(next) { function (markedRead, next) {
async.parallel({ async.parallel({
userInfo: function(next) { userInfo: function(next) {
posts.getUserInfoForPosts([postData.uid], uid, next); posts.getUserInfoForPosts([postData.uid], uid, next);
@ -294,7 +294,7 @@ module.exports = function(Topics) {
} }
}, next); }, next);
}, },
function(results, next) { function (results, next) {
postData.user = results.userInfo[0]; postData.user = results.userInfo[0];
postData.topic = results.topicInfo; postData.topic = results.topicInfo;

@ -1,12 +1,9 @@
'use strict'; 'use strict';
var async = require('async'), var async = require('async'),
nconf = require('nconf'),
gravatar = require('gravatar'),
plugins = require('./plugins'), plugins = require('./plugins'),
db = require('./database'), db = require('./database'),
meta = require('./meta'),
topics = require('./topics'), topics = require('./topics'),
privileges = require('./privileges'), privileges = require('./privileges'),
utils = require('../public/src/utils'); utils = require('../public/src/utils');
@ -91,7 +88,7 @@ var async = require('async'),
}; };
User.getUsers = function(uids, uid, callback) { User.getUsers = function(uids, uid, callback) {
var fields = ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'joindate', 'postcount', 'reputation', 'email:confirmed']; var fields = ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'joindate', 'postcount', 'reputation', 'email:confirmed', 'lastonline'];
plugins.fireHook('filter:users.addFields', {fields: fields}, function(err, data) { plugins.fireHook('filter:users.addFields', {fields: fields}, function(err, data) {
if (err) { if (err) {
return callback(err); return callback(err);
@ -105,9 +102,6 @@ var async = require('async'),
}, },
isAdmin: function(next) { isAdmin: function(next) {
User.isAdministrator(uids, next); User.isAdministrator(uids, next);
},
isOnline: function(next) {
require('./socket.io').isUsersOnline(uids, next);
} }
}, function(err, results) { }, function(err, results) {
if (err) { if (err) {
@ -118,7 +112,7 @@ var async = require('async'),
if (!user) { if (!user) {
return; return;
} }
user.status = User.getStatus(user.status, results.isOnline[index]); user.status = User.getStatus(user);
user.joindateISO = utils.toISOString(user.joindate); user.joindateISO = utils.toISOString(user.joindate);
user.administrator = results.isAdmin[index]; user.administrator = results.isAdmin[index];
user.banned = parseInt(user.banned, 10) === 1; user.banned = parseInt(user.banned, 10) === 1;
@ -135,8 +129,19 @@ var async = require('async'),
}); });
}; };
User.getStatus = function(status, isOnline) { User.getStatus = function(userData) {
return isOnline ? (status || 'online') : 'offline'; var isOnline = Date.now() - parseInt(userData.lastonline, 10) < 300000;
return isOnline ? (userData.status || 'online') : 'offline';
};
User.isOnline = function(uid, callback) {
User.getUserField(uid, 'lastonline', function(err, lastonline) {
if (err) {
return callback(err);
}
var isOnline = Date.now() - parseInt(lastonline, 10) < 300000;
callback(null, isOnline);
});
}; };
User.exists = function(uid, callback) { User.exists = function(uid, callback) {

@ -98,29 +98,16 @@ module.exports = function(User) {
function filterAndSortUids(uids, data, callback) { function filterAndSortUids(uids, data, callback) {
var sortBy = data.sortBy || 'joindate'; var sortBy = data.sortBy || 'joindate';
var fields = ['uid', 'status', sortBy]; var fields = ['uid', 'status', 'lastonline', sortBy];
async.parallel({ User.getUsersFields(uids, fields, function(err, userData) {
userData: function(next) {
User.getUsersFields(uids, fields, next);
},
isOnline: function(next) {
if (data.onlineOnly) {
require('../socket.io').isUsersOnline(uids, next);
} else {
next();
}
}
}, function(err, results) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
var userData = results.userData;
if (data.onlineOnly) { if (data.onlineOnly) {
userData = userData.filter(function(user, index) { userData = userData.filter(function(user) {
return user && user.status !== 'offline' && results.isOnline[index]; return user && user.status !== 'offline' && (Date.now() - parseInt(user.lastonline, 10) < 300000);
}); });
} }

Loading…
Cancel
Save