Support access to DataBoard data of other sites.

This commit is contained in:
ccd0 2018-12-04 17:43:07 -08:00
parent ff78b283ac
commit 1fbe76e3cd
2 changed files with 48 additions and 46 deletions

View File

@ -150,7 +150,7 @@ ThreadWatcher =
{db} = ThreadWatcher {db} = ThreadWatcher
boardID = g.BOARD.ID boardID = g.BOARD.ID
nKilled = 0 nKilled = 0
for threadID, data of db.data.boards[boardID] when not data?.isDead and "#{boardID}.#{threadID}" not in e.detail.threads for threadID, data of db.data[Site.hostname].boards[boardID] when not data?.isDead and "#{boardID}.#{threadID}" not in e.detail.threads
# Don't prune threads that have yet to appear in index. # Don't prune threads that have yet to appear in index.
continue unless e.detail.threads.some (fullID) -> +fullID.split('.')[1] > threadID continue unless e.detail.threads.some (fullID) -> +fullID.split('.')[1] > threadID
nKilled++ nKilled++
@ -188,7 +188,7 @@ ThreadWatcher =
{db} = ThreadWatcher {db} = ThreadWatcher
interval = if ThreadWatcher.unreadEnabled and Conf['Show Unread Count'] then 5 * $.MINUTE else 2 * $.HOUR interval = if ThreadWatcher.unreadEnabled and Conf['Show Unread Count'] then 5 * $.MINUTE else 2 * $.HOUR
now = Date.now() now = Date.now()
unless now - interval < (db.data.lastChecked or 0) <= now or d.hidden or not d.hasFocus() unless now - interval < (db.data[Site.hostname].lastChecked or 0) <= now or d.hidden or not d.hasFocus()
ThreadWatcher.fetchAllStatus() ThreadWatcher.fetchAllStatus()
db.setLastChecked() db.setLastChecked()
ThreadWatcher.timeout = setTimeout ThreadWatcher.fetchAuto, interval ThreadWatcher.timeout = setTimeout ThreadWatcher.fetchAuto, interval
@ -288,7 +288,7 @@ ThreadWatcher =
getAll: -> getAll: ->
all = [] all = []
for boardID, threads of ThreadWatcher.db.data.boards for boardID, threads of ThreadWatcher.db.data[Site.hostname].boards
if Conf['Current Board'] and boardID isnt g.BOARD.ID if Conf['Current Board'] and boardID isnt g.BOARD.ID
continue continue
for threadID, data of threads when data and typeof data is 'object' for threadID, data of threads when data and typeof data is 'object'

View File

