ThreadStats =
init: ->
return if g.VIEW isnt 'thread' or !Conf['Thread Stats']
statsHTML = <%= html(
'? / ?' +
'?{Conf["IP Count in Stats"]}{ / ?}' +
'?{Conf["Page Count in Stats"] && g.BOARD.ID !== "f"}{ / ?}'
) %>
statsTitle = 'Posts / Files'
statsTitle += ' / IPs' if Conf['IP Count in Stats']
statsTitle += ' / Page' if Conf['Page Count in Stats'] and g.BOARD.ID isnt 'f'
if Conf['Updater and Stats in Header']
@dialog = sc = $.el 'span',
id: 'thread-stats'
title: statsTitle
$.extend sc, statsHTML
$.ready ->
Header.addShortcut sc
else
@dialog = sc = UI.dialog 'thread-stats', 'bottom: 0px; right: 0px;',
<%= html('
&{statsHTML}
') %>
$.addClass doc, 'float'
$.ready ->
$.add d.body, sc
@postCountEl = $ '#post-count', sc
@fileCountEl = $ '#file-count', sc
@ipCountEl = $ '#ip-count', sc
@pageCountEl = $ '#page-count', sc
Thread.callbacks.push
name: 'Thread Stats'
cb: @node
node: ->
postCount = 0
fileCount = 0
@posts.forEach (post) ->
postCount++
fileCount++ if post.file
ThreadStats.lastPost = post.info.date if Conf["Page Count in Stats"] and g.BOARD.ID isnt 'f'
ThreadStats.thread = @
ThreadStats.fetchPage()
ThreadStats.update postCount, fileCount, @ipCount
$.on d, 'ThreadUpdate', ThreadStats.onUpdate
onUpdate: (e) ->
return if e.detail[404]
{postCount, fileCount, ipCount, newPosts} = e.detail
ThreadStats.update postCount, fileCount, ipCount
return unless Conf["Page Count in Stats"] and g.BOARD.ID isnt 'f'
if newPosts.length
ThreadStats.lastPost = g.posts[newPosts[newPosts.length - 1]].info.date
if ThreadStats.pageCountEl?.textContent isnt '1'
ThreadStats.fetchPage()
update: (postCount, fileCount, ipCount) ->
{thread, postCountEl, fileCountEl, ipCountEl} = ThreadStats
postCountEl.textContent = postCount
fileCountEl.textContent = fileCount
if ipCount? and Conf["IP Count in Stats"]
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'
fetchPage: ->
return unless Conf["Page Count in Stats"] and g.BOARD.ID isnt 'f'
clearTimeout ThreadStats.timeout
if ThreadStats.thread.isDead
ThreadStats.pageCountEl.textContent = 'Dead'
$.addClass ThreadStats.pageCountEl, 'warning'
return
ThreadStats.timeout = setTimeout ThreadStats.fetchPage, 2 * $.MINUTE
$.ajax "//a.4cdn.org/#{ThreadStats.thread.board}/threads.json", onload: ThreadStats.onThreadsLoad,
whenModified: 'ThreadStats'
onThreadsLoad: ->
if @status is 200
for page in @response
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.retry()
return
else if @status is 304
ThreadStats.retry()
retry: ->
# If thread data is stale (modification date given < time of last post), try again.
if ThreadStats.lastPost > ThreadStats.lastPageUpdate and ThreadStats.pageCountEl?.textContent isnt '1'
clearTimeout ThreadStats.timeout
ThreadStats.timeout = setTimeout ThreadStats.fetchPage, 5 * $.SECOND