NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Gazelle Forum: New Posts Indicator // @namespace https://greasyfork.org/users/321857-anakunda#user-script-list // @version 1.01.0 // @author Anakunda // @copyright 2020, Anakunda (https://greasyfork.org/users/321857-anakunda#user-script-list) // @license GPL-3.0-or-later // @match https://*/forums.php?action=viewthread&threadid=* // @match https://*/forums.php?page=4&action=viewthread&threadid=* // @connect * // @grant GM_getValue // @grant GM_setValue // @require https://openuserjs.org/src/libs/Anakunda/libLocks.min.js // @require https://openuserjs.org/src/libs/Anakunda/gazelleApiLib.js // ==/UserScript== 'use strict'; const interval = 15; let threadId = new URLSearchParams(document.location.search); if (threadId.has('threadid')) threadId = parseInt(threadId.get('threadid')); else throw 'Thread Id missing'; let postBody = document.querySelector('textarea#quickpost'); if (postBody == null) throw 'Post body missing'; let replyControls = document.querySelector('form#quickpostform > div.preview_submit'), newPostsIndicator = null; if (replyControls == null) throw 'Reply controls missing'; if (typeof GM_getValue == 'function') switch (document.domain) { case 'redacted.ch': var apiKey = GM_getValue('redacted_api_key'); if (!apiKey) GM_setValue('redacted_api_key', ''); break; } const getThreadSnapshot = (page = 999999) => queryAjaxAPI('forum', { type: 'viewthread', threadid: threadId, page: page }); let snapshot = getThreadSnapshot(), activeTimer; function checkPosts() { snapshot.then(snapshot => getThreadSnapshot(snapshot.currentPage).then(function(response) { let now = new Date(); console.debug(threadId, now.toLocaleTimeString(), response.pages, snapshot.pages, response.posts.length, snapshot.posts.length); if (response.pages <= snapshot.pages && response.posts.length <= snapshot.posts.length) return; activeTimer = clearInterval(activeTimer); if (newPostsIndicator == null) { newPostsIndicator = document.createElement('span'); newPostsIndicator.style = 'margin-left: 3em; color: darkorange;'; replyControls.append(newPostsIndicator); } newPostsIndicator.textContent = 'This thread received new post(s) ['; let link = document.createElement('a'); link.textContent = 'refresh'; if (response.pages <= snapshot.pages || response.posts.length > snapshot.posts.length) { link.href = '#'; link.onclick = function(evt) { document.location.reload(); return false; }; } else link.href = '/forums.php?action=viewthread&threadid=' + response.threadId + '&page=' + (response.currentPage + 1); newPostsIndicator.append(link); newPostsIndicator.append(']'); })); } postBody.onfocus = function(evt) { if (activeTimer || newPostsIndicator != null) return; //console.debug('New thread posts monitor activated', evt); activeTimer = setInterval(checkPosts, interval * 1000); checkPosts(); }; postBody.onblur = function(evt) { if (!activeTimer) return; //console.debug('New thread posts monitor deactivated', evt); activeTimer = clearInterval(activeTimer); console.assert(activeTimer === undefined, 'activeTimer === undefined'); };