@ -13,11 +13,8 @@ class DataBoard
@sync = sync @sync = sync
$.on d, '4chanXInitFinished', init $.on d, '4chanXInitFinished', init
initData: (@allData) -> initData: (@data) ->
if Site.hostname is '4chan.org' and @allData.boards @data[Site.hostname] or= boards: {}
@data = @allData
else
@data = (@allData[Site.hostname] or= boards: {})
changes: [] changes: []
@ -26,72 +23,75 @@ class DataBoard
@changes.push change @changes.push change
$.get @key, {boards: {}}, (items) => $.get @key, {boards: {}}, (items) =>
return unless @changes.length return unless @changes.length
needSync = ((items[@key].version or 0) > (@allData.version or 0)) needSync = ((items[@key].version or 0) > (@data.version or 0))
if needSync if needSync
@initData items[@key] @initData items[@key]
change() for change in @changes change() for change in @changes
@changes = [] @changes = []
@allData.version = (@allData.version or 0) + 1 @data.version = (@data.version or 0) + 1
$.set @key, @allData, => $.set @key, @data, =>
@sync?() if needSync @sync?() if needSync
cb?() cb?()
forceSync: (cb) -> forceSync: (cb) ->
$.get @key, {boards: {}}, (items) => $.get @key, {boards: {}}, (items) =>
if (items[@key].version or 0) > (@allData.version or 0) if (items[@key].version or 0) > (@data.version or 0)
@initData items[@key] @initData items[@key]
change() for change in @changes change() for change in @changes
@sync?() @sync?()
cb?() cb?()
delete: ({boardID, threadID, postID}) -> delete: ({siteID, boardID, threadID, postID}) ->
siteID or= Site.hostname
@save => @save =>
if postID if postID
return unless @data.boards[boardID]?[threadID] return unless @data[siteID].boards[boardID]?[threadID]
delete @data.boards[boardID][threadID][postID] delete @data[siteID].boards[boardID][threadID][postID]
@deleteIfEmpty {boardID, threadID} @deleteIfEmpty {siteID, boardID, threadID}
else if threadID else if threadID
return unless @data.boards[boardID] return unless @data[siteID].boards[boardID]
delete @data.boards[boardID][threadID] delete @data[siteID].boards[boardID][threadID]
@deleteIfEmpty {boardID} @deleteIfEmpty {siteID, boardID}
else else
delete @data.boards[boardID] delete @data[siteID].boards[boardID]
deleteIfEmpty: ({boardID, threadID}) -> deleteIfEmpty: ({siteID, boardID, threadID}) ->
if threadID if threadID
unless Object.keys(@data.boards[boardID][threadID]).length unless Object.keys(@data[siteID].boards[boardID][threadID]).length
delete @data.boards[boardID][threadID] delete @data[siteID].boards[boardID][threadID]
@deleteIfEmpty {boardID} @deleteIfEmpty {siteID, boardID}
else unless Object.keys(@data.boards[boardID]).length else unless Object.keys(@data[siteID].boards[boardID]).length
delete @data.boards[boardID] delete @data[siteID].boards[boardID]
set: (data, cb) -> set: (data, cb) ->
@save => @save =>
@setUnsafe data @setUnsafe data
, cb , cb
setUnsafe: ({boardID, threadID, postID, val}) -> setUnsafe: ({siteID, boardID, threadID, postID, val}) ->
siteID or= Site.hostname
if postID isnt undefined if postID isnt undefined
((@data.boards[boardID] or= {})[threadID] or= {})[postID] = val ((@data[siteID].boards[boardID] or= {})[threadID] or= {})[postID] = val
else if threadID isnt undefined else if threadID isnt undefined
(@data.boards[boardID] or= {})[threadID] = val (@data[siteID].boards[boardID] or= {})[threadID] = val
else else
@data.boards[boardID] = val @data[siteID].boards[boardID] = val
extend: ({boardID, threadID, postID, val, rm}, cb) -> extend: ({siteID, boardID, threadID, postID, val, rm}, cb) ->
@save => @save =>
oldVal = @get {boardID, threadID, postID, val: {}} oldVal = @get {siteID, boardID, threadID, postID, val: {}}
delete oldVal[key] for key in rm or [] delete oldVal[key] for key in rm or []
$.extend oldVal, val $.extend oldVal, val
@setUnsafe {boardID, threadID, postID, val: oldVal} @setUnsafe {siteID, boardID, threadID, postID, val: oldVal}
, cb , cb
setLastChecked: -> setLastChecked: (siteID=Site.hostname) ->
@save => @save =>
@data.lastChecked = Date.now() @data[siteID].lastChecked = Date.now()
get: ({boardID, threadID, postID, defaultValue}) -> get: ({siteID, boardID, threadID, postID, defaultValue}) ->
if board = @data.boards[boardID] siteID or= Site.hostname
if board = @data[siteID].boards[boardID]
unless threadID? unless threadID?
if postID? if postID?
for ID, thread in board for ID, thread in board
@ -110,14 +110,15 @@ class DataBoard
clean: -> clean: ->
# XXX not yet multisite ready # XXX not yet multisite ready
return unless Site.software is 'yotsuba' return unless Site.software is 'yotsuba'
siteID = Site.hostname
for boardID, val of @data.boards for boardID, val of @data[siteID].boards
@deleteIfEmpty {boardID} @deleteIfEmpty {siteID, boardID}
now = Date.now() now = Date.now()
unless now - 2 * $.HOUR < (@data.lastChecked or 0) <= now unless now - 2 * $.HOUR < (@data[siteID].lastChecked or 0) <= now
@data.lastChecked = now @data[siteID].lastChecked = now
for boardID of @data.boards for boardID of @data[siteID].boards
@ajaxClean boardID @ajaxClean boardID
return return
@ -130,7 +131,8 @@ class DataBoard
@ajaxCleanParse boardID, response1, e2.target.response @ajaxCleanParse boardID, response1, e2.target.response
ajaxCleanParse: (boardID, response1, response2) -> ajaxCleanParse: (boardID, response1, response2) ->
return if not (board = @data.boards[boardID]) siteID = Site.hostname
return if not (board = @data[siteID].boards[boardID])
threads = {} threads = {}
if response1 if response1
for page in response1 for page in response1
@ -140,11 +142,11 @@ class DataBoard
if response2 if response2
for ID in response2 for ID in response2
threads[ID] = board[ID] if ID of board threads[ID] = board[ID] if ID of board
@data.boards[boardID] = threads @data[siteID].boards[boardID] = threads
@deleteIfEmpty {boardID} @deleteIfEmpty {siteID, boardID}
$.set @key, @allData $.set @key, @allData
onSync: (data) => onSync: (data) =>
return unless (data.version or 0) > (@allData.version or 0) return unless (data.version or 0) > (@data.version or 0)
@initData data @initData data
@sync?() @sync?()