diff --git a/public/src/app.js b/public/src/app.js index 260d22734c..4fe7871ea7 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -89,6 +89,7 @@ var socket, socket.on('event:connect', function (data) { app.username = data.username; app.userslug = data.userslug; + app.picture = data.picture; app.uid = data.uid; app.isAdmin = data.isAdmin; @@ -142,8 +143,6 @@ var socket, }, 1000); }); - app.enterRoom('global'); - app.cacheBuster = config['cache-buster']; bootbox.setDefaults({ @@ -205,8 +204,11 @@ var socket, } socket.emit('meta.rooms.enter', { - 'enter': room, - 'leave': app.currentRoom + enter: room, + leave: app.currentRoom, + username: app.username, + userslug: app.userslug, + picture: app.picture }); app.currentRoom = room; diff --git a/public/src/forum/topic/browsing.js b/public/src/forum/topic/browsing.js index 5d1833bdd0..53c9ae3046 100644 --- a/public/src/forum/topic/browsing.js +++ b/public/src/forum/topic/browsing.js @@ -10,75 +10,35 @@ define('forum/topic/browsing', function() { Browsing.onUpdateUsersInRoom = function(data) { if(data && data.room.indexOf('topic_' + ajaxify.variables.get('topic_id')) !== -1) { - var activeEl = $('.thread_active_users'); - - // remove users that are no longer here - activeEl.find('a').each(function(index, element) { - if(element) { - var uid = $(element).attr('data-uid'); - var absent = data.users.every(function(user) { - return parseInt(user.uid, 10) !== parseInt(uid, 10); - }); - - if (absent) { - $(element).parent().remove(); - } - } - }); - - var i=0, icon; - // add self - for(i = 0; i 8) { - break; - } - } - - activeEl.find('a[data-uid] img').tooltip({ - placement: 'top' - }); - - var remainingUsers = data.users.length - 9; - remainingUsers = remainingUsers < 0 ? 0 : remainingUsers; - var anonymousCount = parseInt(data.anonymousCount, 10); - activeEl.find('.anonymous-box').remove(); - if(anonymousCount || remainingUsers) { - - var anonLink = $('
'); - activeEl.append(anonLink); - - var title = ''; - if(remainingUsers && anonymousCount) { - title = '[[topic:more_users_and_guests, ' + remainingUsers + ', ' + anonymousCount + ']]'; - } else if(remainingUsers) { - title = '[[topic:more_users, ' + remainingUsers + ']]'; - } else { - title = '[[topic:more_guests, ' + anonymousCount + ']]'; - } - - translator.translate(title, function(translated) { - $('.anonymous-box').tooltip({ - placement: 'top', - title: translated - }); - }); - } - getReplyingUsers(); } }; + Browsing.onUserEnter = function(data) { + var activeEl = $('.thread_active_users'); + var user = activeEl.find('a[data-uid="' + data.uid + '"]'); + if (!user.length) { + addUserIcon(data); + } else { + user.attr('data-count', parseInt(user.attr('data-count'), 10) + 1); + } + }; + + Browsing.onUserLeave = function(uid) { + var activeEl = $('.thread_active_users'); + var user = activeEl.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.remove(); + } + } + }; + Browsing.onUserOnline = function(err, data) { updateOnlineIcon($('.username-field[data-username="' + data.username + '"]'), data); @@ -100,17 +60,26 @@ define('forum/topic/browsing', function() { if (user.length && !data.online) { user.parent().remove(); } else if(!user.length && data.online && data.rooms.indexOf('topic_' + ajaxify.variables.get('topic_id')) !== -1) { - user = createUserIcon(data.uid, data.picture, data.userslug, data.username); - activeEl.append(user); - activeEl.find('a[data-uid] img').tooltip({ - placement: 'top' - }); + addUserIcon(user); } } + function addUserIcon(user) { + if (!user.userslug) { + return; + } + var activeEl = $('.thread_active_users'); + var userEl = createUserIcon(user.uid, user.picture, user.userslug, user.username); + activeEl.append(userEl); + activeEl.find('a[data-uid] img').tooltip({ + placement: 'top' + }); + } + function createUserIcon(uid, picture, userslug, username) { if(!$('.thread_active_users').find('[data-uid="' + uid + '"]').length) { - return $('
'); + console.log('are u fucking kidming', arguments); + return $('
'); } } diff --git a/public/src/forum/topic/events.js b/public/src/forum/topic/events.js index e1d7becc8c..a84d7ad1d6 100644 --- a/public/src/forum/topic/events.js +++ b/public/src/forum/topic/events.js @@ -9,6 +9,8 @@ define('forum/topic/events', ['forum/topic/browsing', 'forum/topic/postTools', ' var events = { 'event:update_users_in_room': browsing.onUpdateUsersInRoom, + 'event:user_enter': browsing.onUserEnter, + 'event:user_leave': browsing.onUserLeave, 'user.isOnline': browsing.onUserOnline, 'event:voted': updatePostVotesAndUserReputation, 'event:favourited': updateFavouriteCount, diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 920d8e172a..a2191f34e9 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -162,16 +162,20 @@ Sockets.init = function(server) { async.parallel({ user: function(next) { - user.getUserFields(uid, ['username', 'userslug'], next); + user.getUserFields(uid, ['username', 'userslug', 'picture'], next); }, isAdmin: function(next) { user.isAdministrator(uid, next); } }, function(err, userData) { + if (err || !userData.user) { + return; + } socket.emit('event:connect', { status: 1, - username: userData.user ? userData.user.username : 'guest', - userslug: userData.user ? userData.user.userslug : '', + username: userData.user.username, + userslug: userData.user.userslug, + picture: userData.user.picture, isAdmin: userData.isAdmin, uid: uid }); @@ -208,7 +212,7 @@ Sockets.init = function(server) { for(var roomName in io.sockets.manager.roomClients[socket.id]) { if (roomName.indexOf('topic') !== -1) { - updateRoomBrowsingText(roomName.slice(1)); + io.sockets.in(roomName.slice(1)).emit('event:user_leave', socket.uid); } } }); @@ -368,15 +372,17 @@ Sockets.isUsersOnline = function(uids, callback) { }; Sockets.updateRoomBrowsingText = updateRoomBrowsingText; -function updateRoomBrowsingText(roomName) { +function updateRoomBrowsingText(roomName, selfUid) { if (!roomName) { return; } - var uids = Sockets.getUidsInRoom(roomName), - anonymousCount = Sockets.getAnonCountInRoom(roomName); - + var uids = Sockets.getUidsInRoom(roomName); + uids = uids.slice(0, 9); + if (selfUid) { + uids = [selfUid].concat(uids); + } user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture', 'status'], function(err, users) { if(!err) { users = users.filter(function(user) { @@ -385,7 +391,6 @@ function updateRoomBrowsingText(roomName) { io.sockets.in(roomName).emit('event:update_users_in_room', { users: users, - anonymousCount: anonymousCount, room: roomName }); } diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js index b6397d5fc3..af9e624442 100644 --- a/src/socket.io/meta.js +++ b/src/socket.io/meta.js @@ -62,24 +62,23 @@ SocketMeta.getUsageStats = function(socket, data, callback) { /* Rooms */ SocketMeta.rooms.enter = function(socket, data, callback) { - if(!data) { + if (!data) { return callback(new Error('[[error:invalid-data]]')); } if (data.leave) { socket.leave(data.leave); + if (socket.uid && data.leave.indexOf('topic') !== -1) { + websockets.in(data.leave).emit('event:user_leave', socket.uid); + } } if (data.enter) { socket.join(data.enter); - } - - if (data.leave && data.leave !== data.enter && data.leave.indexOf('topic') !== -1) { - module.parent.exports.updateRoomBrowsingText(data.leave); - } - - if (data.enter.indexOf('topic') !== -1) { - module.parent.exports.updateRoomBrowsingText(data.enter); + if (socket.uid && data.enter.indexOf('topic') !== -1) { + data.uid = socket.uid; + websockets.in(data.enter).emit('event:user_enter', data); + } } }; diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index 06e7526f89..143f5abb5c 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -64,6 +64,7 @@ SocketTopics.enter = function(socket, tid, callback) { SocketTopics.markAsRead(socket, tid); topics.markTopicNotificationsRead(tid, socket.uid); topics.increaseViewCount(tid); + websockets.updateRoomBrowsingText('topic_' + tid); }; SocketTopics.postcount = function(socket, tid, callback) {