From a6ab9511706174cc8e739a64d06fc4f634f4dd61 Mon Sep 17 00:00:00 2001 From: ccd0 Date: Thu, 11 Jul 2019 00:29:48 -0700 Subject: [PATCH] Fix Tinyboard/vichan post form redirecting before your posts can be recorded as yours. #2171 --- src/Miscellaneous/Tinyboard.coffee | 6 ++++++ src/Monitoring/ThreadWatcher.coffee | 19 ++++++++++--------- src/Posting/PostRedirect.coffee | 21 +++++++++++++++++++++ src/Quotelinks/QuoteYou.coffee | 3 ++- src/classes/DataBoard.coffee | 3 ++- src/main/Main.coffee | 1 + 6 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 src/Posting/PostRedirect.coffee diff --git a/src/Miscellaneous/Tinyboard.coffee b/src/Miscellaneous/Tinyboard.coffee index 7d0b3e512..c662e9259 100644 --- a/src/Miscellaneous/Tinyboard.coffee +++ b/src/Miscellaneous/Tinyboard.coffee @@ -11,6 +11,12 @@ Tinyboard = return unless settings.url is form.action return unless (postID = +request.responseJSON?.id) detail = {boardID, threadID, postID} + try + {redirect, noko} = request.responseJSON + if redirect and originalNoko? and !originalNoko and !noko + detail.redirect = redirect event = new CustomEvent 'QRPostSuccessful', {bubbles: true, detail: detail} document.dispatchEvent event + originalNoko = window.tb_settings?.ajax?.always_noko_replies + ((window.tb_settings or= {}).ajax or= {}).always_noko_replies = true , {boardID: g.BOARD.ID, threadID: g.THREADID} diff --git a/src/Monitoring/ThreadWatcher.coffee b/src/Monitoring/ThreadWatcher.coffee index a003b29b9..9e6968b5b 100644 --- a/src/Monitoring/ThreadWatcher.coffee +++ b/src/Monitoring/ThreadWatcher.coffee @@ -141,11 +141,12 @@ ThreadWatcher = ThreadWatcher.rm siteID, boardID, +threadID post: (e) -> {boardID, threadID, postID} = e.detail + cb = PostRedirect.delay() if postID is threadID if Conf['Auto Watch'] - ThreadWatcher.addRaw boardID, threadID, {} + ThreadWatcher.addRaw boardID, threadID, {}, cb else if Conf['Auto Watch Reply'] - ThreadWatcher.add g.threads[boardID + '.' + threadID] or new Thread(threadID, g.boards[boardID] or new Board(boardID)) + ThreadWatcher.add (g.threads[boardID + '.' + threadID] or new Thread(threadID, g.boards[boardID] or new Board(boardID))), cb onIndexUpdate: (e) -> {db} = ThreadWatcher siteID = g.SITE.ID @@ -528,21 +529,21 @@ ThreadWatcher = else ThreadWatcher.add thread - add: (thread) -> + add: (thread, cb) -> data = {} siteID = g.SITE.ID boardID = thread.board.ID threadID = thread.ID if thread.isDead if Conf['Auto Prune'] and ThreadWatcher.db.get {boardID, threadID} - ThreadWatcher.rm siteID, boardID, threadID + ThreadWatcher.rm siteID, boardID, threadID, cb return data.isDead = true data.excerpt = Get.threadExcerpt thread if thread.OP - ThreadWatcher.addRaw boardID, threadID, data + ThreadWatcher.addRaw boardID, threadID, data, cb - addRaw: (boardID, threadID, data) -> - ThreadWatcher.db.set {boardID, threadID, val: data} + addRaw: (boardID, threadID, data, cb) -> + ThreadWatcher.db.set {boardID, threadID, val: data}, cb ThreadWatcher.refresh() thread = {siteID: g.SITE.ID, boardID, threadID, data, force: true} if Conf['Show Page'] and !data.isDead @@ -550,8 +551,8 @@ ThreadWatcher = else if ThreadWatcher.unreadEnabled and Conf['Show Unread Count'] ThreadWatcher.fetchStatus thread - rm: (siteID, boardID, threadID) -> - ThreadWatcher.db.delete {siteID, boardID, threadID} + rm: (siteID, boardID, threadID, cb) -> + ThreadWatcher.db.delete {siteID, boardID, threadID}, cb ThreadWatcher.refresh() menu: diff --git a/src/Posting/PostRedirect.coffee b/src/Posting/PostRedirect.coffee new file mode 100644 index 000000000..9d4c7fc99 --- /dev/null +++ b/src/Posting/PostRedirect.coffee @@ -0,0 +1,21 @@ +PostRedirect = + init: -> + $.on d, 'QRPostSuccessful', (e) => + return unless e.detail.redirect + @event = e + @delays = 0 + $.queueTask => + if e is @event and @delays is 0 + location.href = e.detail.redirect + + delays: 0 + + delay: -> + return null unless @event + e = @event + @delays++ + () => + return unless e is @event + @delays-- + if @delays is 0 + location.href = e.detail.redirect diff --git a/src/Quotelinks/QuoteYou.coffee b/src/Quotelinks/QuoteYou.coffee index 09534c1b9..b3d49600b 100644 --- a/src/Quotelinks/QuoteYou.coffee +++ b/src/Quotelinks/QuoteYou.coffee @@ -5,10 +5,11 @@ QuoteYou = @db = new DataBoard 'yourPosts' $.sync 'Remember Your Posts', (enabled) -> Conf['Remember Your Posts'] = enabled $.on d, 'QRPostSuccessful', (e) -> + cb = PostRedirect.delay() $.get 'Remember Your Posts', Conf['Remember Your Posts'], (items) -> return unless items['Remember Your Posts'] {boardID, threadID, postID} = e.detail - (QuoteYou.db.set {boardID, threadID, postID, val: true}) + QuoteYou.db.set {boardID, threadID, postID, val: true}, cb return unless g.VIEW in ['index', 'thread', 'archive'] diff --git a/src/classes/DataBoard.coffee b/src/classes/DataBoard.coffee index 219c525f5..3f245b369 100644 --- a/src/classes/DataBoard.coffee +++ b/src/classes/DataBoard.coffee @@ -46,7 +46,7 @@ class DataBoard @sync?() cb?() - delete: ({siteID, boardID, threadID, postID}) -> + delete: ({siteID, boardID, threadID, postID}, cb) -> siteID or= g.SITE.ID return unless @data[siteID] @save => @@ -60,6 +60,7 @@ class DataBoard @deleteIfEmpty {siteID, boardID} else delete @data[siteID].boards[boardID] + , cb deleteIfEmpty: ({siteID, boardID, threadID}) -> return unless @data[siteID] diff --git a/src/main/Main.coffee b/src/main/Main.coffee index 5cc32ba62..5719cd31d 100644 --- a/src/main/Main.coffee +++ b/src/main/Main.coffee @@ -536,6 +536,7 @@ Main = ['Polyfill', Polyfill] ['Board Configuration', BoardConfig] ['Normalize URL', NormalizeURL] + ['Delay Redirect on Post', PostRedirect] ['Captcha Configuration', Captcha.replace] ['Image Host Rewriting', ImageHost] ['Redirect', Redirect]