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/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();
});
}
};
diff --git a/public/src/client/topic.js b/public/src/client/topic.js
index c216943e32..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 = '';
@@ -70,16 +69,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/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/client/topic/events.js b/public/src/client/topic/events.js
index 7e04a5ffae..ba6313c4b4 100644
--- a/public/src/client/topic/events.js
+++ b/public/src/client/topic/events.js
@@ -4,19 +4,16 @@
/* 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:user_status_change': onUserStatusChange,
'event:voted': updatePostVotesAndUserReputation,
'event:favourited': updateFavouriteCount,
@@ -69,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 + '"]');
diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js
index bf9bc79b81..b2613a2e8a 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;
@@ -93,42 +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);
});
-
- 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');
-
- socket.emit('modules.chats.toggleNew', {
- uid: touid,
- state: false
- });
- });
};
module.loadChatsDropdown = function(chatsListEl) {
@@ -318,10 +279,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 +300,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 +376,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/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/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js
index 96e4f7c235..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))) {
@@ -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 6dbbb79ec5..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,
@@ -265,6 +266,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/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/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/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/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/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 6490d3e4cc..7175e5a20a 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 = {};
@@ -46,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);
});
@@ -63,8 +56,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,25 +69,17 @@ function onConnect(socket) {
}
});
} else {
- rooms.enter(socket, 'online_guests');
+ socket.join('online_guests');
}
}
-function onDisconnect(socket, data) {
+function onDisconnect(socket) {
if (socket.uid) {
var socketCount = Sockets.getUserSocketCount(socket.uid);
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);
}
function onMessage(socket, payload) {
@@ -211,25 +196,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) {
@@ -249,76 +241,30 @@ 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) {
- 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)
- });
+ winston.warn('[deprecated] Sockets.getUsersInRoom')
+ callback(null, {
+ users: [],
+ room: roomName,
+ total: 0,
+ hidden: 0
});
+ return;
};
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