From be86c74c912d12b95cf754873b2b9166efaf8d00 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 4 Nov 2015 12:52:55 -0500 Subject: [PATCH 01/12] disabled browsing users and global rooms syncing --- src/socket.io/index.js | 8 ++++++++ src/socket.io/meta.js | 20 ++++++++++---------- src/socket.io/rooms.js | 4 ++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index fd3ab9e995..6201ec3297 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -263,6 +263,14 @@ Sockets.isUsersOnline = function(uids, callback) { }; Sockets.getUsersInRoom = function (uid, roomName, start, stop, callback) { + callback(null, { + users: [], + room: roomName, + total: 0, + hidden: 0 + }); + return; + if (!roomName) { return; } diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js index c304833ef5..a77d893d32 100644 --- a/src/socket.io/meta.js +++ b/src/socket.io/meta.js @@ -52,14 +52,14 @@ SocketMeta.rooms.enter = function(socket, data, callback) { if (data.enter) { rooms.enter(socket, data.enter); socket.currentRoom = data.enter; - if (data.enter.indexOf('topic') !== -1) { - data.uid = socket.uid; - data.picture = validator.escape(data.picture); - data.username = validator.escape(data.username); - data.userslug = validator.escape(data.userslug); + // if (data.enter.indexOf('topic') !== -1) { + // data.uid = socket.uid; + // data.picture = validator.escape(data.picture); + // data.username = validator.escape(data.username); + // data.userslug = validator.escape(data.userslug); - websockets.in(data.enter).emit('event:user_enter', data); - } + // websockets.in(data.enter).emit('event:user_enter', data); + // } } callback(); }; @@ -75,9 +75,9 @@ SocketMeta.rooms.leaveCurrent = function(socket, data, callback) { function leaveCurrentRoom(socket) { if (socket.currentRoom) { rooms.leave(socket, socket.currentRoom); - if (socket.currentRoom.indexOf('topic') !== -1) { - websockets.in(socket.currentRoom).emit('event:user_leave', socket.uid); - } + // if (socket.currentRoom.indexOf('topic') !== -1) { + // websockets.in(socket.currentRoom).emit('event:user_leave', socket.uid); + // } socket.currentRoom = ''; } } diff --git a/src/socket.io/rooms.js b/src/socket.io/rooms.js index 615d650cd6..198288c3a9 100644 --- a/src/socket.io/rooms.js +++ b/src/socket.io/rooms.js @@ -19,12 +19,12 @@ var roomClients = {}; rooms.enter = function(socket, room) { socket.join(room); - pubsub.publish('socket:join', {id: socket.id, room: 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}); + //pubsub.publish('socket:leave', {id: socket.id, room: room}); }; rooms.leaveAll = function(socket, roomsToLeave) { From 0199ed27a6372b2497cb0affc42b06a449321be8 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 4 Nov 2015 13:02:19 -0500 Subject: [PATCH 02/12] disable user_leave for topic --- src/socket.io/index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 6201ec3297..17d46a5303 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -90,11 +90,11 @@ function onDisconnect(socket, data) { } // see https://github.com/Automattic/socket.io/issues/1814 - data.rooms.forEach(function(roomName) { - if (roomName.startsWith('topic')) { - io.in(roomName).emit('event:user_leave', socket.uid); - } - }); + // data.rooms.forEach(function(roomName) { + // if (roomName.startsWith('topic')) { + // io.in(roomName).emit('event:user_leave', socket.uid); + // } + // }); } rooms.leaveAll(socket, data.rooms); } From 5879185ebc079536ddeef10aca18c2ca168e59fe Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 4 Nov 2015 17:43:43 -0500 Subject: [PATCH 03/12] single proc stats --- public/src/admin/general/dashboard.js | 4 +- src/analytics.js | 7 +-- src/socket.io/admin.js | 1 + src/socket.io/admin/rooms.js | 73 +++++++++++++++++++++++++++ src/socket.io/index.js | 27 ++++++---- src/socket.io/meta.js | 56 -------------------- 6 files changed, 97 insertions(+), 71 deletions(-) create mode 100644 src/socket.io/admin/rooms.js diff --git a/public/src/admin/general/dashboard.js b/public/src/admin/general/dashboard.js index cba6c3c7df..62280f2a79 100644 --- a/public/src/admin/general/dashboard.js +++ b/public/src/admin/general/dashboard.js @@ -22,7 +22,7 @@ define('admin/general/dashboard', ['semver'], function(semver) { Admin.init = function() { app.enterRoom('admin'); - socket.emit('meta.rooms.getAll', Admin.updateRoomUsage); + socket.emit('admin.rooms.getAll', Admin.updateRoomUsage); isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); @@ -439,7 +439,7 @@ define('admin/general/dashboard', ['semver'], function(semver) { intervals.rooms = setInterval(function() { if (app.isFocused && app.isConnected) { - socket.emit('meta.rooms.getAll', Admin.updateRoomUsage); + socket.emit('admin.rooms.getAll', Admin.updateRoomUsage); } }, realtime ? DEFAULTS.realtimeInterval : DEFAULTS.roomInterval); diff --git a/src/analytics.js b/src/analytics.js index 8ac91877c3..5d23937ad2 100644 --- a/src/analytics.js +++ b/src/analytics.js @@ -1,8 +1,7 @@ 'use strict'; -var cronJob = require('cron').CronJob, - db = require('./database'); - +var cronJob = require('cron').CronJob; +var db = require('./database'); (function(Analytics) { @@ -61,6 +60,8 @@ var cronJob = require('cron').CronJob, db.incrObjectFieldBy('global', 'uniqueIPCount', uniqueIPCount); uniqueIPCount = 0; } + + }; Analytics.getUnwrittenPageviews = function() { diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 9161eb819c..29a92dc274 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -28,6 +28,7 @@ var async = require('async'), tags: require('./admin/tags'), rewards: require('./admin/rewards'), navigation: require('./admin/navigation'), + rooms: require('./admin/rooms'), themes: {}, plugins: {}, widgets: {}, diff --git a/src/socket.io/admin/rooms.js b/src/socket.io/admin/rooms.js new file mode 100644 index 0000000000..51f55336a1 --- /dev/null +++ b/src/socket.io/admin/rooms.js @@ -0,0 +1,73 @@ +'use strict'; + + +var validator = require('validator'); +var topics = require('../../topics'); + +var SocketRooms = {}; + +SocketRooms.getAll = function(socket, data, callback) { + + var websockets = require('../index'); + var io = websockets.server; + if (!io) { + return; + } + + var roomClients = io.sockets.adapter.rooms; + var socketData = { + onlineGuestCount: websockets.getOnlineAnonCount(), + onlineRegisteredCount: websockets.getOnlineUserCount(), + socketCount: websockets.getSocketCount(), + users: { + categories: roomClients.categories ? Object.keys(roomClients.categories).length : 0, + recent: roomClients.recent_topics ? Object.keys(roomClients.recent_topics).length : 0, + unread: roomClients.unread_topics ? Object.keys(roomClients.unread_topics).length: 0, + popular: roomClients.popular_topics ? Object.keys(roomClients.popular_topics).length: 0, + topics: 0, + category: 0 + }, + topics: {} + }; + + var topTenTopics = [], + tid; + + for (var room in roomClients) { + if (roomClients.hasOwnProperty(room)) { + tid = room.match(/^topic_(\d+)/); + if (tid) { + var length = Object.keys(roomClients[room]).length; + socketData.users.topics += length; + + topTenTopics.push({tid: tid[1], count: length}); + } else if (room.match(/^category/)) { + socketData.users.category += Object.keys(roomClients[room]).length; + } + } + } + + topTenTopics = topTenTopics.sort(function(a, b) { + return b.count - a.count; + }).slice(0, 10); + + var topTenTids = topTenTopics.map(function(topic) { + return topic.tid; + }); + + topics.getTopicsFields(topTenTids, ['title'], function(err, titles) { + if (err) { + return callback(err); + } + topTenTopics.forEach(function(topic, index) { + socketData.topics[topic.tid] = { + value: topic.count || 0, + title: validator.escape(titles[index].title) + }; + }); + + callback(null, socketData); + }); +}; + +module.exports = SocketRooms; \ No newline at end of file diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 17d46a5303..a0f65f66cc 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -217,25 +217,32 @@ Sockets.in = function(room) { }; Sockets.getSocketCount = function() { - return rooms.socketCount(); + if (!io) { + return 0; + } + return io.sockets.sockets.length; }; Sockets.getUserSocketCount = function(uid) { - return rooms.clients('uid_' + uid).length; + if (!io) { + return 0; + } + return io.sockets.adapter.rooms['uid_' + uid] ? Object.keys(io.sockets.adapter.rooms['uid_' + uid]).length : 0; }; Sockets.getOnlineUserCount = function() { - var count = 0; - Object.keys(rooms.roomClients()).forEach(function(roomName) { - if (roomName.startsWith('uid_')) { - ++ count; - } - }); - return count; + if (!io) { + return 0; + } + + return io.sockets.adapter.rooms.online_users ? Object.keys(io.sockets.adapter.rooms.online_users).length : 0; }; Sockets.getOnlineAnonCount = function () { - return rooms.clients('online_guests').length; + if (!io) { + return 0; + } + return io.sockets.adapter.rooms.online_guests ? Object.keys(io.sockets.adapter.rooms.online_guests).length : 0; }; Sockets.reqFromSocket = function(socket) { diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js index a77d893d32..d35d4d01f2 100644 --- a/src/socket.io/meta.js +++ b/src/socket.io/meta.js @@ -82,62 +82,6 @@ function leaveCurrentRoom(socket) { } } -SocketMeta.rooms.getAll = function(socket, data, callback) { - var roomClients = rooms.roomClients(); - var socketData = { - onlineGuestCount: websockets.getOnlineAnonCount(), - onlineRegisteredCount: websockets.getOnlineUserCount(), - socketCount: websockets.getSocketCount(), - users: { - categories: roomClients.categories ? roomClients.categories.length : 0, - recent: roomClients.recent_topics ? roomClients.recent_topics.length : 0, - unread: roomClients.unread_topics ? roomClients.unread_topics.length: 0, - popular: roomClients.popular_topics ? roomClients.popular_topics.length: 0, - topics: 0, - category: 0 - }, - topics: {} - }; - var 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; - - topTenTopics.push({tid: tid[1], count: length}); - } else if (room.match(/^category/)) { - socketData.users.category += roomClients[room].length; - } - } - } - - topTenTopics = topTenTopics.sort(function(a, b) { - return b.count - a.count; - }).slice(0, 10); - - var topTenTids = topTenTopics.map(function(topic) { - return topic.tid; - }); - - topics.getTopicsFields(topTenTids, ['title'], function(err, titles) { - if (err) { - return callback(err); - } - topTenTopics.forEach(function(topic, index) { - socketData.topics[topic.tid] = { - value: topic.count || 0, - title: validator.escape(titles[index].title) - }; - }); - - callback(null, socketData); - }); - -}; module.exports = SocketMeta; From 1ecf27417a4516554b37f0006a90053ee77483d4 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 5 Nov 2015 11:53:17 -0500 Subject: [PATCH 04/12] removed commented out stuff removed topics.enter --- public/src/client/topic.js | 10 ----- src/controllers/topics.js | 12 ++++++ src/controllers/users.js | 78 ------------------------------------- src/routes/index.js | 1 - src/socket.io/categories.js | 5 --- src/socket.io/index.js | 69 ++------------------------------ src/socket.io/meta.js | 11 ------ src/socket.io/posts/edit.js | 7 ++-- src/socket.io/topics.js | 16 -------- src/topics/unread.js | 65 ++++++++++++++----------------- 10 files changed, 47 insertions(+), 227 deletions(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index c216943e32..adf4eb0d59 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -70,16 +70,6 @@ define('forum/topic', [ $(window).on('scroll', updateTopicTitle); - - if (app.user.uid) { - socket.emit('topics.enter', tid, function(err, data) { - if (err) { - return app.alertError(err.message); - } - browsing.onUpdateUsersInRoom(data); - }); - } - handleTopicSearch(); $(window).trigger('action:topic.loaded'); diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 6dbbb79ec5..ab946dab33 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -265,6 +265,18 @@ topicsController.get = function(req, res, callback) { topics.increaseViewCount(tid); + if (req.uid) { + topics.markAsRead([tid], req.uid, function(err, markedRead) { + if (err) { + return callback(err); + } + if (markedRead) { + topics.pushUnreadCount(req.uid); + topics.markTopicNotificationsRead(tid, req.uid); + } + }); + } + plugins.fireHook('filter:topic.build', {req: req, res: res, templateData: data}, function(err, data) { if (err) { return callback(err); diff --git a/src/controllers/users.js b/src/controllers/users.js index 0c8e03f2c0..0087232255 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -149,84 +149,6 @@ usersController.getUsersForSearch = function(req, res, next) { }); }; -usersController.getMap = function(req, res, next) { - var socketIO = require('../socket.io'); - var rooms = require('../socket.io/rooms'); - - var roomNames = ['user_list', 'categories', 'unread_topics', 'recent_topics', 'popular_topics', 'tags']; - var links = { - user_list: '/users', - categories: '/categories', - unread_topics: '/unread', - recent_topics: '/recent', - popular_topics: '/popular', - tags: '/tags' - }; - - var keys = Object.keys(rooms.roomClients()); - - keys = keys.filter(function(key) { - return key.startsWith('topic_') || key.startsWith('category_'); - }); - - roomNames = roomNames.concat(keys); - - async.map(roomNames, function(roomName, next) { - socketIO.getUsersInRoom(0, roomName, 0, 39, function(err, data) { - if (err) { - return next(err); - } - - if (roomName.startsWith('category_')) { - var cid = roomName.split('_')[1]; - categories.getCategoryFields(cid, ['slug', 'name'], function(err, categoryData) { - if (err) { - return next(err); - } - data.room = validator.escape(categoryData.name); - data.link = '/category/' + categoryData.slug; - data.core = false; - next(null, data); - }); - } else if (roomName.startsWith('topic_')) { - var tid = roomName.split('_')[1]; - topics.getTopicFields(tid, ['slug', 'title'], function(err, topicData) { - if (err) { - return next(err); - } - data.room = validator.escape(topicData.title); - data.link = '/topic/' + topicData.slug; - data.core = false; - next(null, data); - }); - } else { - data.core = true; - next(null, data); - } - }); - }, function(err, data) { - if (err) { - return next(err); - } - data.sort(function(a, b) { - return b.users.length - a.users.length; - }); - - data.forEach(function(room) { - if (!room.link) { - room.link = links[room.room]; - } - }); - - res.render('usersMap', { - rooms: data, - 'reputation:disabled': parseInt(meta.config['reputation:disabled'], 10) === 1, - title: '[[pages:users/map]]', - breadcrumbs: helpers.buildBreadcrumbs([{text: '[[global:users]]', url: '/users'}, {text: '[[global:map]]'}]) - }); - }); -}; - function render(req, res, data, next) { plugins.fireHook('filter:users.build', {req: req, res: res, templateData: data}, function(err, data) { if (err) { diff --git a/src/routes/index.js b/src/routes/index.js index f5f57f688b..0dfa0303ba 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -62,7 +62,6 @@ function userRoutes(app, middleware, controllers) { setupPageRoute(app, '/users/sort-posts', middleware, middlewares, controllers.users.getUsersSortedByPosts); setupPageRoute(app, '/users/sort-reputation', middleware, middlewares, controllers.users.getUsersSortedByReputation); setupPageRoute(app, '/users/search', middleware, middlewares, controllers.users.getUsersForSearch); - setupPageRoute(app, '/users/map', middleware, middlewares, controllers.users.getMap); } diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index d43d0c8171..967f51afd1 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -137,11 +137,6 @@ SocketCategories.getTopicCount = function(socket, cid, callback) { categories.getCategoryField(cid, 'topic_count', callback); }; -SocketCategories.getUsersInCategory = function(socket, cid, callback) { - var uids = websockets.getUidsInRoom('category_' + cid); - user.getUsersFields(uids, ['uid', 'userslug', 'username', 'picture'], callback); -}; - SocketCategories.getCategoriesByPrivilege = function(socket, privilege, callback) { categories.getCategoriesByPrivilege('categories:cid', socket.uid, privilege, callback); }; diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 6594e201c4..a4f2500d7a 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -86,13 +86,6 @@ function onDisconnect(socket, data) { if (socketCount <= 1) { socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: 'offline'}); } - - // see https://github.com/Automattic/socket.io/issues/1814 - // data.rooms.forEach(function(roomName) { - // if (roomName.startsWith('topic')) { - // io.in(roomName).emit('event:user_leave', socket.uid); - // } - // }); } rooms.leaveAll(socket, data.rooms); } @@ -264,6 +257,7 @@ Sockets.isUsersOnline = function(uids, callback) { }; Sockets.getUsersInRoom = function (uid, roomName, start, stop, callback) { + winston.warn('[deprecated] Sockets.getUsersInRoom') callback(null, { users: [], room: roomName, @@ -271,69 +265,12 @@ Sockets.getUsersInRoom = function (uid, roomName, start, stop, callback) { hidden: 0 }); return; - - if (!roomName) { - return; - } - - var uids = Sockets.getUidsInRoom(roomName); - var total = uids.length; - if (stop !== -1) { - uids = uids.slice(start, stop); - } - - if (uid && uids.indexOf(uid.toString()) === -1) { - uids = [uid].concat(uids); - } - - if (!uids.length) { - return callback(null, {users: [], total: 0 , room: roomName}); - } - user.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture', 'status'], function(err, users) { - if (err) { - return callback(err); - } - - users = users.filter(function(user) { - return user && user.status !== 'offline'; - }); - - callback(null, { - users: users, - room: roomName, - total: users.length ? total : 0, - hidden: Math.max(0, total - uids.length) - }); - }); }; Sockets.getUidsInRoom = function(roomName, callback) { + winston.warn('[deprecated] Sockets.getUidsInRoom') callback = callback || function() {}; - - var uids = []; - - var socketids = rooms.clients(roomName); - if (!Array.isArray(socketids) || !socketids.length) { - callback(null, []); - return []; - } - - for(var i=0; i Date: Thu, 5 Nov 2015 12:34:39 -0500 Subject: [PATCH 05/12] removed rooms.js removed browsing users, removed chat syncing across sockets use lastonline for online detection --- public/src/client/topic.js | 3 +- public/src/client/topic/browsing.js | 111 ------------------------ public/src/modules/chat.js | 57 ------------ src/controllers/accounts/helpers.js | 2 +- src/controllers/topics.js | 1 + src/messaging.js | 68 ++++++++------- src/meta/js.js | 1 - src/posts/user.js | 7 +- src/socket.io/index.js | 14 +-- src/socket.io/meta.js | 9 +- src/socket.io/modules.js | 32 ------- src/socket.io/rooms.js | 129 ---------------------------- src/socket.io/user/status.js | 9 +- src/topics/create.js | 8 +- src/user.js | 25 +++--- src/user/search.js | 21 +---- 16 files changed, 76 insertions(+), 421 deletions(-) delete mode 100644 public/src/client/topic/browsing.js delete mode 100644 src/socket.io/rooms.js diff --git a/public/src/client/topic.js b/public/src/client/topic.js index adf4eb0d59..c1c58f2862 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -8,12 +8,11 @@ define('forum/topic', [ 'forum/topic/threadTools', 'forum/topic/postTools', 'forum/topic/events', - 'forum/topic/browsing', 'forum/topic/posts', 'navigator', 'sort', 'components' -], function(infinitescroll, threadTools, postTools, events, browsing, posts, navigator, sort, components) { +], function(infinitescroll, threadTools, postTools, events, posts, navigator, sort, components) { var Topic = {}, currentUrl = ''; diff --git a/public/src/client/topic/browsing.js b/public/src/client/topic/browsing.js deleted file mode 100644 index c3dc3b6a97..0000000000 --- a/public/src/client/topic/browsing.js +++ /dev/null @@ -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' : - '
' + iconText + '
'; - - return $(''); - } - } - - 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; -}); \ No newline at end of file diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index bf9bc79b81..c721c508da 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -10,9 +10,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra var chatsToggleEl = components.get('chat/dropdown'), chatsListEl = components.get('chat/list'); - // Sync open chats between all user socket sessions - module.sync(); - chatsToggleEl.on('click', function() { if (chatsToggleEl.parent().hasClass('open')) { return; @@ -94,32 +91,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra 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) { var modal = $('.chat-modal[uuid="' + uuid + '"]'), touid = modal.attr('touid'); @@ -318,10 +289,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra state: '' }); - if (!data.silent) { - socket.emit('modules.chats.open', data); - } - $(window).trigger('action:chat.loaded', chatModal); if (typeof callback === 'function') { @@ -343,10 +310,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra taskbar.discard('chat', chatModal.attr('UUID')); Chats.notifyTyping(chatModal.attr('touid'), false); - if (!silent) { - socket.emit('modules.chats.close', chatModal.attr('touid')); - } - if (chatModal.attr('data-mobile')) { module.disableMobileBehaviour(chatModal); } @@ -423,27 +386,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra 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; }); diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index 96e4f7c235..b9aeaa0055 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -86,7 +86,7 @@ helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { userData['email:confirmed'] = !!parseInt(userData['email:confirmed'], 10); userData.profile_links = results.profile_links; 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.website = validator.escape(userData.website); userData.websiteLink = !userData.website.startsWith('http') ? 'http://' + userData.website : userData.website; diff --git a/src/controllers/topics.js b/src/controllers/topics.js index ab946dab33..f5fb015c15 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -125,6 +125,7 @@ topicsController.get = function(req, res, callback) { }); }, function (topicData, next) { + var breadcrumbs = [ { text: topicData.category.name, diff --git a/src/messaging.js b/src/messaging.js index 0631de61f8..e0a39eac59 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -266,7 +266,7 @@ var db = require('./database'), db.isSortedSetMembers('uid:' + uid + ':chats:unread', uids, next); }, users: function(next) { - user.getUsersFields(uids, ['uid', 'username', 'picture', 'status'] , next); + user.getUsersFields(uids, ['uid', 'username', 'picture', 'status', 'lastonline'] , next); }, teasers: function(next) { async.map(uids, function(fromuid, next) { @@ -288,11 +288,11 @@ var db = require('./database'), return callback(err); } - results.users.forEach(function(user, index) { - if (user && parseInt(user.uid, 10)) { - user.unread = results.unread[index]; - user.status = sockets.isUserOnline(user.uid) ? user.status : 'offline'; - user.teaser = results.teasers[index]; + results.users.forEach(function(userData, index) { + if (userData && parseInt(userData.uid, 10)) { + userData.unread = results.unread[index]; + userData.status = user.getStatus(userData); + userData.teaser = results.teasers[index]; } }); @@ -416,35 +416,37 @@ var db = require('./database'), }; function sendNotifications(fromuid, touid, messageObj, callback) { - if (sockets.isUserOnline(touid)) { - return callback(); - } - - 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.isOnline(touid, function(err, isOnline) { + if (err || isOnline) { + return callback(err); } - }); - 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) - }); - } + 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) { + 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) + }); + } + }); }); } diff --git a/src/meta/js.js b/src/meta/js.js index ec00f5fb18..75b82c856a 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -52,7 +52,6 @@ module.exports = function(Meta) { 'public/src/client/recent.js', 'public/src/client/unread.js', 'public/src/client/topic.js', - 'public/src/client/topic/browsing.js', 'public/src/client/topic/events.js', 'public/src/client/topic/flag.js', 'public/src/client/topic/fork.js', diff --git a/src/posts/user.js b/src/posts/user.js index a3ddb3bc12..b27e63517e 100644 --- a/src/posts/user.js +++ b/src/posts/user.js @@ -20,10 +20,7 @@ module.exports = function(Posts) { user.getMultipleUserSettings(uids, next); }, userData: function(next) { - user.getUsersFields(uids, ['uid', 'username', 'fullname', 'userslug', 'reputation', 'postcount', 'picture', 'signature', 'banned', 'status'], next); - }, - online: function(next) { - require('../socket.io').isUsersOnline(uids, next); + user.getUsersFields(uids, ['uid', 'username', 'fullname', 'userslug', 'reputation', 'postcount', 'picture', 'signature', 'banned', 'status', 'lastonline'], next); } }, function(err, results) { if (err) { @@ -47,7 +44,7 @@ module.exports = function(Posts) { 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) { diff --git a/src/socket.io/index.js b/src/socket.io/index.js index a4f2500d7a..e78b19a8a1 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -11,7 +11,6 @@ var SocketIO = require('socket.io'), user = require('../user'), logger = require('../logger'), ratelimit = require('../middleware/ratelimit'), - rooms = require('./rooms'), Sockets = {}, Namespaces = {}; @@ -63,8 +62,8 @@ function onConnection(socket) { function onConnect(socket) { if (socket.uid) { - rooms.enter(socket, 'uid_' + socket.uid); - rooms.enter(socket, 'online_users'); + socket.join('uid_' + socket.uid); + socket.join('online_users'); user.getUserFields(socket.uid, ['status'], function(err, userData) { if (err || !userData) { @@ -76,7 +75,7 @@ function onConnect(socket) { } }); } 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'}); } } - rooms.leaveAll(socket, data.rooms); } function onMessage(socket, payload) { @@ -249,11 +247,13 @@ Sockets.reqFromSocket = function(socket) { }; Sockets.isUserOnline = function(uid) { - return !!rooms.clients('uid_' + uid).length; + winston.warn('[deprecated] Sockets.isUserOnline') + return false; }; 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) { diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js index f57c679512..39603c8d0c 100644 --- a/src/socket.io/meta.js +++ b/src/socket.io/meta.js @@ -1,12 +1,9 @@ 'use strict'; -var validator = require('validator'), - - meta = require('../meta'), +var meta = require('../meta'), user = require('../user'), topics = require('../topics'), emitter = require('../emitter'), - rooms = require('./rooms'), websockets = require('./'), @@ -50,7 +47,7 @@ SocketMeta.rooms.enter = function(socket, data, callback) { leaveCurrentRoom(socket); if (data.enter) { - rooms.enter(socket, data.enter); + socket.join(data.enter); socket.currentRoom = data.enter; } callback(); @@ -66,7 +63,7 @@ SocketMeta.rooms.leaveCurrent = function(socket, data, callback) { function leaveCurrentRoom(socket) { if (socket.currentRoom) { - rooms.leave(socket, socket.currentRoom); + socket.leave(socket.currentRoom); socket.currentRoom = ''; } } diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index d7b2c7c03b..08b8a4a26a 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -7,7 +7,6 @@ var meta = require('../meta'), async = require('async'), server = require('./'), - rooms = require('./rooms'), SocketModules = { chats: {}, @@ -105,37 +104,6 @@ SocketModules.chats.getRecentChats = function(socket, data, 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 */ SocketModules.sounds.getSounds = function(socket, data, callback) { diff --git a/src/socket.io/rooms.js b/src/socket.io/rooms.js deleted file mode 100644 index 198288c3a9..0000000000 --- a/src/socket.io/rooms.js +++ /dev/null @@ -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; - diff --git a/src/socket.io/user/status.js b/src/socket.io/user/status.js index 56ea9d14f7..c911ecf588 100644 --- a/src/socket.io/user/status.js +++ b/src/socket.io/user/status.js @@ -8,15 +8,12 @@ module.exports = function(SocketUser) { if (!socket.uid) { return callback('[[error:invalid-uid]]'); } - var online = websockets.isUserOnline(uid); - if (!online) { - return callback(null, 'offline'); - } - user.getUserField(uid, 'status', function(err, status) { + + user.getUserFields(uid, ['lastonline', 'status'], function(err, userData) { if (err) { return callback(err); } - status = status || 'online'; + var status = user.getStatus(userData); callback(null, status); }); }; diff --git a/src/topics/create.js b/src/topics/create.js index 6ccc06de12..828214df28 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -272,13 +272,13 @@ module.exports = function(Topics) { var tid = postData.tid; var uid = postData.uid; async.waterfall([ - function(next) { + function (next) { Topics.markAsUnreadForAll(tid, next); }, - function(next) { + function (next) { Topics.markAsRead([tid], uid, next); }, - function(next) { + function (markedRead, next) { async.parallel({ userInfo: function(next) { posts.getUserInfoForPosts([postData.uid], uid, next); @@ -294,7 +294,7 @@ module.exports = function(Topics) { } }, next); }, - function(results, next) { + function (results, next) { postData.user = results.userInfo[0]; postData.topic = results.topicInfo; diff --git a/src/user.js b/src/user.js index 49c4e06b54..65632217d2 100644 --- a/src/user.js +++ b/src/user.js @@ -1,12 +1,9 @@ 'use strict'; var async = require('async'), - nconf = require('nconf'), - gravatar = require('gravatar'), plugins = require('./plugins'), db = require('./database'), - meta = require('./meta'), topics = require('./topics'), privileges = require('./privileges'), utils = require('../public/src/utils'); @@ -91,7 +88,7 @@ var async = require('async'), }; 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) { if (err) { return callback(err); @@ -105,9 +102,6 @@ var async = require('async'), }, isAdmin: function(next) { User.isAdministrator(uids, next); - }, - isOnline: function(next) { - require('./socket.io').isUsersOnline(uids, next); } }, function(err, results) { if (err) { @@ -118,7 +112,7 @@ var async = require('async'), if (!user) { return; } - user.status = User.getStatus(user.status, results.isOnline[index]); + user.status = User.getStatus(user); user.joindateISO = utils.toISOString(user.joindate); user.administrator = results.isAdmin[index]; user.banned = parseInt(user.banned, 10) === 1; @@ -135,8 +129,19 @@ var async = require('async'), }); }; - User.getStatus = function(status, isOnline) { - return isOnline ? (status || 'online') : 'offline'; + User.getStatus = function(userData) { + 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) { diff --git a/src/user/search.js b/src/user/search.js index ae91ba1615..322c137738 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -98,29 +98,16 @@ module.exports = function(User) { function filterAndSortUids(uids, data, callback) { var sortBy = data.sortBy || 'joindate'; - var fields = ['uid', 'status', sortBy]; + var fields = ['uid', 'status', 'lastonline', sortBy]; - async.parallel({ - 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) { + User.getUsersFields(uids, fields, function(err, userData) { if (err) { return callback(err); } - var userData = results.userData; - if (data.onlineOnly) { - userData = userData.filter(function(user, index) { - return user && user.status !== 'offline' && results.isOnline[index]; + userData = userData.filter(function(user) { + return user && user.status !== 'offline' && (Date.now() - parseInt(user.lastonline, 10) < 300000); }); } From 7ed378b367556886ae3a96bbd819c1790933874e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 5 Nov 2015 12:43:05 -0500 Subject: [PATCH 06/12] removed override no longer needed --- src/socket.io/index.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index e78b19a8a1..7175e5a20a 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -45,12 +45,6 @@ function onConnection(socket) { onConnect(socket); - // see https://github.com/Automattic/socket.io/issues/1814 and - // http://stackoverflow.com/questions/25830415/get-the-list-of-rooms-the-client-is-currently-in-on-disconnect-event - socket.onclose = function(reason) { - Object.getPrototypeOf(this).onclose.call(this, {reason: reason, rooms: socket.rooms.slice()}); - }; - socket.on('disconnect', function(data) { onDisconnect(socket, data); }); @@ -79,7 +73,7 @@ function onConnect(socket) { } } -function onDisconnect(socket, data) { +function onDisconnect(socket) { if (socket.uid) { var socketCount = Sockets.getUserSocketCount(socket.uid); if (socketCount <= 1) { From 364260fa3795d696fb7fe20dc3feb011e7502245 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 5 Nov 2015 12:54:15 -0500 Subject: [PATCH 07/12] fix lastonline iso --- src/controllers/accounts/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index b9aeaa0055..d5a1eb013c 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -58,7 +58,7 @@ helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { var self = parseInt(callerUID, 10) === parseInt(userData.uid, 10); userData.joindate = utils.toISOString(userData.joindate); - userData.lastonline = userData.lastonline ? utils.toISOString(userData.lastonline) : userData.joindate; + userData.lastonlineISO = utils.toISOString(userData.lastonline || userData.joindate); userData.age = userData.birthday ? Math.floor((new Date().getTime() - new Date(userData.birthday).getTime()) / 31536000000) : ''; if (!(isAdmin || self || (userData.email && userSettings.showemail))) { From 3ca618795fb9ea1fd5ef01f738557d0905e555c8 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 5 Nov 2015 13:39:17 -0500 Subject: [PATCH 08/12] remove browsing --- public/src/client/topic/events.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 7e04a5ffae..8e520b4f3d 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -4,19 +4,15 @@ /* globals config, app, ajaxify, define, socket, templates, translator, utils */ define('forum/topic/events', [ - 'forum/topic/browsing', 'forum/topic/postTools', 'forum/topic/threadTools', 'forum/topic/posts', 'components' -], function(browsing, postTools, threadTools, posts, components) { +], function(postTools, threadTools, posts, components) { var Events = {}; var events = { - 'event:user_enter': browsing.onUserEnter, - 'event:user_leave': browsing.onUserLeave, - 'event:user_status_change': browsing.onUserStatusChange, 'event:voted': updatePostVotesAndUserReputation, 'event:favourited': updateFavouriteCount, From 9753a6d489a5a3d584226aac05e7371b9b316d3c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 5 Nov 2015 13:47:20 -0500 Subject: [PATCH 09/12] fix user status change in topics --- public/src/client/topic/events.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 8e520b4f3d..ba6313c4b4 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -13,6 +13,7 @@ define('forum/topic/events', [ var Events = {}; var events = { + 'event:user_status_change': onUserStatusChange, 'event:voted': updatePostVotesAndUserReputation, 'event:favourited': updateFavouriteCount, @@ -65,6 +66,10 @@ define('forum/topic/events', [ } }; + function onUserStatusChange(data) { + app.updateUserStatus($('[data-uid="' + data.uid + '"] [component="user/status"]'), data.status); + } + function updatePostVotesAndUserReputation(data) { var votes = components.get('post/vote-count', data.post.pid), reputationElements = $('.reputation[data-uid="' + data.post.uid + '"]'); From 277ee94f064711d7e6a9cd07f695df5c4a60fea5 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 5 Nov 2015 14:39:52 -0500 Subject: [PATCH 10/12] dont call meta.rooms.enter for guests --- public/src/app.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/public/src/app.js b/public/src/app.js index 03445d787f..a66f0c4151 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -130,11 +130,7 @@ app.cacheBuster = null; app.enterRoom = function (room, callback) { callback = callback || function() {}; - if (socket) { - if (app.currentRoom === room) { - return; - } - + if (socket && app.user.uid && app.currentRoom !== room) { socket.emit('meta.rooms.enter', { enter: room, username: app.user.username, @@ -148,6 +144,7 @@ app.cacheBuster = null; return app.alertError(err.message); } app.currentRoom = room; + callback(); }); } }; From 54901afe5e172dfd6480f35a2ad8307b84066fdf Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 5 Nov 2015 14:49:03 -0500 Subject: [PATCH 11/12] removed toggleNew --- public/src/modules/chat.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index c721c508da..b2613a2e8a 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -90,16 +90,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra var modal = module.getModal(data.uid); app.updateUserStatus(modal.find('[component="user/status"]'), data.status); }); - - $(window).on('action:taskbar.toggleNew', function(ev, uuid) { - var modal = $('.chat-modal[uuid="' + uuid + '"]'), - touid = modal.attr('touid'); - - socket.emit('modules.chats.toggleNew', { - uid: touid, - state: false - }); - }); }; module.loadChatsDropdown = function(chatsListEl) { From 60e1831152c3c150ee8fbc8a7c81ce3210487b9b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 5 Nov 2015 15:10:19 -0500 Subject: [PATCH 12/12] check online from users:online zset --- src/database/mongo/sorted.js | 2 +- src/user.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 6266c2117b..ba392fa42a 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -321,7 +321,7 @@ module.exports = function(db, module) { return callback(); } value = helpers.valueToString(value); - db.collection('objects').findOne({_key:key, value: value}, {fields:{_id: 0, score: 1}}, function(err, result) { + db.collection('objects').findOne({_key: key, value: value}, {fields:{_id: 0, score: 1}}, function(err, result) { callback(err, result ? result.score : null); }); }; diff --git a/src/user.js b/src/user.js index 65632217d2..6ae1ee5614 100644 --- a/src/user.js +++ b/src/user.js @@ -135,7 +135,7 @@ var async = require('async'), }; User.isOnline = function(uid, callback) { - User.getUserField(uid, 'lastonline', function(err, lastonline) { + db.sortedSetScore('users:online', uid, function(err, lastonline) { if (err) { return callback(err); }