diff --git a/src/Monitoring/ThreadStats.coffee b/src/Monitoring/ThreadStats.coffee index 1acc3cc5e..5a292d727 100644 --- a/src/Monitoring/ThreadStats.coffee +++ b/src/Monitoring/ThreadStats.coffee @@ -1,15 +1,22 @@ ThreadStats = + postCount: 0 + fileCount: 0 + postIndex: 0 + init: -> return if g.VIEW isnt 'thread' or !Conf['Thread Stats'] + if Conf['Page Count in Stats'] + @[if g.SITE.isPrunedByAge?(g.BOARD) then 'showPurgePos' else 'showPage'] = true + statsHTML = <%= html( '? / ?' + - '?{Conf["IP Count in Stats"]}{ / ?}' + + '?{Conf["IP Count in Stats"] && g.SITE.hasIPCount}{ / ?}' + '?{Conf["Page Count in Stats"]}{ / ?}' ) %> statsTitle = 'Posts / Files' - statsTitle += ' / IPs' if Conf['IP Count in Stats'] - statsTitle += (if g.BOARD.ID is 'f' then ' / Purge Position' else ' / Page') if Conf['Page Count in Stats'] + statsTitle += ' / IPs' if Conf['IP Count in Stats'] and g.SITE.hasIPCount + statsTitle += (if @showPurgePos then ' / Purge Position' else ' / Page') if Conf['Page Count in Stats'] if Conf['Updater and Stats in Header'] @dialog = sc = $.el 'span', @@ -37,35 +44,46 @@ ThreadStats = cb: @node node: -> - postCount = 0 - fileCount = 0 - @posts.forEach (post) -> - postCount++ - fileCount++ if post.file - (ThreadStats.lastPost = post.info.date if ThreadStats.pageCountEl) ThreadStats.thread = @ + ThreadStats.count() + ThreadStats.update() ThreadStats.fetchPage() - ThreadStats.update postCount, fileCount, @ipCount + $.on d, 'PostsInserted', -> $.queueTask ThreadStats.onPostsInserted $.on d, 'ThreadUpdate', ThreadStats.onUpdate + count: -> + {posts} = ThreadStats.thread + n = posts.keys.length + for i in [ThreadStats.postIndex...n] by 1 + post = posts[posts.keys[i]] + unless post.isFetchedQuote + ThreadStats.postCount++ + ThreadStats.fileCount += post.files.length + ThreadStats.postIndex = n + onUpdate: (e) -> return if e.detail[404] - {postCount, fileCount, ipCount, newPosts} = e.detail - ThreadStats.update postCount, fileCount, ipCount - return unless ThreadStats.pageCountEl - if newPosts.length - ThreadStats.lastPost = g.posts[newPosts[newPosts.length - 1]].info.date - if g.BOARD.ID isnt 'f' and ThreadStats.pageCountEl?.textContent isnt '1' + {postCount, fileCount} = e.detail + $.extend ThreadStats, {postCount, fileCount} + ThreadStats.postIndex = ThreadStats.thread.posts.keys.length + ThreadStats.update() + if ThreadStats.showPage and ThreadStats.pageCountEl.textContent isnt '1' ThreadStats.fetchPage() - update: (postCount, fileCount, ipCount) -> + onPostsInserted: -> + return unless ThreadStats.thread.posts.keys.length > ThreadStats.postIndex + ThreadStats.count() + ThreadStats.update() + if ThreadStats.showPage and ThreadStats.pageCountEl.textContent isnt '1' + ThreadStats.fetchPage() + + update: -> {thread, postCountEl, fileCountEl, ipCountEl} = ThreadStats - postCountEl.textContent = postCount - fileCountEl.textContent = fileCount - if ipCount? and ipCountEl - ipCountEl.textContent = ipCount - (if thread.postLimit and !thread.isSticky then $.addClass else $.rmClass) postCountEl, 'warning' - (if thread.fileLimit and !thread.isSticky then $.addClass else $.rmClass) fileCountEl, 'warning' + postCountEl.textContent = ThreadStats.postCount + fileCountEl.textContent = ThreadStats.fileCount + ipCountEl?.textContent = thread.ipCount ? '?' + postCountEl.classList.toggle 'warning', (thread.postLimit and !thread.isSticky) + fileCountEl.classList.toggle 'warning', (thread.fileLimit and !thread.isSticky) fetchPage: -> return unless ThreadStats.pageCountEl @@ -76,15 +94,15 @@ ThreadStats = return ThreadStats.timeout = setTimeout ThreadStats.fetchPage, 2 * $.MINUTE $.whenModified( - g.SITE.urls.threadsListJSON({boardID: ThreadStats.thread.board}), + g.SITE.urls.threadsListJSON(ThreadStats.thread), 'ThreadStats', ThreadStats.onThreadsLoad ) onThreadsLoad: -> if @status is 200 - for page in @response - if g.BOARD.ID is 'f' + for page, pageNum in @response + if ThreadStats.showPurgePos purgePos = 1 for thread in page.threads if thread.no < ThreadStats.thread.ID @@ -92,9 +110,9 @@ ThreadStats = ThreadStats.pageCountEl.textContent = purgePos else for thread in page.threads when thread.no is ThreadStats.thread.ID - ThreadStats.pageCountEl.textContent = page.page - (if page.page is @response.length then $.addClass else $.rmClass) ThreadStats.pageCountEl, 'warning' - ThreadStats.lastPageUpdate = new Date thread.last_modified * $.SECOND + ThreadStats.pageCountEl.textContent = pageNum + 1 + ThreadStats.pageCountEl.classList.toggle 'warning', (pageNum is @response.length - 1) + ThreadStats.lastPageUpdate = new Date(thread.last_modified * $.SECOND) ThreadStats.retry() return else if @status is 304 @@ -102,6 +120,12 @@ ThreadStats = retry: -> # If thread data is stale (modification date given < time of last post), try again. - if g.BOARD.ID isnt 'f' and ThreadStats.lastPost > ThreadStats.lastPageUpdate and ThreadStats.pageCountEl?.textContent isnt '1' - clearTimeout ThreadStats.timeout - ThreadStats.timeout = setTimeout ThreadStats.fetchPage, 5 * $.SECOND + # Skip this on vichan sites due to sage posts not updating modification time in threads.json. + return unless ( + ThreadStats.showPage and + ThreadStats.pageCountEl.textContent isnt '1' and + !g.SITE.threadModTimeIgnoresSage and + ThreadStats.thread.posts[ThreadStats.thread.lastPost].info.date > ThreadStats.lastPageUpdate + ) + clearTimeout ThreadStats.timeout + ThreadStats.timeout = setTimeout ThreadStats.fetchPage, 5 * $.SECOND diff --git a/src/site/SW.tinyboard.coffee b/src/site/SW.tinyboard.coffee index 68103f82c..e6c18094c 100644 --- a/src/site/SW.tinyboard.coffee +++ b/src/site/SW.tinyboard.coffee @@ -23,7 +23,6 @@ SW.tinyboard = 'Thread Expansion' 'Favicon' 'Quote Threading' - 'Thread Stats' 'Thread Updater' 'Banner' 'Flash Features' diff --git a/src/site/SW.yotsuba.coffee b/src/site/SW.yotsuba.coffee index 304174ebc..8d32a7cbd 100644 --- a/src/site/SW.yotsuba.coffee +++ b/src/site/SW.yotsuba.coffee @@ -1,5 +1,6 @@ SW.yotsuba = isOPContainerThread: false + hasIPCount: true urls: thread: ({boardID, threadID}) -> "#{location.protocol}//#{BoardConfig.domain(boardID)}/#{boardID}/thread/#{threadID}"