diff --git a/CHANGELOG.md b/CHANGELOG.md index f84b9c4dc..8ef0930b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ Sometimes the changelog has notes (not comprehensive) acknowledging people's work. This does not mean the changes are their fault, only that their code was used. All changes to the script are chosen by and the fault of the maintainer (ccd0). +### v1.11.27 + +**v1.11.27.0** *(2016-02-27)* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.11.27.0/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.11.27.0/builds/4chan-X-noupdate.crx "Chromium version")] +- Based on v1.11.26.5. +- (paradox460) Multiline dumplist and related improvements. +- (vampiricwulf) Show Purge Position in place of Page Count on /f/. +- Add `Beep Quoting You` to updater options (default: off). Beeps when someone replies to you in another tab. + ### v1.11.26 **v1.11.26.5** *(2016-02-25)* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.11.26.5/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.11.26.5/builds/4chan-X-noupdate.crx "Chromium version")] diff --git a/builds/4chan-X-beta.crx b/builds/4chan-X-beta.crx index f85e44b0c..d90428e30 100644 Binary files a/builds/4chan-X-beta.crx and b/builds/4chan-X-beta.crx differ diff --git a/builds/4chan-X-beta.meta.js b/builds/4chan-X-beta.meta.js index 77e1a2c3f..da959c3d0 100644 --- a/builds/4chan-X-beta.meta.js +++ b/builds/4chan-X-beta.meta.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan X beta -// @version 1.11.26.5 +// @version 1.11.27.0 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X diff --git a/builds/4chan-X-beta.user.js b/builds/4chan-X-beta.user.js index 3d20c76a5..e7c368529 100644 --- a/builds/4chan-X-beta.user.js +++ b/builds/4chan-X-beta.user.js @@ -1,7 +1,7 @@ // Generated by CoffeeScript // ==UserScript== // @name 4chan X beta -// @version 1.11.26.5 +// @version 1.11.27.0 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X @@ -42,7 +42,7 @@ * Licensed under the MIT license. * https://github.com/ccd0/4chan-x/blob/master/LICENSE * -* Appchan X Copyright © 2013-2015 Zixaphir +* Appchan X Copyright © 2013-2016 Zixaphir * http://zixaphir.github.io/appchan-x/ * 4chan x Copyright © 2009-2011 James Campos * https://github.com/aeosynth/4chan-x @@ -418,6 +418,7 @@ updater: { checkbox: { 'Beep': [false, 'Beep on new post to completely read thread.'], + 'Beep Quoting You': [false, 'Beep on new post quoting you.'], 'Auto Scroll': [false, 'Scroll updated posts into view. Only enabled at bottom of page.'], 'Bottom Scroll': [false, 'Always scroll to the bottom, not the first new post. Useful for event threads.'], 'Scroll BG': [false, 'Auto-scroll background tabs.'], @@ -439,7 +440,7 @@ doc = d.documentElement; g = { - VERSION: '1.11.26.5', + VERSION: '1.11.27.0', NAMESPACE: '4chan X.', boards: {} }; @@ -10065,7 +10066,9 @@ }; _Class.prototype.dragStart = function(e) { - e.dataTransfer.setDragImage(this, e.layerX, e.layerY); + var left, ref, top; + ref = this.getBoundingClientRect(), left = ref.left, top = ref.top; + e.dataTransfer.setDragImage(this, e.clientX - left, e.clientY - top); return $.addClass(this, 'drag'); }; @@ -13161,14 +13164,14 @@ return; } statsHTML = { - innerHTML: "? / ?" + (Conf["IP Count in Stats"] ? " / ?" : "") + (Conf["Page Count in Stats"] && g.BOARD.ID !== "f" ? " / ?" : "") + innerHTML: "? / ?" + (Conf["IP Count in Stats"] ? " / ?" : "") + (Conf["Page Count in Stats"] ? " / ?" : "") }; statsTitle = 'Posts / Files'; if (Conf['IP Count in Stats']) { statsTitle += ' / IPs'; } - if (Conf['Page Count in Stats'] && g.BOARD.ID !== 'f') { - statsTitle += ' / Page'; + if (Conf['Page Count in Stats']) { + statsTitle += (g.BOARD.ID === 'f' ? ' / Purge Position' : ' / Page'); } if (Conf['Updater and Stats in Header']) { this.dialog = sc = $.el('span', { @@ -13231,7 +13234,7 @@ if (newPosts.length) { ThreadStats.lastPost = g.posts[newPosts[newPosts.length - 1]].info.date; } - if (((ref1 = ThreadStats.pageCountEl) != null ? ref1.textContent : void 0) !== '1') { + if (g.BOARD.ID !== 'f' && ((ref1 = ThreadStats.pageCountEl) != null ? ref1.textContent : void 0) !== '1') { return ThreadStats.fetchPage(); } }, @@ -13264,22 +13267,34 @@ }); }, onThreadsLoad: function() { - var k, len1, len2, page, q, ref, ref1, thread; + var k, len1, len2, len3, page, purgePos, q, ref, ref1, ref2, thread, u; if (this.status === 200) { ref = this.response; for (k = 0, len1 = ref.length; k < len1; k++) { page = ref[k]; - ref1 = page.threads; - for (q = 0, len2 = ref1.length; q < len2; q++) { - thread = ref1[q]; - if (!(thread.no === ThreadStats.thread.ID)) { - continue; + if (g.BOARD.ID === 'f') { + purgePos = 1; + ref1 = page.threads; + for (q = 0, len2 = ref1.length; q < len2; q++) { + thread = ref1[q]; + if (thread.no < ThreadStats.thread.ID) { + purgePos++; + } + } + ThreadStats.pageCountEl.textContent = purgePos; + } else { + ref2 = page.threads; + for (u = 0, len3 = ref2.length; u < len3; u++) { + thread = ref2[u]; + if (!(thread.no === ThreadStats.thread.ID)) { + continue; + } + ThreadStats.pageCountEl.textContent = page.page; + (page.page === this.response.length ? $.addClass : $.rmClass)(ThreadStats.pageCountEl, 'warning'); + ThreadStats.lastPageUpdate = new Date(thread.last_modified * $.SECOND); + ThreadStats.retry(); + return; } - ThreadStats.pageCountEl.textContent = page.page; - (page.page === this.response.length ? $.addClass : $.rmClass)(ThreadStats.pageCountEl, 'warning'); - ThreadStats.lastPageUpdate = new Date(thread.last_modified * $.SECOND); - ThreadStats.retry(); - return; } } } else if (this.status === 304) { @@ -13288,7 +13303,7 @@ }, retry: function() { var ref; - if (ThreadStats.lastPost > ThreadStats.lastPageUpdate && ((ref = ThreadStats.pageCountEl) != null ? ref.textContent : void 0) !== '1') { + if (g.BOARD.ID !== 'f' && ThreadStats.lastPost > ThreadStats.lastPageUpdate && ((ref = ThreadStats.pageCountEl) != null ? ref.textContent : void 0) !== '1') { clearTimeout(ThreadStats.timeout); return ThreadStats.timeout = setTimeout(ThreadStats.fetchPage, 5 * $.SECOND); } @@ -13301,6 +13316,9 @@ if (g.VIEW !== 'thread' || !Conf['Thread Updater']) { return; } + this.audio = $.el('audio', { + src: ThreadUpdater.beep + }); if (Conf['Updater and Stats in Header']) { this.dialog = sc = $.el('span', { id: 'updater' @@ -13403,6 +13421,15 @@ cc-by-nc-3.0 */ beep: 'data:audio/wav;base64,UklGRjQDAABXQVZFZm10IBAAAAABAAEAgD4AAIA+AAABAAgAc21wbDwAAABBAAADAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkYXRhzAIAAGMms8em0tleMV4zIpLVo8nhfSlcPR102Ki+5JspVEkdVtKzs+K1NEhUIT7DwKrcy0g6WygsrM2k1NpiLl0zIY/WpMrjgCdbPhxw2Kq+5Z4qUkkdU9K1s+K5NkVTITzBwqnczko3WikrqM+l1NxlLF0zIIvXpsnjgydZPhxs2ay95aIrUEkdUdC3suK8N0NUIjq+xKrcz002WioppdGm091pK1w0IIjYp8jkhydXPxxq2K295aUrTkoeTs65suK+OUFUIzi7xqrb0VA0WSoootKm0t5tKlo1H4TYqMfkiydWQBxm16+85actTEseS8y7seHAPD9TIza5yKra01QyWSson9On0d5wKVk2H4DYqcfkjidUQB1j1rG75KsvSkseScu8seDCPz1TJDW2yara1FYxWSwnm9Sn0N9zKVg2H33ZqsXkkihSQR1g1bK65K0wSEsfR8i+seDEQTxUJTOzy6rY1VowWC0mmNWoz993KVc3H3rYq8TklSlRQh1d1LS647AyR0wgRMbAsN/GRDpTJTKwzKrX1l4vVy4lldWpzt97KVY4IXbUr8LZljVPRCxhw7W3z6ZISkw1VK+4sMWvXEhSPk6buay9sm5JVkZNiLWqtrJ+TldNTnquqbCwilZXU1BwpKirrpNgWFhTaZmnpquZbFlbVmWOpaOonHZcXlljhaGhpZ1+YWBdYn2cn6GdhmdhYGN3lp2enIttY2Jjco+bnJuOdGZlZXCImJqakHpoZ2Zug5WYmZJ/bGlobX6RlpeSg3BqaW16jZSVkoZ0bGtteImSk5KIeG5tbnaFkJKRinxxbm91gY2QkIt/c3BwdH6Kj4+LgnZxcXR8iI2OjIR5c3J0e4WLjYuFe3VzdHmCioyLhn52dHR5gIiKioeAeHV1eH+GiYqHgXp2dnh9hIiJh4J8eHd4fIKHiIeDfXl4eHyBhoeHhH96eHmA', + playBeep: function() { + var audio; + audio = ThreadUpdater.audio; + if (audio.paused) { + return audio.play(); + } else { + return $.one(audio, 'ended', ThreadUpdater.playBeep); + } + }, cb: { checkpost: function(e) { if (e.detail.threadID !== ThreadUpdater.thread.ID) { @@ -13585,7 +13612,7 @@ return new Notice('info', "The thread is " + change + ".", 30); }, parse: function(req) { - var ID, OP, board, deletedFiles, deletedPosts, files, firstPost, index, ipCountEl, k, lastPost, len1, len2, len3, len4, newPosts, node, post, postObject, postObjects, posts, q, ref, ref1, ref2, ref3, ref4, ref5, scroll, thread, u, unreadCount, v; + var ID, OP, board, deletedFiles, deletedPosts, files, firstPost, index, ipCountEl, k, lastPost, len1, len2, len3, len4, newPosts, node, post, postObject, postObjects, posts, q, ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, scroll, thread, u, unreadCount, unreadQYCount, v; postObjects = req.response.posts; OP = postObjects[0]; thread = ThreadUpdater.thread; @@ -13662,14 +13689,17 @@ ThreadUpdater.set('status', "+" + posts.length, 'new'); ThreadUpdater.outdateCount = 0; unreadCount = (ref4 = Unread.posts) != null ? ref4.size : void 0; + unreadQYCount = (ref5 = Unread.postsQuotingYou) != null ? ref5.size : void 0; Main.callbackNodes(Post, posts); - if (Conf['Beep'] && d.hidden && unreadCount === 0 && ((ref5 = Unread.posts) != null ? ref5.size : void 0)) { - if (!ThreadUpdater.audio) { - ThreadUpdater.audio = $.el('audio', { - src: ThreadUpdater.beep - }); + if (d.hidden || !d.hasFocus()) { + if (Conf['Beep Quoting You'] && ((ref6 = Unread.postsQuotingYou) != null ? ref6.size : void 0) > unreadQYCount) { + ThreadUpdater.playBeep(); + if (Conf['Beep']) { + ThreadUpdater.playBeep(); + } + } else if (Conf['Beep'] && ((ref7 = Unread.posts) != null ? ref7.size : void 0) > 0 && unreadCount === 0) { + ThreadUpdater.playBeep(); } - ThreadUpdater.audio.play(); } scroll = Conf['Auto Scroll'] && ThreadUpdater.scrollBG() && ThreadUpdater.root.getBoundingClientRect().bottom - doc.clientHeight < 25; firstPost = null; @@ -18958,7 +18988,7 @@ ".dialog:not(#qr):not(#thread-watcher):not(#header-bar) {\n" + " box-shadow: 0 1px 2px rgba(0, 0, 0, .15);\n" + "}\n" + -"#qr, \n" + +"#qr,\n" + "#thread-watcher {\n" + " box-shadow: -1px 2px 2px rgba(0, 0, 0, 0.25);\n" + "}\n" + @@ -20508,11 +20538,17 @@ "}\n" + "#dump-list {\n" + " overflow-x: auto;\n" + -" overflow-y: hidden;\n" + +" overflow-y: auto;\n" + " white-space: nowrap;\n" + " width: 248px;\n" + +" max-height: 248px;\n" + +" min-height: 90px;\n" + " max-width: 100%;\n" + " min-width: 100%;\n" + +" display: -webkit-flex;\n" + +" display: flex;\n" + +" -webkit-flex-wrap: wrap;\n" + +" flex-wrap: wrap;\n" + "}\n" + "#dump-list:hover {\n" + " overflow-x: auto;\n" + @@ -20529,9 +20565,12 @@ " overflow: hidden;\n" + " position: relative;\n" + " text-shadow: 0 0 2px #000;\n" + -" -moz-transition: opacity .25s ease-in-out;\n" + +" -webkit-transition: opacity .25s ease-in-out, -webkit-transform .25s ease-in-out;\n" + +" transition: opacity .25s ease-in-out, transform .25s ease-in-out, -webkit-transform .25s ease-in-out;\n" + " vertical-align: top;\n" + " background-size: cover;\n" + +" -webkit-flex: none;\n" + +" flex: none;\n" + "}\n" + ".qr-preview:hover,\n" + ".qr-preview:focus {\n" + @@ -20550,9 +20589,15 @@ "}\n" + ".qr-preview.drag {\n" + " box-shadow: 0 0 10px rgba(0,0,0,.5);\n" + +" -webkit-transform: scale(.8);\n" + +" transform: scale(.8);\n" + "}\n" + ".qr-preview.over {\n" + " border-color: #fff;\n" + +" -webkit-transform: scale(1.1);\n" + +" transform: scale(1.1);\n" + +" opacity: 0.9;\n" + +" z-index: 10;\n" + "}\n" + ".qr-preview > span {\n" + " color: #fff;\n" + @@ -20588,7 +20633,7 @@ " cursor: pointer;\n" + " font-size: 2em;\n" + " position: absolute;\n" + -" top: 50%;\n" + +" bottom: 20px;\n" + " right: 10px;\n" + " -moz-transform: translateY(-50%);\n" + "}\n" + @@ -20656,7 +20701,7 @@ ".left>.entry.has-submenu {\n" + " padding-right: 17px !important;\n" + "}\n" + -".entry input[type=\"checkbox\"], \n" + +".entry input[type=\"checkbox\"],\n" + ".entry input[type=\"radio\"] {\n" + " margin: 0px;\n" + " position: relative;\n" + diff --git a/builds/4chan-X-noupdate.crx b/builds/4chan-X-noupdate.crx index 3e6a2ca1f..72af1fb9e 100644 Binary files a/builds/4chan-X-noupdate.crx and b/builds/4chan-X-noupdate.crx differ diff --git a/builds/4chan-X-noupdate.user.js b/builds/4chan-X-noupdate.user.js index 47e326aed..3f57cdff3 100644 --- a/builds/4chan-X-noupdate.user.js +++ b/builds/4chan-X-noupdate.user.js @@ -1,7 +1,7 @@ // Generated by CoffeeScript // ==UserScript== // @name 4chan X -// @version 1.11.26.5 +// @version 1.11.27.0 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X @@ -42,7 +42,7 @@ * Licensed under the MIT license. * https://github.com/ccd0/4chan-x/blob/master/LICENSE * -* Appchan X Copyright © 2013-2015 Zixaphir +* Appchan X Copyright © 2013-2016 Zixaphir * http://zixaphir.github.io/appchan-x/ * 4chan x Copyright © 2009-2011 James Campos * https://github.com/aeosynth/4chan-x @@ -418,6 +418,7 @@ updater: { checkbox: { 'Beep': [false, 'Beep on new post to completely read thread.'], + 'Beep Quoting You': [false, 'Beep on new post quoting you.'], 'Auto Scroll': [false, 'Scroll updated posts into view. Only enabled at bottom of page.'], 'Bottom Scroll': [false, 'Always scroll to the bottom, not the first new post. Useful for event threads.'], 'Scroll BG': [false, 'Auto-scroll background tabs.'], @@ -439,7 +440,7 @@ doc = d.documentElement; g = { - VERSION: '1.11.26.5', + VERSION: '1.11.27.0', NAMESPACE: '4chan X.', boards: {} }; @@ -10065,7 +10066,9 @@ }; _Class.prototype.dragStart = function(e) { - e.dataTransfer.setDragImage(this, e.layerX, e.layerY); + var left, ref, top; + ref = this.getBoundingClientRect(), left = ref.left, top = ref.top; + e.dataTransfer.setDragImage(this, e.clientX - left, e.clientY - top); return $.addClass(this, 'drag'); }; @@ -13161,14 +13164,14 @@ return; } statsHTML = { - innerHTML: "? / ?" + (Conf["IP Count in Stats"] ? " / ?" : "") + (Conf["Page Count in Stats"] && g.BOARD.ID !== "f" ? " / ?" : "") + innerHTML: "? / ?" + (Conf["IP Count in Stats"] ? " / ?" : "") + (Conf["Page Count in Stats"] ? " / ?" : "") }; statsTitle = 'Posts / Files'; if (Conf['IP Count in Stats']) { statsTitle += ' / IPs'; } - if (Conf['Page Count in Stats'] && g.BOARD.ID !== 'f') { - statsTitle += ' / Page'; + if (Conf['Page Count in Stats']) { + statsTitle += (g.BOARD.ID === 'f' ? ' / Purge Position' : ' / Page'); } if (Conf['Updater and Stats in Header']) { this.dialog = sc = $.el('span', { @@ -13231,7 +13234,7 @@ if (newPosts.length) { ThreadStats.lastPost = g.posts[newPosts[newPosts.length - 1]].info.date; } - if (((ref1 = ThreadStats.pageCountEl) != null ? ref1.textContent : void 0) !== '1') { + if (g.BOARD.ID !== 'f' && ((ref1 = ThreadStats.pageCountEl) != null ? ref1.textContent : void 0) !== '1') { return ThreadStats.fetchPage(); } }, @@ -13264,22 +13267,34 @@ }); }, onThreadsLoad: function() { - var k, len1, len2, page, q, ref, ref1, thread; + var k, len1, len2, len3, page, purgePos, q, ref, ref1, ref2, thread, u; if (this.status === 200) { ref = this.response; for (k = 0, len1 = ref.length; k < len1; k++) { page = ref[k]; - ref1 = page.threads; - for (q = 0, len2 = ref1.length; q < len2; q++) { - thread = ref1[q]; - if (!(thread.no === ThreadStats.thread.ID)) { - continue; + if (g.BOARD.ID === 'f') { + purgePos = 1; + ref1 = page.threads; + for (q = 0, len2 = ref1.length; q < len2; q++) { + thread = ref1[q]; + if (thread.no < ThreadStats.thread.ID) { + purgePos++; + } + } + ThreadStats.pageCountEl.textContent = purgePos; + } else { + ref2 = page.threads; + for (u = 0, len3 = ref2.length; u < len3; u++) { + thread = ref2[u]; + if (!(thread.no === ThreadStats.thread.ID)) { + continue; + } + ThreadStats.pageCountEl.textContent = page.page; + (page.page === this.response.length ? $.addClass : $.rmClass)(ThreadStats.pageCountEl, 'warning'); + ThreadStats.lastPageUpdate = new Date(thread.last_modified * $.SECOND); + ThreadStats.retry(); + return; } - ThreadStats.pageCountEl.textContent = page.page; - (page.page === this.response.length ? $.addClass : $.rmClass)(ThreadStats.pageCountEl, 'warning'); - ThreadStats.lastPageUpdate = new Date(thread.last_modified * $.SECOND); - ThreadStats.retry(); - return; } } } else if (this.status === 304) { @@ -13288,7 +13303,7 @@ }, retry: function() { var ref; - if (ThreadStats.lastPost > ThreadStats.lastPageUpdate && ((ref = ThreadStats.pageCountEl) != null ? ref.textContent : void 0) !== '1') { + if (g.BOARD.ID !== 'f' && ThreadStats.lastPost > ThreadStats.lastPageUpdate && ((ref = ThreadStats.pageCountEl) != null ? ref.textContent : void 0) !== '1') { clearTimeout(ThreadStats.timeout); return ThreadStats.timeout = setTimeout(ThreadStats.fetchPage, 5 * $.SECOND); } @@ -13301,6 +13316,9 @@ if (g.VIEW !== 'thread' || !Conf['Thread Updater']) { return; } + this.audio = $.el('audio', { + src: ThreadUpdater.beep + }); if (Conf['Updater and Stats in Header']) { this.dialog = sc = $.el('span', { id: 'updater' @@ -13403,6 +13421,15 @@ cc-by-nc-3.0 */ beep: 'data:audio/wav;base64,UklGRjQDAABXQVZFZm10IBAAAAABAAEAgD4AAIA+AAABAAgAc21wbDwAAABBAAADAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkYXRhzAIAAGMms8em0tleMV4zIpLVo8nhfSlcPR102Ki+5JspVEkdVtKzs+K1NEhUIT7DwKrcy0g6WygsrM2k1NpiLl0zIY/WpMrjgCdbPhxw2Kq+5Z4qUkkdU9K1s+K5NkVTITzBwqnczko3WikrqM+l1NxlLF0zIIvXpsnjgydZPhxs2ay95aIrUEkdUdC3suK8N0NUIjq+xKrcz002WioppdGm091pK1w0IIjYp8jkhydXPxxq2K295aUrTkoeTs65suK+OUFUIzi7xqrb0VA0WSoootKm0t5tKlo1H4TYqMfkiydWQBxm16+85actTEseS8y7seHAPD9TIza5yKra01QyWSson9On0d5wKVk2H4DYqcfkjidUQB1j1rG75KsvSkseScu8seDCPz1TJDW2yara1FYxWSwnm9Sn0N9zKVg2H33ZqsXkkihSQR1g1bK65K0wSEsfR8i+seDEQTxUJTOzy6rY1VowWC0mmNWoz993KVc3H3rYq8TklSlRQh1d1LS647AyR0wgRMbAsN/GRDpTJTKwzKrX1l4vVy4lldWpzt97KVY4IXbUr8LZljVPRCxhw7W3z6ZISkw1VK+4sMWvXEhSPk6buay9sm5JVkZNiLWqtrJ+TldNTnquqbCwilZXU1BwpKirrpNgWFhTaZmnpquZbFlbVmWOpaOonHZcXlljhaGhpZ1+YWBdYn2cn6GdhmdhYGN3lp2enIttY2Jjco+bnJuOdGZlZXCImJqakHpoZ2Zug5WYmZJ/bGlobX6RlpeSg3BqaW16jZSVkoZ0bGtteImSk5KIeG5tbnaFkJKRinxxbm91gY2QkIt/c3BwdH6Kj4+LgnZxcXR8iI2OjIR5c3J0e4WLjYuFe3VzdHmCioyLhn52dHR5gIiKioeAeHV1eH+GiYqHgXp2dnh9hIiJh4J8eHd4fIKHiIeDfXl4eHyBhoeHhH96eHmA', + playBeep: function() { + var audio; + audio = ThreadUpdater.audio; + if (audio.paused) { + return audio.play(); + } else { + return $.one(audio, 'ended', ThreadUpdater.playBeep); + } + }, cb: { checkpost: function(e) { if (e.detail.threadID !== ThreadUpdater.thread.ID) { @@ -13585,7 +13612,7 @@ return new Notice('info', "The thread is " + change + ".", 30); }, parse: function(req) { - var ID, OP, board, deletedFiles, deletedPosts, files, firstPost, index, ipCountEl, k, lastPost, len1, len2, len3, len4, newPosts, node, post, postObject, postObjects, posts, q, ref, ref1, ref2, ref3, ref4, ref5, scroll, thread, u, unreadCount, v; + var ID, OP, board, deletedFiles, deletedPosts, files, firstPost, index, ipCountEl, k, lastPost, len1, len2, len3, len4, newPosts, node, post, postObject, postObjects, posts, q, ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, scroll, thread, u, unreadCount, unreadQYCount, v; postObjects = req.response.posts; OP = postObjects[0]; thread = ThreadUpdater.thread; @@ -13662,14 +13689,17 @@ ThreadUpdater.set('status', "+" + posts.length, 'new'); ThreadUpdater.outdateCount = 0; unreadCount = (ref4 = Unread.posts) != null ? ref4.size : void 0; + unreadQYCount = (ref5 = Unread.postsQuotingYou) != null ? ref5.size : void 0; Main.callbackNodes(Post, posts); - if (Conf['Beep'] && d.hidden && unreadCount === 0 && ((ref5 = Unread.posts) != null ? ref5.size : void 0)) { - if (!ThreadUpdater.audio) { - ThreadUpdater.audio = $.el('audio', { - src: ThreadUpdater.beep - }); + if (d.hidden || !d.hasFocus()) { + if (Conf['Beep Quoting You'] && ((ref6 = Unread.postsQuotingYou) != null ? ref6.size : void 0) > unreadQYCount) { + ThreadUpdater.playBeep(); + if (Conf['Beep']) { + ThreadUpdater.playBeep(); + } + } else if (Conf['Beep'] && ((ref7 = Unread.posts) != null ? ref7.size : void 0) > 0 && unreadCount === 0) { + ThreadUpdater.playBeep(); } - ThreadUpdater.audio.play(); } scroll = Conf['Auto Scroll'] && ThreadUpdater.scrollBG() && ThreadUpdater.root.getBoundingClientRect().bottom - doc.clientHeight < 25; firstPost = null; @@ -18958,7 +18988,7 @@ ".dialog:not(#qr):not(#thread-watcher):not(#header-bar) {\n" + " box-shadow: 0 1px 2px rgba(0, 0, 0, .15);\n" + "}\n" + -"#qr, \n" + +"#qr,\n" + "#thread-watcher {\n" + " box-shadow: -1px 2px 2px rgba(0, 0, 0, 0.25);\n" + "}\n" + @@ -20508,11 +20538,17 @@ "}\n" + "#dump-list {\n" + " overflow-x: auto;\n" + -" overflow-y: hidden;\n" + +" overflow-y: auto;\n" + " white-space: nowrap;\n" + " width: 248px;\n" + +" max-height: 248px;\n" + +" min-height: 90px;\n" + " max-width: 100%;\n" + " min-width: 100%;\n" + +" display: -webkit-flex;\n" + +" display: flex;\n" + +" -webkit-flex-wrap: wrap;\n" + +" flex-wrap: wrap;\n" + "}\n" + "#dump-list:hover {\n" + " overflow-x: auto;\n" + @@ -20529,9 +20565,12 @@ " overflow: hidden;\n" + " position: relative;\n" + " text-shadow: 0 0 2px #000;\n" + -" -moz-transition: opacity .25s ease-in-out;\n" + +" -webkit-transition: opacity .25s ease-in-out, -webkit-transform .25s ease-in-out;\n" + +" transition: opacity .25s ease-in-out, transform .25s ease-in-out, -webkit-transform .25s ease-in-out;\n" + " vertical-align: top;\n" + " background-size: cover;\n" + +" -webkit-flex: none;\n" + +" flex: none;\n" + "}\n" + ".qr-preview:hover,\n" + ".qr-preview:focus {\n" + @@ -20550,9 +20589,15 @@ "}\n" + ".qr-preview.drag {\n" + " box-shadow: 0 0 10px rgba(0,0,0,.5);\n" + +" -webkit-transform: scale(.8);\n" + +" transform: scale(.8);\n" + "}\n" + ".qr-preview.over {\n" + " border-color: #fff;\n" + +" -webkit-transform: scale(1.1);\n" + +" transform: scale(1.1);\n" + +" opacity: 0.9;\n" + +" z-index: 10;\n" + "}\n" + ".qr-preview > span {\n" + " color: #fff;\n" + @@ -20588,7 +20633,7 @@ " cursor: pointer;\n" + " font-size: 2em;\n" + " position: absolute;\n" + -" top: 50%;\n" + +" bottom: 20px;\n" + " right: 10px;\n" + " -moz-transform: translateY(-50%);\n" + "}\n" + @@ -20656,7 +20701,7 @@ ".left>.entry.has-submenu {\n" + " padding-right: 17px !important;\n" + "}\n" + -".entry input[type=\"checkbox\"], \n" + +".entry input[type=\"checkbox\"],\n" + ".entry input[type=\"radio\"] {\n" + " margin: 0px;\n" + " position: relative;\n" + diff --git a/builds/4chan-X.crx b/builds/4chan-X.crx index 3e850d5bc..58bb23210 100644 Binary files a/builds/4chan-X.crx and b/builds/4chan-X.crx differ diff --git a/builds/4chan-X.meta.js b/builds/4chan-X.meta.js index 4cde5d8e0..e787dd076 100644 --- a/builds/4chan-X.meta.js +++ b/builds/4chan-X.meta.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan X -// @version 1.11.26.5 +// @version 1.11.27.0 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index f1ddf6ca0..e73b89049 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -1,7 +1,7 @@ // Generated by CoffeeScript // ==UserScript== // @name 4chan X -// @version 1.11.26.5 +// @version 1.11.27.0 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X @@ -42,7 +42,7 @@ * Licensed under the MIT license. * https://github.com/ccd0/4chan-x/blob/master/LICENSE * -* Appchan X Copyright © 2013-2015 Zixaphir +* Appchan X Copyright © 2013-2016 Zixaphir * http://zixaphir.github.io/appchan-x/ * 4chan x Copyright © 2009-2011 James Campos * https://github.com/aeosynth/4chan-x @@ -418,6 +418,7 @@ updater: { checkbox: { 'Beep': [false, 'Beep on new post to completely read thread.'], + 'Beep Quoting You': [false, 'Beep on new post quoting you.'], 'Auto Scroll': [false, 'Scroll updated posts into view. Only enabled at bottom of page.'], 'Bottom Scroll': [false, 'Always scroll to the bottom, not the first new post. Useful for event threads.'], 'Scroll BG': [false, 'Auto-scroll background tabs.'], @@ -439,7 +440,7 @@ doc = d.documentElement; g = { - VERSION: '1.11.26.5', + VERSION: '1.11.27.0', NAMESPACE: '4chan X.', boards: {} }; @@ -10065,7 +10066,9 @@ }; _Class.prototype.dragStart = function(e) { - e.dataTransfer.setDragImage(this, e.layerX, e.layerY); + var left, ref, top; + ref = this.getBoundingClientRect(), left = ref.left, top = ref.top; + e.dataTransfer.setDragImage(this, e.clientX - left, e.clientY - top); return $.addClass(this, 'drag'); }; @@ -13161,14 +13164,14 @@ return; } statsHTML = { - innerHTML: "? / ?" + (Conf["IP Count in Stats"] ? " / ?" : "") + (Conf["Page Count in Stats"] && g.BOARD.ID !== "f" ? " / ?" : "") + innerHTML: "? / ?" + (Conf["IP Count in Stats"] ? " / ?" : "") + (Conf["Page Count in Stats"] ? " / ?" : "") }; statsTitle = 'Posts / Files'; if (Conf['IP Count in Stats']) { statsTitle += ' / IPs'; } - if (Conf['Page Count in Stats'] && g.BOARD.ID !== 'f') { - statsTitle += ' / Page'; + if (Conf['Page Count in Stats']) { + statsTitle += (g.BOARD.ID === 'f' ? ' / Purge Position' : ' / Page'); } if (Conf['Updater and Stats in Header']) { this.dialog = sc = $.el('span', { @@ -13231,7 +13234,7 @@ if (newPosts.length) { ThreadStats.lastPost = g.posts[newPosts[newPosts.length - 1]].info.date; } - if (((ref1 = ThreadStats.pageCountEl) != null ? ref1.textContent : void 0) !== '1') { + if (g.BOARD.ID !== 'f' && ((ref1 = ThreadStats.pageCountEl) != null ? ref1.textContent : void 0) !== '1') { return ThreadStats.fetchPage(); } }, @@ -13264,22 +13267,34 @@ }); }, onThreadsLoad: function() { - var k, len1, len2, page, q, ref, ref1, thread; + var k, len1, len2, len3, page, purgePos, q, ref, ref1, ref2, thread, u; if (this.status === 200) { ref = this.response; for (k = 0, len1 = ref.length; k < len1; k++) { page = ref[k]; - ref1 = page.threads; - for (q = 0, len2 = ref1.length; q < len2; q++) { - thread = ref1[q]; - if (!(thread.no === ThreadStats.thread.ID)) { - continue; + if (g.BOARD.ID === 'f') { + purgePos = 1; + ref1 = page.threads; + for (q = 0, len2 = ref1.length; q < len2; q++) { + thread = ref1[q]; + if (thread.no < ThreadStats.thread.ID) { + purgePos++; + } + } + ThreadStats.pageCountEl.textContent = purgePos; + } else { + ref2 = page.threads; + for (u = 0, len3 = ref2.length; u < len3; u++) { + thread = ref2[u]; + if (!(thread.no === ThreadStats.thread.ID)) { + continue; + } + ThreadStats.pageCountEl.textContent = page.page; + (page.page === this.response.length ? $.addClass : $.rmClass)(ThreadStats.pageCountEl, 'warning'); + ThreadStats.lastPageUpdate = new Date(thread.last_modified * $.SECOND); + ThreadStats.retry(); + return; } - ThreadStats.pageCountEl.textContent = page.page; - (page.page === this.response.length ? $.addClass : $.rmClass)(ThreadStats.pageCountEl, 'warning'); - ThreadStats.lastPageUpdate = new Date(thread.last_modified * $.SECOND); - ThreadStats.retry(); - return; } } } else if (this.status === 304) { @@ -13288,7 +13303,7 @@ }, retry: function() { var ref; - if (ThreadStats.lastPost > ThreadStats.lastPageUpdate && ((ref = ThreadStats.pageCountEl) != null ? ref.textContent : void 0) !== '1') { + if (g.BOARD.ID !== 'f' && ThreadStats.lastPost > ThreadStats.lastPageUpdate && ((ref = ThreadStats.pageCountEl) != null ? ref.textContent : void 0) !== '1') { clearTimeout(ThreadStats.timeout); return ThreadStats.timeout = setTimeout(ThreadStats.fetchPage, 5 * $.SECOND); } @@ -13301,6 +13316,9 @@ if (g.VIEW !== 'thread' || !Conf['Thread Updater']) { return; } + this.audio = $.el('audio', { + src: ThreadUpdater.beep + }); if (Conf['Updater and Stats in Header']) { this.dialog = sc = $.el('span', { id: 'updater' @@ -13403,6 +13421,15 @@ cc-by-nc-3.0 */ beep: 'data:audio/wav;base64,UklGRjQDAABXQVZFZm10IBAAAAABAAEAgD4AAIA+AAABAAgAc21wbDwAAABBAAADAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkYXRhzAIAAGMms8em0tleMV4zIpLVo8nhfSlcPR102Ki+5JspVEkdVtKzs+K1NEhUIT7DwKrcy0g6WygsrM2k1NpiLl0zIY/WpMrjgCdbPhxw2Kq+5Z4qUkkdU9K1s+K5NkVTITzBwqnczko3WikrqM+l1NxlLF0zIIvXpsnjgydZPhxs2ay95aIrUEkdUdC3suK8N0NUIjq+xKrcz002WioppdGm091pK1w0IIjYp8jkhydXPxxq2K295aUrTkoeTs65suK+OUFUIzi7xqrb0VA0WSoootKm0t5tKlo1H4TYqMfkiydWQBxm16+85actTEseS8y7seHAPD9TIza5yKra01QyWSson9On0d5wKVk2H4DYqcfkjidUQB1j1rG75KsvSkseScu8seDCPz1TJDW2yara1FYxWSwnm9Sn0N9zKVg2H33ZqsXkkihSQR1g1bK65K0wSEsfR8i+seDEQTxUJTOzy6rY1VowWC0mmNWoz993KVc3H3rYq8TklSlRQh1d1LS647AyR0wgRMbAsN/GRDpTJTKwzKrX1l4vVy4lldWpzt97KVY4IXbUr8LZljVPRCxhw7W3z6ZISkw1VK+4sMWvXEhSPk6buay9sm5JVkZNiLWqtrJ+TldNTnquqbCwilZXU1BwpKirrpNgWFhTaZmnpquZbFlbVmWOpaOonHZcXlljhaGhpZ1+YWBdYn2cn6GdhmdhYGN3lp2enIttY2Jjco+bnJuOdGZlZXCImJqakHpoZ2Zug5WYmZJ/bGlobX6RlpeSg3BqaW16jZSVkoZ0bGtteImSk5KIeG5tbnaFkJKRinxxbm91gY2QkIt/c3BwdH6Kj4+LgnZxcXR8iI2OjIR5c3J0e4WLjYuFe3VzdHmCioyLhn52dHR5gIiKioeAeHV1eH+GiYqHgXp2dnh9hIiJh4J8eHd4fIKHiIeDfXl4eHyBhoeHhH96eHmA', + playBeep: function() { + var audio; + audio = ThreadUpdater.audio; + if (audio.paused) { + return audio.play(); + } else { + return $.one(audio, 'ended', ThreadUpdater.playBeep); + } + }, cb: { checkpost: function(e) { if (e.detail.threadID !== ThreadUpdater.thread.ID) { @@ -13585,7 +13612,7 @@ return new Notice('info', "The thread is " + change + ".", 30); }, parse: function(req) { - var ID, OP, board, deletedFiles, deletedPosts, files, firstPost, index, ipCountEl, k, lastPost, len1, len2, len3, len4, newPosts, node, post, postObject, postObjects, posts, q, ref, ref1, ref2, ref3, ref4, ref5, scroll, thread, u, unreadCount, v; + var ID, OP, board, deletedFiles, deletedPosts, files, firstPost, index, ipCountEl, k, lastPost, len1, len2, len3, len4, newPosts, node, post, postObject, postObjects, posts, q, ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, scroll, thread, u, unreadCount, unreadQYCount, v; postObjects = req.response.posts; OP = postObjects[0]; thread = ThreadUpdater.thread; @@ -13662,14 +13689,17 @@ ThreadUpdater.set('status', "+" + posts.length, 'new'); ThreadUpdater.outdateCount = 0; unreadCount = (ref4 = Unread.posts) != null ? ref4.size : void 0; + unreadQYCount = (ref5 = Unread.postsQuotingYou) != null ? ref5.size : void 0; Main.callbackNodes(Post, posts); - if (Conf['Beep'] && d.hidden && unreadCount === 0 && ((ref5 = Unread.posts) != null ? ref5.size : void 0)) { - if (!ThreadUpdater.audio) { - ThreadUpdater.audio = $.el('audio', { - src: ThreadUpdater.beep - }); + if (d.hidden || !d.hasFocus()) { + if (Conf['Beep Quoting You'] && ((ref6 = Unread.postsQuotingYou) != null ? ref6.size : void 0) > unreadQYCount) { + ThreadUpdater.playBeep(); + if (Conf['Beep']) { + ThreadUpdater.playBeep(); + } + } else if (Conf['Beep'] && ((ref7 = Unread.posts) != null ? ref7.size : void 0) > 0 && unreadCount === 0) { + ThreadUpdater.playBeep(); } - ThreadUpdater.audio.play(); } scroll = Conf['Auto Scroll'] && ThreadUpdater.scrollBG() && ThreadUpdater.root.getBoundingClientRect().bottom - doc.clientHeight < 25; firstPost = null; @@ -18958,7 +18988,7 @@ ".dialog:not(#qr):not(#thread-watcher):not(#header-bar) {\n" + " box-shadow: 0 1px 2px rgba(0, 0, 0, .15);\n" + "}\n" + -"#qr, \n" + +"#qr,\n" + "#thread-watcher {\n" + " box-shadow: -1px 2px 2px rgba(0, 0, 0, 0.25);\n" + "}\n" + @@ -20508,11 +20538,17 @@ "}\n" + "#dump-list {\n" + " overflow-x: auto;\n" + -" overflow-y: hidden;\n" + +" overflow-y: auto;\n" + " white-space: nowrap;\n" + " width: 248px;\n" + +" max-height: 248px;\n" + +" min-height: 90px;\n" + " max-width: 100%;\n" + " min-width: 100%;\n" + +" display: -webkit-flex;\n" + +" display: flex;\n" + +" -webkit-flex-wrap: wrap;\n" + +" flex-wrap: wrap;\n" + "}\n" + "#dump-list:hover {\n" + " overflow-x: auto;\n" + @@ -20529,9 +20565,12 @@ " overflow: hidden;\n" + " position: relative;\n" + " text-shadow: 0 0 2px #000;\n" + -" -moz-transition: opacity .25s ease-in-out;\n" + +" -webkit-transition: opacity .25s ease-in-out, -webkit-transform .25s ease-in-out;\n" + +" transition: opacity .25s ease-in-out, transform .25s ease-in-out, -webkit-transform .25s ease-in-out;\n" + " vertical-align: top;\n" + " background-size: cover;\n" + +" -webkit-flex: none;\n" + +" flex: none;\n" + "}\n" + ".qr-preview:hover,\n" + ".qr-preview:focus {\n" + @@ -20550,9 +20589,15 @@ "}\n" + ".qr-preview.drag {\n" + " box-shadow: 0 0 10px rgba(0,0,0,.5);\n" + +" -webkit-transform: scale(.8);\n" + +" transform: scale(.8);\n" + "}\n" + ".qr-preview.over {\n" + " border-color: #fff;\n" + +" -webkit-transform: scale(1.1);\n" + +" transform: scale(1.1);\n" + +" opacity: 0.9;\n" + +" z-index: 10;\n" + "}\n" + ".qr-preview > span {\n" + " color: #fff;\n" + @@ -20588,7 +20633,7 @@ " cursor: pointer;\n" + " font-size: 2em;\n" + " position: absolute;\n" + -" top: 50%;\n" + +" bottom: 20px;\n" + " right: 10px;\n" + " -moz-transform: translateY(-50%);\n" + "}\n" + @@ -20656,7 +20701,7 @@ ".left>.entry.has-submenu {\n" + " padding-right: 17px !important;\n" + "}\n" + -".entry input[type=\"checkbox\"], \n" + +".entry input[type=\"checkbox\"],\n" + ".entry input[type=\"radio\"] {\n" + " margin: 0px;\n" + " position: relative;\n" + diff --git a/builds/4chan-X.zip b/builds/4chan-X.zip index f3eff4e53..d7193b711 100644 Binary files a/builds/4chan-X.zip and b/builds/4chan-X.zip differ diff --git a/builds/updates-beta.xml b/builds/updates-beta.xml index b36ac4704..c85d01924 100644 --- a/builds/updates-beta.xml +++ b/builds/updates-beta.xml @@ -1,7 +1,7 @@ - + diff --git a/builds/updates.xml b/builds/updates.xml index 6e752b9f9..43c2a047c 100644 --- a/builds/updates.xml +++ b/builds/updates.xml @@ -1,7 +1,7 @@ - + diff --git a/version.json b/version.json index a885eedc4..49b2246b7 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "1.11.26.5", - "date": "2016-02-25T19:15:38.531Z" + "version": "1.11.27.0", + "date": "2016-02-28T03:14:27.964Z" }