From b3d7ae1c861ad807abfd7392d8f8729c06ba728d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 1 Mar 2014 15:46:13 -0500 Subject: [PATCH 1/2] showing who is replying in the active users block --- public/src/forum/topic.js | 11 ++++++++++- public/src/modules/composer.js | 19 +++++++++++++++++++ src/socket.io/modules.js | 25 ++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index 9a86aaec32..4ebfb4aae7 100644 --- a/public/src/forum/topic.js +++ b/public/src/forum/topic.js @@ -613,7 +613,8 @@ define(['composer', 'forum/pagination'], function(composer, pagination) { 'event:topic_deleted', 'event:topic_restored', 'event:topic:locked', 'event:topic_unlocked', 'event:topic_pinned', 'event:topic_unpinned', 'event:topic_moved', 'event:post_edited', 'event:post_deleted', 'event:post_restored', - 'posts.favourite', 'user.isOnline', 'posts.upvote', 'posts.downvote' + 'posts.favourite', 'user.isOnline', 'posts.upvote', 'posts.downvote', + 'event:topic.replyStart', 'event:topic.replyStop' ]); socket.on('get_users_in_room', function(data) { @@ -876,6 +877,14 @@ define(['composer', 'forum/pagination'], function(composer, pagination) { } }); + socket.on('event:topic.replyStart', function(uid) { + $('.thread_active_users [data-uid="' + uid + '"]').addClass('replying'); + }); + + socket.on('event:topic.replyStop', function(uid) { + $('.thread_active_users [data-uid="' + uid + '"]').removeClass('replying'); + }); + function adjust_rep(value, pid, uid) { var votes = $('li[data-pid="' + pid + '"] .votes'), reputationElements = $('.reputation[data-uid="' + uid + '"]'), diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 55a0b1450b..0c4f3193ad 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -4,6 +4,15 @@ define(['taskbar'], function(taskbar) { posts: {} }; + function initialise() { + socket.on('event:composer.ping', function(post_uuid) { + if (composer.active !== post_uuid) { + socket.emit('modules.composer.pingInactive', post_uuid); + } + }); + }; + initialise(); + function maybeParse(response) { if (typeof response == 'string') { try { @@ -380,6 +389,16 @@ define(['taskbar'], function(taskbar) { } else { composer.createNewComposer(post_uuid); } + + var tid = templates.get('topic_id'); + if (tid) { + // Replying to a topic + socket.emit('modules.composer.register', { + uuid: post_uuid, + tid: templates.get('topic_id'), + uid: app.uid + }); + } }; composer.createNewComposer = function(post_uuid) { diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index a9d9d659be..817cca5096 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -18,7 +18,9 @@ var posts = require('../posts'), /* Posts Composer */ -SocketModules.composer = {}; +SocketModules.composer = { + replyHash: {} +}; SocketModules.composer.push = function(socket, pid, callback) { if (socket.uid || parseInt(meta.config.allowGuestPosting, 10)) { @@ -74,6 +76,27 @@ SocketModules.composer.renderHelp = function(socket, data, callback) { plugins.fireHook('filter:composer.help', '', callback); }; +SocketModules.composer.register = function(socket, data) { + server.in('topic_' + data.tid).emit('event:topic.replyStart', data.uid); + + data.socket = socket; + data.timer = setInterval(function() { + // Ping the socket to see if the composer is still active + socket.emit('event:composer.ping', data.uuid); + }, 1000*10); // Every 10 seconds... + + SocketModules.composer.replyHash[data.uuid] = data; +}; + +SocketModules.composer.pingInactive = function(socket, uuid) { + var data = SocketModules.composer.replyHash[uuid]; + if (SocketModules.composer.replyHash[uuid]) { + server.in('topic_' + data.tid).emit('event:topic.replyStop', data.uid); + clearInterval(data.timer); + delete SocketModules.composer.replyHash[uuid]; + } +}; + /* Chat */ SocketModules.chats = {}; From 7ef84e0daa46c8306ab2c08fb0fc0339ebc46bc3 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 1 Mar 2014 16:53:41 -0500 Subject: [PATCH 2/2] switched to 'ping active' system --- public/src/modules/composer.js | 6 ++++-- src/socket.io/modules.js | 31 +++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 0c4f3193ad..8b30a5aacf 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -6,8 +6,8 @@ define(['taskbar'], function(taskbar) { function initialise() { socket.on('event:composer.ping', function(post_uuid) { - if (composer.active !== post_uuid) { - socket.emit('modules.composer.pingInactive', post_uuid); + if (composer.active === post_uuid) { + socket.emit('modules.composer.pingActive', post_uuid); } }); }; @@ -832,6 +832,8 @@ define(['taskbar'], function(taskbar) { taskbar.discard('composer', post_uuid); $('body').css({'margin-bottom': 0}); $('.action-bar button').removeAttr('disabled'); + + socket.emit('modules.composer.unregister', post_uuid); } }; diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index 817cca5096..289a7fa12b 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -77,23 +77,38 @@ SocketModules.composer.renderHelp = function(socket, data, callback) { }; SocketModules.composer.register = function(socket, data) { + var now = Date.now(); server.in('topic_' + data.tid).emit('event:topic.replyStart', data.uid); data.socket = socket; + data.lastPing = now; + data.lastAnswer = now; data.timer = setInterval(function() { - // Ping the socket to see if the composer is still active - socket.emit('event:composer.ping', data.uuid); - }, 1000*10); // Every 10 seconds... + if (data.lastPing === data.lastAnswer) { + // Ping the socket to see if the composer is still active + data.lastPing = Date.now(); + socket.emit('event:composer.ping', data.uuid); + } else { + server.in('topic_' + data.tid).emit('event:topic.replyStop', data.uid); + delete SocketModules.composer.replyHash[data.uuid]; + } + }, 1000*5); // Every 5 seconds... SocketModules.composer.replyHash[data.uuid] = data; }; -SocketModules.composer.pingInactive = function(socket, uuid) { +SocketModules.composer.unregister = function(socket, uuid) { + var replyObj = SocketModules.composer.replyHash[uuid]; + if (uuid && replyObj) { + server.in('topic_' + replyObj.tid).emit('event:topic.replyStop', replyObj.uid); + delete SocketModules.composer.replyHash[replyObj.uuid]; + } +}; + +SocketModules.composer.pingActive = function(socket, uuid) { var data = SocketModules.composer.replyHash[uuid]; - if (SocketModules.composer.replyHash[uuid]) { - server.in('topic_' + data.tid).emit('event:topic.replyStop', data.uid); - clearInterval(data.timer); - delete SocketModules.composer.replyHash[uuid]; + if (data) { + data.lastAnswer = data.lastPing; } };