Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name Catalog - Hotpocket Helper
- // @version 6.4
- // @author (cyg && fsn) == bffs 5 evr
- // @match https://boards.4chan.org/*/catalog
- // @match https://boards.4channel.org/*/catalog
- // @grant none
- // @run-at document-start
- // ==/UserScript==
- (function() {
- 'use strict';
- var CFCT = {};
- CFCT.refresh = function() {
- CFCT.fetchReports();
- };
- //Toolbox loaded, add the stuff
- CFCT.setupToolbox = function() {
- var toolbox = $.id("adminToolbox");
- var h4 = $.el("h4");
- toolbox.insertBefore(h4, toolbox.childNodes[2]);
- var el = $.el("a");
- el.href = `http://reports.4chan.org/#/${CFCT.board}`;
- el.target = "_blank";
- el.setAttribute("data-tip", `Open /${CFCT.board}/ queue`);
- el.innerHTML = `/${CFCT.board}/ Reports`;
- h4.appendChild(el);
- el = $.el("span");
- el.innerHTML = `: <span data-tip="Reports in queue" id="cfct-queue-count">?</span>`;
- el.innerHTML += ` (<a data-cmd="cfct-repfilter" data-tip="Threads with reported posts" id="cfct-thread-count">?</a>)`;
- h4.appendChild(el);
- };
- //Use stats stored in CFCT to update toolbox
- CFCT.updateToolbox = function() {
- var scan = setInterval(function() {
- if ($.id("cfct-queue-count") && $.id("cfct-thread-count")) {
- clearInterval(scan);
- if (CFCT.reportCount) $.id("cfct-queue-count").innerHTML = CFCT.reportCount;
- else $.id("cfct-queue-count").innerHTML = 0;
- $.id("cfct-thread-count").innerHTML = CFCT.threadCount;
- }
- }, 50);
- };
- CFCT.updateListeners = function() {
- $.on(document, "4chanATUpdated", CFCT.refresh);
- };
- //Add HPH filter buttons to the catalog tools
- CFCT.setupFilters = function() {
- var spn = $.el("span");
- spn.innerHTML = "[<a href='javascript:void(0);' data-cmd='cfct-repfilter' id='cfct-repfilter' >Show Reported</a>] ";
- $.id("info").appendChild(spn);
- spn = $.el("span");
- spn.innerHTML = "[<a href='javascript:void(0);' data-cmd='cfct-newfilter' id='cfct-newfilter' >Show New</a>]";
- $.id("info").appendChild(spn);
- };
- //Add the report indicators based on stats generated in CFCT.buildStats
- CFCT.parsePage = function() {
- $.id("cfct-repfilter").style = "";
- $.id("cfct-newfilter").style = "";
- var tmp = $.cls("cfct-parsed");//get all the previous parsed threads
- var prevParse = [];
- if (tmp[0]) {
- for (var i = 0; i < tmp.length; i++) {
- //push the post no of all the previous parsed threads into array
- //used to check if the thread still has reports or not
- prevParse.push(tmp[i].id.split("-")[1]);
- }
- }
- for (var op in CFCT.threadCounts) {
- tmp = prevParse.indexOf(op);//if op exists in prevParse, remove it.
- if (tmp > -1) prevParse.splice(tmp, 1);//after we will only have post no's with no reports
- if (!$.id(`meta-${op}`) || $.hasClass($.id(`thread-${op}`), "cfct-parsed")) {
- tmp = $.id("alert-id-" + op);
- if (tmp) {
- tmp.innerHTML = "[" + CFCT.threadCounts[op] + $.pluralise(CFCT.threadCounts[op], " Report", " Reports");
- if (CFCT.reportedOPs[op]) {
- tmp.innerHTML += " / OP Reported";
- }
- tmp.innerHTML += "]";
- }
- continue;
- }
- $.addClass($.id(`thread-${op}`), "cfct-parsed")
- var alert = $.el("div");
- alert.id = "alert-id-" + op;
- alert.className = "meta";
- alert.style.color = "red";
- alert.style.fontWeight = "700";
- alert.innerHTML = "[";
- alert.innerHTML += CFCT.threadCounts[op] + $.pluralise(CFCT.threadCounts[op], " Report", " Reports");
- if (CFCT.reportedOPs[op]) {
- alert.innerHTML += " / OP Reported";
- }
- alert.innerHTML += "]";
- $.id(`thread-${op}`).insertBefore(alert, $.id(`meta-${op}`).nextSibling);
- }
- //loop through remaining post no's and remove the cfct-parsed
- //and remove the red alert indicator
- for (i = 0; i < prevParse.length; i++) {
- tmp = $.id("thread-" + prevParse[i]);
- if (tmp && $.hasClass(tmp, "cfct-parsed")) {
- $.removeClass(tmp, "cfct-parsed");
- tmp = $.id("alert-id-" + prevParse[i]);
- tmp.parentNode.removeChild(tmp);
- }
- }
- };
- //Parse the report queue xhr response and generate thread report statistics
- CFCT.buildStats = function() {
- var report, reports = CFCT.xhr.data.reports;
- var threadCounts = {};
- var reportedOPs = {};
- CFCT.threadCount = 0;
- CFCT.reportCount = CFCT.xhr.data.counts[CFCT.board];
- for (var i = 0; (report = reports[i]); ++i) {
- try {
- var post = JSON.parse(report.post);
- } catch(e) {
- console.log(`error parsing post ${report.no}`);
- console.log(e);
- }
- var parent = (post.resto == 0) ? post.no : post.resto;
- if (post.resto == 0) {
- reportedOPs[post.no] = 1;
- }
- if (!threadCounts[parent]) {
- threadCounts[parent] = 1;
- CFCT.threadCount++;
- } else {
- threadCounts[parent]++;
- }
- }
- CFCT.threadCounts = threadCounts;
- CFCT.reportedOPs = reportedOPs;
- var scan = setInterval(function() {
- if ($.cls("thread").length > 0) {
- clearInterval(scan);
- $.dispatch("CFTCReportsParsed");
- CFCT.updateToolbox();
- CFCT.monitor = new MutationObserver(CFCT.parsePage);
- CFCT.monitor.observe($.id("threads"), {childList:true});
- }
- }, 50);
- };
- //XHR request retrieves list of reports.
- CFCT.fetchReports = function() {
- $.xhr("GET", `https://reports.4chan.org/?action=get_reports&board=${CFCT.board}`, {
- onreadystatechange: function() {
- if (this.status == 200 && this.readyState == 4) {
- try {
- var dat = JSON.parse(this.responseText);
- } catch (e) {
- console.log("error parsing reports");
- console.log(e);
- }
- if (dat.status != "success") {
- console.log("error parsing reports or you don't have this board.");
- return;
- }
- CFCT.xhr = dat;
- CFCT.buildStats(); //Sort out everything....
- }
- },
- onerror: function() {
- console.log("error fetching reports or you don't have this board.");
- }
- }, null, true);
- };
- //Toggle filter threads with reports
- CFCT.filterReported = function() {
- var bfw, op, ops = $.cls("thread"), button = $.id("cfct-repfilter");
- //hold on to yuor butts
- button.style.fontWeight = (button.style.fontWeight == 700) ? 500 : 700;
- bfw = button.style.fontWeight;
- for (var i = 0; (op = ops[i]); ++i) {
- if (bfw == 700) { //filter turn on
- button.style.color = "red";
- if (!$.hasClass(op, "cfct-parsed")) {
- op.style.display = "none";
- }
- } else { //filter turn off
- op.style.display = "";
- button.style.color = "";
- }
- }
- };
- //Toggle displaying threads made since timestamp CFCT.prevTime
- CFCT.filterNew = function() {
- if (!CFCT.prevTime) return;
- var bfw, button = $.id("cfct-newfilter");
- //hold on to yuor butts pt 2
- button.style.fontWeight = (button.style.fontWeight == 700) ? 500 : 700;
- bfw = button.style.fontWeight;
- if (bfw == 700) {
- button.style.color = "red";
- for (var no in window.catalog.threads) {
- var thread = window.catalog.threads[no];
- if (thread.date < CFCT.prevTime) {
- if ($.id(`thread-${no}`)) {
- $.id(`thread-${no}`).style.display = "none";
- }
- }
- }
- } else {
- button.style.color = "";
- var op, ops = $.cls("thread");
- for (var i = 0; (op = ops[i]); ++i) {
- op.style.display = "";
- }
- }
- };
- CFCT.onClick = function(e) {
- var t = e.target;
- switch(t.getAttribute("data-cmd")) {
- case "cfct-repfilter":
- CFCT.filterReported();
- break;
- case "cfct-newfilter":
- CFCT.filterNew();
- break;
- default: break;
- }
- };
- CFCT.getStyle = function() { //this looks familiar hmmmm :thinking:
- var i, a, link, sheet;
- for (i = 0;
- (a = document.getElementsByTagName("link")[i]); i++) {
- if (a.getAttribute("title") == "switch") {
- link = a;
- } else if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && a.href == link.href) {
- sheet = a.getAttribute("title");
- }
- }
- switch(sheet) {
- case "Tomorrow": sheet = "tomorrow"; break;
- case "Photon": sheet = "photon"; break;
- case "Yotsuba B New": //pass through
- case "Burichan New": sheet = "burichan"; break;
- case "Yotsuba New": //pass through
- case "Futaba New": sheet = "futaba"; break;
- default: sheet = (window.style_group == "ws_style") ? "burichan" : "futaba"; break;
- }
- CFCT.style = sheet;
- };
- if($)$.remByID=function(e){var n=$.id(e);n&&n.parentNode.removeChild(n)};else{var $={id:function(e){return document.getElementById(e)},remByID:function(e){var n=$.id(e);n&&n.parentNode.removeChild(n)},cls:function(e,n){return(n||document).getElementsByClassName(e)},byName:function(e){return document.getElementsByName(e)},tag:function(e,n){return(n||document).getElementsByTagName(e)},el:function(e){return document.createElement(e)},el2:function(e,n,t,i){var o,r;o=$.el(e);for(r in t)o.setAttribute(r,t[r]);return i&&(o.innerHTML=i),n.appendChild(o)},frag:function(){return document.createDocumentFragment()},qs:function(e,n){return(n||document).querySelector(e)},qsa:function(e,n){return(n||document).querySelectorAll(e)},extend:function(e,n){for(var t in n)e[t]=n[t]}};document.documentElement.classList?($.hasClass=function(e,n){return e.classList.contains(n)},$.addClass=function(e,n){e.classList.add(n)},$.removeClass=function(e,n){e.classList.remove(n)}):($.hasClass=function(e,n){return-1!=(" "+e.className+" ").indexOf(" "+n+" ")},$.addClass=function(e,n){e.className=""===e.className?n:e.className+" "+n},$.removeClass=function(e,n){e.className=(" "+e.className+" ").replace(" "+n+" ","")}),$.on=function(e,n,t){e.addEventListener(n,t,!1)},$.dispatch=function(e,n){var t=document.createEvent("Event");t.initEvent(e,!1,!1),document.dispatchEvent(t)},$.off=function(e,n,t){e.removeEventListener(n,t,!1)},$.xhr=function(e,n,t,i,o,r){var s,c,a;if(o=!!o||0,(c=new XMLHttpRequest).open(e,n,!0),t)for(s in t)c[s]=t[s];if(i)if("string"==typeof i)c.setRequestHeader("Content-type","application/x-www-form-urlencoded");else{a=new FormData;for(s in i)a.append(s,i[s]);console.log(r),console.log(a),i=a}else i=null;return o&&(c.withCredentials=!0),c.send(i),c},$.getItem=function(e){return localStorage.getItem(e)},$.setItem=function(e,n){return localStorage.setItem(e,n)},$.removeItem=function(e){return localStorage.removeItem(e)},$.getCookie=function(e){var n,t,i,o;for(o=e+"=",i=document.cookie.split(";"),n=0;t=i[n];++n){for(;" "==t.charAt(0);)t=t.substring(1,t.length);if(0===t.indexOf(o))return decodeURIComponent(t.substring(o.length,t.length))}return null},$.toggleXls=function(e,n){$.hasClass(e,n)?$.removeClass(e,n):$.addClass(e,n)},$.getToken=function(){return document.body.getAttribute("data-tkn")},$.capitalise=function(e){return e.charAt(0).toUpperCase()+e.slice(1)},$.pluralise=function(e,n,t){return 1===e?n||"":t||"s"},$.prettyBytes=function(e){return e>=1048576?(0|e/1048576*100+.5)/100+" MB":e>1024?(0|e/1024+.5)+" KB":e+" B"},$.ago=function(e){var n,t,i,o;return(n=Date.now()/1e3-e)<1?"recent":60>n?(0|n)+" secs":3600>n?(t=0|n/60)>1?t+" mins":"1 min":86400>n?(i=(t=0|n/3600)>1?t+"":"1",i+="."+(o=0|n/60-60*t)+" hrs"):(i=(t=0|n/86400)>1?t+"":"1",(o=0|n/3600-24*t)>=1&&(i+="."+o+" days"),i+"")},$.now=function(){return Math.round((new Date).getTime()/1e3)},$.length=function(e){return Object.keys(e).length},$.hidden="hidden",$.visibilitychange="visibilitychange",void 0===document.hidden&&("mozHidden"in document?($.hidden="mozHidden",$.visibilitychange="mozvisibilitychange"):"webkitHidden"in document?($.hidden="webkitHidden",$.visibilitychange="webkitvisibilitychange"):"msHidden"in document&&($.hidden="msHidden",$.visibilitychange="msvisibilitychange")),$.docEl=document.documentElement}
- CFCT.board = window.location.href.split("/")[3];
- CFCT.domain = (/4channel/.test(window.location.href)) ? "4channel" : "4chan";
- CFCT.prevTime = $.getItem(`cfct-refresh-time-${CFCT.board}`);
- $.setItem(`cfct-refresh-time-${CFCT.board}`, $.now());
- CFCT.fetchReports();
- CFCT.getStyle(); //twice on purpose
- //$.on(document, "DOMContentLoaded", CFCT.setupFilters);
- $.on(document, "CFTCReportsParsed", CFCT.parsePage);
- setTimeout(CFCT.updateListeners, 5000);
- $.on(document, "click", CFCT.onClick);
- var filterscan = setInterval(function() {
- if ($.id("info")) {
- clearInterval(filterscan);
- CFCT.setupFilters();
- }
- }, 50);
- var toolscan = setInterval(function() {
- if ($.id("adminToolbox")) {
- clearInterval(toolscan);
- CFCT.setupToolbox();
- }
- }, 50);
- })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement