diff --git a/boards/static/js/thread.js b/boards/static/js/thread.js --- a/boards/static/js/thread.js +++ b/boards/static/js/thread.js @@ -77,4 +77,5 @@ function addQuickReply(postId) { $(document).ready(function(){ addGalleryPanel(); + initAutoupdate(); }); diff --git a/boards/static/js/thread_update.js b/boards/static/js/thread_update.js --- a/boards/static/js/thread_update.js +++ b/boards/static/js/thread_update.js @@ -1,6 +1,17 @@ var THREAD_UPDATE_DELAY = 10000; var loading = false; +var lastUpdateTime = null; + +function blink(node) { + var blinkCount = 2; + var blinkDelay = 250; + + var nodeToAnimate = node; + for (var i = 0; i < blinkCount; i++) { + nodeToAnimate = nodeToAnimate.fadeOut(blinkDelay).fadeIn(blinkDelay); + } +} function updateThread() { if (loading) { @@ -13,9 +24,8 @@ function updateThread() { var lastPost = threadPosts.last(); var threadId = threadPosts.first().attr('id'); - var lastPostId = lastPost.attr('id'); - var diffUrl = '/api/diff_thread/' + threadId + '/' + lastPostId + '/'; + var diffUrl = '/api/diff_thread/' + threadId + '/' + lastUpdateTime + '/'; $.getJSON(diffUrl) .success(function(data) { var addedPosts = data.added; @@ -23,15 +33,31 @@ function updateThread() { for (var i = 0; i < addedPosts.length; i++) { var postText = addedPosts[i]; - var post = $(postText).hide(); - post.appendTo(lastPost.parent()).show('slow'); + var post = $(postText); + post.appendTo(lastPost.parent()); addRefLinkPreview(post[0]); lastPost = post; + blink(post); + } + // TODO Process updated and deleted posts + + lastUpdateTime = data.last_update; + loading = false; + }) + .error(function(data) { + // TODO Show error message that server is unavailable? + loading = false; }); } -setInterval(updateThread, THREAD_UPDATE_DELAY); +function initAutoupdate() { + loading = false; + + lastUpdateTime = $('.metapanel').attr('data-last-update'); + + setInterval(updateThread, THREAD_UPDATE_DELAY); +} diff --git a/boards/templates/boards/thread.html b/boards/templates/boards/thread.html --- a/boards/templates/boards/thread.html +++ b/boards/templates/boards/thread.html @@ -152,7 +152,7 @@ {% get_current_language as LANGUAGE_CODE %} - + {% cache 600 thread_meta posts.0.last_edit_time moderator LANGUAGE_CODE %} {{ posts.0.get_reply_count }} {% trans 'replies' %}, {{ posts.0.get_images_count }} {% trans 'images' %}. diff --git a/boards/urls.py b/boards/urls.py --- a/boards/urls.py +++ b/boards/urls.py @@ -53,6 +53,6 @@ urlpatterns = patterns('', # API url(r'^api/post/(?P\w+)/$', views.get_post, name="get_post"), - url(r'^api/diff_thread/(?P\w+)/(?P\w+)/$', + url(r'^api/diff_thread/(?P\w+)/(?P\w+)/$', views.api_get_threaddiff, name="get_thread_diff"), ) diff --git a/boards/views.py b/boards/views.py --- a/boards/views.py +++ b/boards/views.py @@ -1,6 +1,10 @@ import hashlib import json import string +import time + +from datetime import datetime + from django.core import serializers from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect @@ -211,6 +215,7 @@ def thread(request, post_id): context['bumplimit_progress'] = str( float(context['posts_left']) / neboard.settings.MAX_POSTS_PER_THREAD * 100) + context["last_update"] = int(time.time() * 1000) return render(request, 'boards/thread.html', context) @@ -409,14 +414,17 @@ def api_get_post(request, post_id): return HttpResponse(content=json) -def api_get_threaddiff(request, thread_id, last_post_id): +def api_get_threaddiff(request, thread_id, last_update_time): thread = get_object_or_404(Post, id=thread_id) - posts = Post.objects.filter(thread=thread, id__gt=last_post_id) + + filter_time = datetime.fromtimestamp(float(last_update_time) / 1000) + added_posts = Post.objects.filter(thread=thread, pub_time__gt=filter_time) json_data = { - 'added': [] + 'added': [], + 'last_update' : int(time.time() * 1000), } - for post in posts: + for post in added_posts: json_data['added'].append(get_post(request, post.id).content.strip()) return HttpResponse(content=json.dumps(json_data))