From 499288e6da3cd7553a2a8f5badec66e42e4510be Mon Sep 17 00:00:00 2001 From: Mayhem Date: Thu, 19 Sep 2013 10:59:38 +0200 Subject: [PATCH] Update cooldown counting procedures. --- CHANGELOG.md | 6 ++++ src/Posting/QR.coffee | 83 +++++++++++++++++++------------------------ 2 files changed, 43 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38a9a0fa7..666524208 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +Update posting cooldown timers to match 4chan settings: + - Cooldown may vary between inter-thread and intra-thread replies. + - Cooldown may vary when posting a file or not. + - Cooldown does not take sageing into account anymore. + - Timers vary across boards. + ### 3.11.2 - *2013-09-17* Updated post and deletion cooldown timers to match 4chan changes: they are now twice longer. diff --git a/src/Posting/QR.coffee b/src/Posting/QR.coffee index c3231706a..46905bfb1 100644 --- a/src/Posting/QR.coffee +++ b/src/Posting/QR.coffee @@ -227,20 +227,19 @@ QR = cooldown: init: -> return unless Conf['Cooldown'] - board = g.BOARD.ID - QR.cooldown.types = - thread: switch board - when 'q' then 86400 - else 600 - sage: if board is 'q' then 600 else 120 - file: if board is 'q' then 300 else 60 - post: if board is 'q' then 150 else 60 + setTimers = (e) => QR.cooldown.types = e.detail + $.on window, 'cooldown:timers', setTimers + $.globalEval 'window.dispatchEvent(new CustomEvent("cooldown:timers", {detail: cooldowns}))' + $.off window, 'cooldown:timers', setTimers + for type of QR.cooldown.types + QR.cooldown.types[type] = +QR.cooldown.types[type] QR.cooldown.upSpd = 0 QR.cooldown.upSpdAccuracy = .5 - $.get "cooldown.#{board}", {}, (item) -> - QR.cooldown.cooldowns = item["cooldown.#{board}"] + key = "cooldown.#{g.BOARD}" + $.get key, {}, (item) -> + QR.cooldown.cooldowns = item[key] QR.cooldown.start() - $.sync "cooldown.#{board}", QR.cooldown.sync + $.sync key, QR.cooldown.sync start: -> return unless Conf['Cooldown'] return if QR.cooldown.isCounting @@ -254,30 +253,17 @@ QR = QR.cooldown.start() set: (data) -> return unless Conf['Cooldown'] - {req, post, isReply, delay} = data + {req, post, isReply, threadID, delay} = data start = if req then req.uploadEndTime else Date.now() if delay cooldown = {delay} else if post.file - upSpd = post.file.size / ((req.uploadEndTime - req.uploadStartTime) / $.SECOND) + upSpd = post.file.size / ((start - req.uploadStartTime) / $.SECOND) QR.cooldown.upSpdAccuracy = ((upSpd > QR.cooldown.upSpd * .9) + QR.cooldown.upSpdAccuracy) / 2 QR.cooldown.upSpd = upSpd - isSage = /sage/i.test post.email - hasFile = !!post.file - type = unless isReply - 'thread' - else if isSage - 'sage' - else if hasFile - 'file' - else - 'post' - cooldown = - isReply: isReply - isSage: isSage - hasFile: hasFile - timeout: start + QR.cooldown.types[type] * $.SECOND + hasFile = !!post.file + cooldown = {isReply, hasFile, threadID} QR.cooldown.cooldowns[start] = cooldown $.set "cooldown.#{g.BOARD}", QR.cooldown.cooldowns QR.cooldown.start() @@ -295,12 +281,12 @@ QR = QR.status() return - setTimeout QR.cooldown.count, $.SECOND + clearTimeout QR.cooldown.timeout + QR.cooldown.timeout = setTimeout QR.cooldown.count, $.SECOND now = Date.now() post = QR.posts[0] isReply = post.thread isnt 'new' - isSage = /sage/i.test post.email hasFile = !!post.file seconds = null {types, cooldowns, upSpd, upSpdAccuracy} = QR.cooldown @@ -314,26 +300,31 @@ QR = QR.cooldown.unset start continue + if 'timeout' of cooldown + # XXX tmp conversion from previous cooldowns + QR.cooldown.unset start + continue + if isReply is cooldown.isReply - # Only cooldowns relevant to this post can set the seconds value. - # Unset outdated cooldowns that can no longer impact us. + # Only cooldowns relevant to this post can set the seconds variable: + # reply cooldown with a reply, thread cooldown with a thread + elapsed = Math.floor (now - start) / $.SECOND + continue if elapsed < 0 # clock changed since then? type = unless isReply 'thread' - else if isSage and cooldown.isSage - 'sage' - else if hasFile and cooldown.hasFile - 'file' + else if hasFile + 'image' else - 'post' - elapsed = Math.floor (now - start) / $.SECOND - if elapsed >= 0 # clock changed since then? - seconds = Math.max seconds, types[type] - elapsed - if Conf['Cooldown Prediction'] and hasFile and upSpd - seconds -= Math.floor post.file.size / upSpd * upSpdAccuracy - seconds = Math.max seconds, 0 - unless start <= now <= cooldown.timeout - QR.cooldown.unset start + 'reply' + maxTimer = Math.max types[type], types[type + '_intra'] or 0 + unless start <= now <= start + maxTimer * $.SECOND + QR.cooldown.unset start + type += '_intra' if isReply and +post.thread is cooldown.threadID + seconds = Math.max seconds, types[type] - elapsed + if seconds and Conf['Cooldown Prediction'] and hasFile and upSpd + seconds -= Math.floor post.file.size / upSpd * upSpdAccuracy + seconds = Math.max seconds, 0 # Update the status when we change posting type. # Don't get stuck at some random number. # Don't interfere with progress status updates. @@ -1137,7 +1128,7 @@ QR = else post.rm() - QR.cooldown.set {req, post, isReply} + QR.cooldown.set {req, post, isReply, threadID} URL = if threadID is postID # new thread "/#{g.BOARD}/res/#{threadID}"