Use threads.json in thread watcher to reduce number of thread JSON checks.
This commit is contained in:
parent
569ae9b06b
commit
725d7d458e
@ -170,11 +170,26 @@ ThreadWatcher =
|
|||||||
requests: []
|
requests: []
|
||||||
fetched: 0
|
fetched: 0
|
||||||
|
|
||||||
clearRequests: ->
|
fetch: (url, {siteID, force}, args, cb) ->
|
||||||
ThreadWatcher.requests = []
|
if ThreadWatcher.requests.length is 0
|
||||||
ThreadWatcher.fetched = 0
|
ThreadWatcher.status.textContent = '...'
|
||||||
ThreadWatcher.status.textContent = ''
|
$.addClass ThreadWatcher.refreshButton, 'fa-spin'
|
||||||
$.rmClass ThreadWatcher.refreshButton, 'fa-spin'
|
ajax = if (siteID is Site.hostname) then $.ajax else CrossOrigin.ajax
|
||||||
|
req = ajax url,
|
||||||
|
onloadend: ->
|
||||||
|
ThreadWatcher.fetched++
|
||||||
|
if ThreadWatcher.fetched is ThreadWatcher.requests.length
|
||||||
|
ThreadWatcher.requests = []
|
||||||
|
ThreadWatcher.fetched = 0
|
||||||
|
ThreadWatcher.status.textContent = ''
|
||||||
|
$.rmClass ThreadWatcher.refreshButton, 'fa-spin'
|
||||||
|
else
|
||||||
|
ThreadWatcher.status.textContent = "#{Math.round(ThreadWatcher.fetched / ThreadWatcher.requests.length * 100)}%"
|
||||||
|
cb.apply @, args
|
||||||
|
timeout: $.MINUTE
|
||||||
|
,
|
||||||
|
whenModified: if force then false else 'ThreadWatcher'
|
||||||
|
ThreadWatcher.requests.push req
|
||||||
|
|
||||||
abort: ->
|
abort: ->
|
||||||
for req in ThreadWatcher.requests when req.readyState isnt 4 # DONE
|
for req in ThreadWatcher.requests when req.readyState isnt 4 # DONE
|
||||||
@ -204,11 +219,34 @@ ThreadWatcher =
|
|||||||
for db in dbs
|
for db in dbs
|
||||||
db.forceSync ->
|
db.forceSync ->
|
||||||
if (++n) is dbs.length
|
if (++n) is dbs.length
|
||||||
threads = ThreadWatcher.getAll()
|
boards = ThreadWatcher.getAll(true)
|
||||||
for thread in threads
|
for board in boards
|
||||||
ThreadWatcher.fetchStatus thread
|
ThreadWatcher.fetchBoard board
|
||||||
return
|
return
|
||||||
|
|
||||||
|
fetchBoard: (board) ->
|
||||||
|
return unless board.some (thread) -> !thread.data.isDead
|
||||||
|
{siteID, boardID} = board[0]
|
||||||
|
software = Conf['siteProperties'][siteID]?.software
|
||||||
|
url = SW[software]?.urls.threadsListJSON?({siteID, boardID})
|
||||||
|
return unless url
|
||||||
|
ThreadWatcher.fetch url, {siteID}, [board], ThreadWatcher.parseBoard
|
||||||
|
|
||||||
|
parseBoard: (board) ->
|
||||||
|
return unless @status is 200
|
||||||
|
modified = {}
|
||||||
|
try
|
||||||
|
for page in @response
|
||||||
|
for item in page.threads
|
||||||
|
modified[item.no] = item.last_modified
|
||||||
|
for thread in board
|
||||||
|
{siteID, boardID, threadID} = thread
|
||||||
|
if modified[threadID]
|
||||||
|
continue if thread.data.modified is modified[threadID]
|
||||||
|
ThreadWatcher.db.extend {siteID, boardID, threadID, val: {modified: modified[threadID]}}
|
||||||
|
ThreadWatcher.fetchStatus thread
|
||||||
|
return
|
||||||
|
|
||||||
fetchStatus: (thread, force) ->
|
fetchStatus: (thread, force) ->
|
||||||
{siteID, boardID, threadID, data} = thread
|
{siteID, boardID, threadID, data} = thread
|
||||||
software = Conf['siteProperties'][siteID]?.software
|
software = Conf['siteProperties'][siteID]?.software
|
||||||
@ -216,25 +254,9 @@ ThreadWatcher =
|
|||||||
return unless url
|
return unless url
|
||||||
return if data.isDead and not force
|
return if data.isDead and not force
|
||||||
return if data.last is -1 # 404 or no JSON API
|
return if data.last is -1 # 404 or no JSON API
|
||||||
if ThreadWatcher.requests.length is 0
|
ThreadWatcher.fetch url, {siteID, force}, [thread], ThreadWatcher.parseStatus
|
||||||
ThreadWatcher.status.textContent = '...'
|
|
||||||
$.addClass ThreadWatcher.refreshButton, 'fa-spin'
|
|
||||||
ajax = if (siteID is Site.hostname) then $.ajax else CrossOrigin.ajax
|
|
||||||
req = ajax url,
|
|
||||||
onloadend: ->
|
|
||||||
ThreadWatcher.parseStatus.call @, thread
|
|
||||||
timeout: $.MINUTE
|
|
||||||
,
|
|
||||||
whenModified: if force then false else 'ThreadWatcher'
|
|
||||||
ThreadWatcher.requests.push req
|
|
||||||
|
|
||||||
parseStatus: ({siteID, boardID, threadID, data}) ->
|
parseStatus: ({siteID, boardID, threadID, data}) ->
|
||||||
ThreadWatcher.fetched++
|
|
||||||
if ThreadWatcher.fetched is ThreadWatcher.requests.length
|
|
||||||
ThreadWatcher.clearRequests()
|
|
||||||
else
|
|
||||||
ThreadWatcher.status.textContent = "#{Math.round(ThreadWatcher.fetched / ThreadWatcher.requests.length * 100)}%"
|
|
||||||
|
|
||||||
software = Conf['siteProperties'][siteID]?.software
|
software = Conf['siteProperties'][siteID]?.software
|
||||||
|
|
||||||
if @status is 200 and @response
|
if @status is 200 and @response
|
||||||
@ -293,14 +315,16 @@ ThreadWatcher =
|
|||||||
|
|
||||||
ThreadWatcher.refresh()
|
ThreadWatcher.refresh()
|
||||||
|
|
||||||
getAll: ->
|
getAll: (groupByBoard) ->
|
||||||
all = []
|
all = []
|
||||||
for siteID, boards of ThreadWatcher.db.data
|
for siteID, boards of ThreadWatcher.db.data
|
||||||
for boardID, threads of boards.boards
|
for boardID, threads of boards.boards
|
||||||
if Conf['Current Board'] and (siteID isnt Site.hostname or boardID isnt g.BOARD.ID)
|
if Conf['Current Board'] and (siteID isnt Site.hostname or boardID isnt g.BOARD.ID)
|
||||||
continue
|
continue
|
||||||
|
if groupByBoard
|
||||||
|
all.push (cont = [])
|
||||||
for threadID, data of threads when data and typeof data is 'object'
|
for threadID, data of threads when data and typeof data is 'object'
|
||||||
all.push {siteID, boardID, threadID, data}
|
(if groupByBoard then cont else all).push {siteID, boardID, threadID, data}
|
||||||
all
|
all
|
||||||
|
|
||||||
makeLine: (siteID, boardID, threadID, data) ->
|
makeLine: (siteID, boardID, threadID, data) ->
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user