diff --git a/public/src/app.js b/public/src/app.js index 7b7f632747..94db871a31 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -375,12 +375,6 @@ var socket, }); }; - function updateOnlineStatus(uid) { - socket.emit('user.isOnline', uid, function(err, data) { - $('#logged-in-menu #user_label #user-profile-link>i').attr('class', 'fa fa-circle status ' + data.status); - }); - } - function exposeConfigToTemplates() { $(document).ready(function() { templates.setGlobal('relative_path', RELATIVE_PATH); @@ -492,11 +486,12 @@ var socket, function handleStatusChange() { $('#user-control-list .user-status').off('click').on('click', function(e) { - socket.emit('user.setStatus', $(this).attr('data-status'), function(err, data) { + var status = $(this).attr('data-status'); + socket.emit('user.setStatus', status, function(err, data) { if(err) { return app.alertError(err.message); } - updateOnlineStatus(data.uid); + $('#logged-in-menu #user_label #user-profile-link>i').attr('class', 'fa fa-circle status ' + status); }); e.preventDefault(); }); diff --git a/public/src/forum/account/profile.js b/public/src/forum/account/profile.js index 343be867c2..a9633b6aba 100644 --- a/public/src/forum/account/profile.js +++ b/public/src/forum/account/profile.js @@ -35,8 +35,6 @@ define('forum/account/profile', ['forum/account/header'], function(header) { socket.on('user.isOnline', handleUserOnline); - socket.emit('user.isOnline', theirid, handleUserOnline); - if (yourid !== theirid) { socket.emit('user.increaseViewCount', theirid); } diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index 61ad6f4837..5098d66d5d 100644 --- a/public/src/forum/topic.js +++ b/public/src/forum/topic.js @@ -362,7 +362,6 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT } function processPage(element) { - browsing.populateOnlineUsers(); app.createUserTooltips(); app.replaceSelfLinks(element.find('a')); utils.addCommasToNumbers(element.find('.formatted-number')); diff --git a/public/src/forum/topic/browsing.js b/public/src/forum/topic/browsing.js index 0b577b13d9..5d1833bdd0 100644 --- a/public/src/forum/topic/browsing.js +++ b/public/src/forum/topic/browsing.js @@ -80,34 +80,11 @@ define('forum/topic/browsing', function() { }; Browsing.onUserOnline = function(err, data) { - updateOnlineIcon($('.username-field[data-username="' + data.username + '"'), data); + updateOnlineIcon($('.username-field[data-username="' + data.username + '"]'), data); updateBrowsingUsers(data); }; - Browsing.populateOnlineUsers = function () { - var uids = []; - - $('.post-row').each(function () { - var uid = $(this).attr('data-uid'); - if(uids.indexOf(uid) === -1) { - uids.push(uid); - } - }); - - socket.emit('user.getOnlineUsers', uids, function (err, users) { - - $('.username-field').each(function () { - var el = $(this), - uid = el.parents('li').attr('data-uid'); - - if (uid && users[uid]) { - updateOnlineIcon(el, users[uid]); - } - }); - }); - }; - function updateOnlineIcon(el, userData) { translator.translate('[[global:' + userData.status + ']]', function(translated) { el.siblings('i') diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 73b94a0442..6484c458f9 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -7,7 +7,6 @@ define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, var newMessage = false; module.prepareDOM = function() { - // Chats Dropdown var chatsToggleEl = $('#chat_dropdown'), chatsListEl = $('#chat-list'); @@ -74,7 +73,6 @@ define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, if (modal.is(":visible")) { module.bringModalToTop(modal); - checkOnlineStatus(modal); taskbar.updateActive(modal.attr('UUID')); Chats.scrollToBottom(modal.find('#chat-content')); } else { @@ -114,6 +112,10 @@ define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, var modal = module.getModal(withUid); modal.find('.user-typing').addClass('hide'); }); + + socket.on('user.isOnline', function(err, data) { + updateStatus(data.status); + }); }; module.bringModalToTop = function(chatModal) { @@ -138,20 +140,16 @@ define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, function checkStatus(chatModal) { socket.emit('user.isOnline', chatModal.attr('touid'), function(err, data) { - translator.translate('[[global:' + data.status + ']]', function(translated) { - $('#chat-user-status').attr('class', 'fa fa-circle status ' + data.status) - .attr('title', translated) - .attr('data-original-title', translated); - }); + updateStatus(data.status); }); } - function checkOnlineStatus(chatModal) { - if(parseInt(chatModal.attr('intervalId'), 10) === 0) { - chatModal.attr('intervalId', setInterval(function() { - checkStatus(chatModal); - }, 1000)); - } + function updateStatus(status) { + translator.translate('[[global:' + status + ']]', function(translated) { + $('#chat-user-status').attr('class', 'fa fa-circle status ' + status) + .attr('title', translated) + .attr('data-original-title', translated); + }); } module.createModal = function(username, touid, callback) { @@ -221,7 +219,7 @@ define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, addSendHandler(chatModal); getChatMessages(chatModal, function() { - checkOnlineStatus(chatModal); + checkStatus(chatModal); }); chatModal.find('.user-typing .text').translateText('[[modules:chat.user_typing, ' + username + ']]'); @@ -259,7 +257,7 @@ define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, module.load = function(uuid) { var chatModal = $('div[UUID="'+uuid+'"]'); chatModal.removeClass('hide'); - checkOnlineStatus(chatModal); + checkStatus(chatModal); taskbar.updateActive(uuid); Chats.scrollToBottom(chatModal.find('#chat-content')); module.center(chatModal); diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index fac96c99a5..a9466e4569 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -18,7 +18,8 @@ var fs = require('fs'), plugins = require('../plugins'), languages = require('../languages'), image = require('../image'), - file = require('../file'); + file = require('../file'), + websockets = require('../socket.io'); function userNotFound(res) { if (res.locals.isAPI) { @@ -116,6 +117,7 @@ function getUserDataByUserSlug(userslug, callerUID, callback) { userData.disableSignatures = meta.config.disableSignatures !== undefined && parseInt(meta.config.disableSignatures, 10) === 1; userData['email:confirmed'] = !!parseInt(userData['email:confirmed'], 10); userData.profile_links = results.profile_links; + userData.status = !websockets.isUserOnline(userData.uid) ? 'offline' : userData.status; userData.followingCount = results.followStats.followingCount; userData.followerCount = results.followStats.followerCount; diff --git a/src/posts.js b/src/posts.js index 7d75869a45..10d299b4b3 100644 --- a/src/posts.js +++ b/src/posts.js @@ -21,7 +21,8 @@ var async = require('async'), categories = require('./categories'), plugins = require('./plugins'), meta = require('./meta'), - emitter = require('./emitter'); + emitter = require('./emitter'), + websockets = require('./socket.io'); (function(Posts) { require('./posts/delete')(Posts); @@ -227,7 +228,10 @@ var async = require('async'), groups.getUserGroups(uids, next); }, userData: function(next) { - user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'reputation', 'postcount', 'picture', 'signature', 'banned'], next); + user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'reputation', 'postcount', 'picture', 'signature', 'banned', 'status'], next); + }, + online: function(next) { + websockets.isUsersOnline(uids, next); } }, function(err, results) { if (err) { @@ -237,6 +241,7 @@ var async = require('async'), var userData = results.userData; for(var i=0; i 0; } +Sockets.isUsersOnline = function(uids, callback) { + var sockets = io.sockets.clients(); + + if(!Array.isArray(sockets) || !sockets.length) { + return callback(null, []); + } + + sockets = sockets.map(function(s) { + return s.uid; + }); + + callback(null, uids.map(function(uid) { + return sockets.indexOf(parseInt(uid, 10)) !== -1; + })); +}; + Sockets.updateRoomBrowsingText = updateRoomBrowsingText; function updateRoomBrowsingText(roomName) { diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 7a825dccd0..94f2c1f338 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -39,7 +39,8 @@ SocketPosts.reply = function(socket, data, callback) { websockets.server.sockets.emit('event:new_post', { posts: [postData], privileges: privileges, - 'reputation:disabled': parseInt(meta.config['reputation:disabled'], 10) === 1 + 'reputation:disabled': parseInt(meta.config['reputation:disabled'], 10) === 1, + 'downvote:disabled': parseInt(meta.config['downvote:disabled'], 10) === 1, }); module.parent.exports.emitTopicPostStats(); diff --git a/src/socket.io/user.js b/src/socket.io/user.js index d1e743d901..fa1a063fc7 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -264,26 +264,6 @@ SocketUser.setTopicSort = function(socket, sort, callback) { } }; -SocketUser.getOnlineUsers = function(socket, uids, callback) { - var returnData = {}; - if (!uids) { - return callback(new Error('[[error:invalid-data]]')); - } - - user.isOnline(uids, function(err, userData) { - if (err) { - return callback(err); - } - - userData.forEach(function(user) { - if (user) { - returnData[user.uid] = user; - } - }); - callback(null, returnData); - }); -}; - SocketUser.getOnlineAnonCount = function(socket, data, callback) { callback(null, module.parent.exports.getOnlineAnonCount()); };