From a613bde1f49d97a339f8b436337f59c3dd147d60 Mon Sep 17 00:00:00 2001 From: Hyleus Date: Wed, 27 Dec 2017 23:01:40 +0100 Subject: [PATCH 1/4] Use a since parameter for limiting shout messages --- app/Http/Controllers/ShoutboxController.php | 12 ++++++++---- routes/web.php | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/ShoutboxController.php b/app/Http/Controllers/ShoutboxController.php index 2fe9288250..516fdf9aea 100755 --- a/app/Http/Controllers/ShoutboxController.php +++ b/app/Http/Controllers/ShoutboxController.php @@ -103,13 +103,17 @@ public function send() * * */ - public function fetch() + public function fetch($since = null) { + $since = $since ?? 0; if (Request::ajax()) { - $getData = Cache::remember('shoutbox_messages', 1440, function () { + $timestamp = time(); + $getData = Cache::remember('shoutbox_messages', 1440, function () use ($since) { return Shoutbox::orderBy('created_at', 'desc')->take(50)->get(); }); - $getData = $getData->reverse(); + $getData = $getData->reverse()->filter(function ($value, $key) use ($since) { + return strtotime($value->created_at) > $since; + }); $data = []; $flag = false; foreach ($getData as $messages) { @@ -156,7 +160,7 @@ public function fetch() ' . ($flag ? $delete : "") . '

'; } - return Response::json(['success' => true, 'data' => $data]); + return Response::json(['success' => true, 'data' => $data, 'timestamp' => $timestamp]); } } diff --git a/routes/web.php b/routes/web.php index bb5c95b11b..41082cc700 100755 --- a/routes/web.php +++ b/routes/web.php @@ -253,7 +253,7 @@ */ Route::group(['prefix' => 'shoutbox', 'middleware' => 'auth'], function () { Route::get('/', 'HomeController@home')->name('shoutbox-home'); - Route::get('/messages', 'ShoutboxController@fetch')->name('shoutbox-fetch'); + Route::get('/messages/{since?}', 'ShoutboxController@fetch')->name('shoutbox-fetch'); Route::post('/send', 'ShoutboxController@send')->name('shoutbox-send'); Route::get('/delete/{id}', 'ShoutboxController@deleteShout')->name('shout-delete'); }); From 29805cd9fa87a55a91e42a1e6c02257eeacf4651 Mon Sep 17 00:00:00 2001 From: Hyleus Date: Wed, 27 Dec 2017 23:03:51 +0100 Subject: [PATCH 2/4] Fix the shoutbox update function --- public/js/shout.js | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/public/js/shout.js b/public/js/shout.js index a9ae55746d..47be524a84 100644 --- a/public/js/shout.js +++ b/public/js/shout.js @@ -1,5 +1,6 @@ var scollBox = $('.shoutbox'); var height = 0; +var since = 0; $("ul li").each(function() { height += $(this).outerHeight(true); // to include margins }); @@ -18,13 +19,22 @@ $.ajaxSetup({ window.setInterval(function() { $('.chat-messages .list-group'); $.ajax({ - url: "shoutbox/messages", - type: 'get', - data: load_data, - dataType: 'json', - success: function(data) { - $('.chat-messages .list-group').html(data.data); + url: "shoutbox/messages/" + parseInt(since), + type: 'get', + data: load_data, + dataType: 'json', + success: function(data) { + if (since === 0) { + since = data.timestamp; + } else { + since = data.timestamp; + let messages = $('.chat-messages .list-group'); + data.data.forEach(function(h) { + let message = $(h); + messages.append(message); + }); } + } }); }, 3000); @@ -40,7 +50,6 @@ $("#chat-message").keypress(function(evt) { data: post_data, dataType: 'json', success: function(data) { - $(data.data).hide().appendTo('.chat-messages .list-group').fadeIn(); $('#chat-error').addClass('hidden'); $('#chat-message').removeClass('invalid'); $('#chat-message').val(''); From a12ff3510fab4f8978155ead25ad794fe29316b4 Mon Sep 17 00:00:00 2001 From: Hyleus Date: Thu, 28 Dec 2017 15:01:54 +0100 Subject: [PATCH 3/4] Use IDs instead of time for getting new messages --- app/Http/Controllers/ShoutboxController.php | 23 ++++++++++++++------- public/js/shout.js | 10 ++++----- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/ShoutboxController.php b/app/Http/Controllers/ShoutboxController.php index 516fdf9aea..8d38e48212 100755 --- a/app/Http/Controllers/ShoutboxController.php +++ b/app/Http/Controllers/ShoutboxController.php @@ -103,17 +103,24 @@ public function send() * * */ - public function fetch($since = null) + public function fetch($after = null) { - $since = $since ?? 0; if (Request::ajax()) { - $timestamp = time(); - $getData = Cache::remember('shoutbox_messages', 1440, function () use ($since) { + $getData = Cache::remember('shoutbox_messages', 1440, function () { return Shoutbox::orderBy('created_at', 'desc')->take(50)->get(); }); - $getData = $getData->reverse()->filter(function ($value, $key) use ($since) { - return strtotime($value->created_at) > $since; - }); + + $getData = $getData->reverse(); + $next_batch = null; + if ($getData->count() !== 0) { + $next_batch = $getData->last()->id; + } + if ($after !== null) { + $getData = $getData->filter(function ($value, $key) use ($after) { + return $value->id > $after; + }); + } + $data = []; $flag = false; foreach ($getData as $messages) { @@ -160,7 +167,7 @@ public function fetch($since = null) ' . ($flag ? $delete : "") . '

'; } - return Response::json(['success' => true, 'data' => $data, 'timestamp' => $timestamp]); + return Response::json(['success' => true, 'data' => $data, 'next_batch' => $next_batch]); } } diff --git a/public/js/shout.js b/public/js/shout.js index 47be524a84..256de91b0b 100644 --- a/public/js/shout.js +++ b/public/js/shout.js @@ -1,6 +1,6 @@ var scollBox = $('.shoutbox'); var height = 0; -var since = 0; +var next_batch = null; $("ul li").each(function() { height += $(this).outerHeight(true); // to include margins }); @@ -19,15 +19,15 @@ $.ajaxSetup({ window.setInterval(function() { $('.chat-messages .list-group'); $.ajax({ - url: "shoutbox/messages/" + parseInt(since), + url: "shoutbox/messages/" + parseInt(next_batch), type: 'get', data: load_data, dataType: 'json', success: function(data) { - if (since === 0) { - since = data.timestamp; + if (next_batch === null) { + next_batch = data.next_batch; } else { - since = data.timestamp; + next_batch = data.next_batch; let messages = $('.chat-messages .list-group'); data.data.forEach(function(h) { let message = $(h); From b68afcb015d652d7053b1cb81299ce0fb9ee62d5 Mon Sep 17 00:00:00 2001 From: Hyleus Date: Thu, 28 Dec 2017 16:15:30 +0100 Subject: [PATCH 4/4] Rename parameter for messages route --- routes/web.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/web.php b/routes/web.php index f5319f6e6c..7166c3f1ea 100755 --- a/routes/web.php +++ b/routes/web.php @@ -258,7 +258,7 @@ */ Route::group(['prefix' => 'shoutbox', 'middleware' => 'auth'], function () { Route::get('/', 'HomeController@home')->name('shoutbox-home'); - Route::get('/messages/{since?}', 'ShoutboxController@fetch')->name('shoutbox-fetch'); + Route::get('/messages/{after?}', 'ShoutboxController@fetch')->name('shoutbox-fetch'); Route::post('/send', 'ShoutboxController@send')->name('shoutbox-send'); Route::get('/delete/{id}', 'ShoutboxController@deleteShout')->name('shout-delete'); });