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
boardID = g.BOARD.ID
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.
continue unless e.detail.threads.some (fullID) -> +fullID.split('.')[1] > threadID
nKilled++
@ -188,7 +188,7 @@ ThreadWatcher =
{db} = ThreadWatcher
interval = if ThreadWatcher.unreadEnabled and Conf['Show Unread Count'] then 5 * $.MINUTE else 2 * $.HOUR
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()
db.setLastChecked()
ThreadWatcher.timeout = setTimeout ThreadWatcher.fetchAuto, interval
@ -288,7 +288,7 @@ ThreadWatcher =
getAll: ->
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
continue
for threadID, data of threads when data and typeof data is 'object'

View File

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