Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name Boards - Hotpocket Helper
- // @version 6.4
- // @author (cyg && fsn) == bffs 5 evr
- // @include https://boards.4chan.org/*
- // @include https://boards.4channel.org/*
- // @exclude https://boards.4chan.org/*/catalog
- // @exclude https://boards.4channel.org/*/catalog
- // @grant none
- // @run-at document-start
- // ==/UserScript==
- (function() {
- 'use strict';
- var CFBS = {};
- CFBS.refresh = function() {
- CFBS.jumperIndex = 0;
- CFBS.jumperArray = [];
- CFBS.fetchReports();
- CFBS.init4chX();
- };
- CFBS.parsePage = function() {
- var reported;
- for (var i = 0; (reported = CFBS.xhrReports[i]); ++i) {
- var post = $.id("p" + reported.no);
- var info = $.id("pi" + reported.no);
- if (!post) continue; //Report isn't on page.
- CFBS.jumperArray.push(reported.no);
- if ($.hasClass(post, "cfbs-parsed")) continue; //We saw this post already
- $.addClass(post, "cfbs-parsed");
- var el = $.el("span");
- el.id = `cfbs-reported-${reported.no}`;
- el.innerHTML = ` [<font id='cfbs-reported-${reported.no}-txt' style='color:red; font-weight:700;'>Reported</font>]`;
- info.insertBefore(el, $.qs("[class='postNum desktop']", info).nextSibling);
- if (window.Config.useIconButtons) {
- var btn = $.el("img");
- btn.alt = "CLR";
- btn.className = "extButton";
- btn.id = `cfbs-reported-button-${reported.no}`;
- btn.src = `//s.4cdn.org/image/buttons/${CFBS.style}/report.png`;
- btn.setAttribute("data-tip", "Clear this report");
- btn.setAttribute("data-id", reported.no);
- btn.setAttribute("data-cmd", "cfbs-clear-report");
- el.parentNode.insertBefore(btn, el.nextSibling);
- }
- }
- CFBS.jumperArray.sort(function(a, b) {
- return a - b;
- });
- CFBS.reportsTotal = CFBS.xhrReports.length;
- };
- //Toolbox loaded, add the stuff
- CFBS.setupToolbox = function() {
- var toolbox = $.id("adminToolbox");
- var tmp, h4 = $.el("h4");
- toolbox.insertBefore(h4, toolbox.childNodes[2]);
- var el = $.el("a");
- el.href = `http://reports.4chan.org/#/${CFBS.board}`;
- el.target = "_blank";
- el.setAttribute("data-tip", `Open /${CFBS.board}/ queue`);
- el.textContent = `/${CFBS.board}/ Reports`;
- h4.appendChild(el);
- el = $.el("span");
- el.textContent = ": ";
- tmp = $.el("span");
- tmp.setAttribute("data-tip", "Reports in queue");
- tmp.id = "cfbs-queue-count";
- tmp.textContent = "?";
- el.appendChild(tmp);
- el.appendChild(document.createTextNode(" ("));
- tmp = $.el("a");
- tmp.setAttribute("data-cmd", "cfbs-jumper");
- tmp.setAttribute("data-tip", "Current report / Reports on page");
- tmp.id = "cfbs-jumper-txt";
- tmp.textContent = "0 / ?";
- el.appendChild(tmp);
- el.appendChild(document.createTextNode(")"));
- h4.appendChild(el);
- $.id("cfbs-jumper-txt").style.cursor = "pointer";
- };
- CFBS.updateToolbox = function() {
- var scan = setInterval(function() {
- if ($.id("cfbs-queue-count") && $.id("cfbs-jumper-txt")) {
- clearInterval(scan);
- $.id("cfbs-queue-count").textContent = CFBS.reportsTotal;
- $.id("cfbs-jumper-txt").textContent = `${CFBS.jumperIndex} / ${CFBS.jumperArray.length}`;
- }
- }, 10);
- };
- CFBS.updateListeners = function() {
- $.on(document, "4chanThreadUpdated", CFBS.refresh);
- $.on(document, "4chanATUpdated", CFBS.refresh);
- };
- CFBS.updatePostMenu = function() {
- var menu = $.id("post-menu"), repNode, rcNode, aNode;
- if (!menu) return;
- var pid = menu.firstChild.firstChild.getAttribute("data-id"); //loving every laugh
- var post = $.id(`p${pid}`);
- var reported = $.hasClass(post, "cfbs-parsed");
- if (reported) {
- //clear report option
- repNode = $.el("LI");
- $.addClass(repNode, "dd-admin");
- aNode = $.el("a");
- aNode.setAttribute("data-cmd", "cfbs-clear-report");
- aNode.setAttribute("data-id", pid);
- aNode.textContent = "Clear report";
- repNode.appendChild(aNode);
- menu.firstChild.insertBefore(repNode, $.cls("dd-admin")[1]);
- //report link option
- repNode = $.el("LI");
- $.addClass(repNode, "dd-admin");
- aNode = $.el("a");
- aNode.setAttribute("data-cmd", "cfbs-report-link");
- aNode.setAttribute("data-id", pid);
- aNode.textContent = "Report link";
- repNode.appendChild(aNode);
- menu.firstChild.insertBefore(repNode, $.cls("dd-admin")[2]);
- }
- if ($.cls("backlink", post).length) {
- rcNode = $.el("LI");
- $.addClass(rcNode, "dd-admin");
- aNode = $.el("a");
- aNode.setAttribute("data-cmd", "cfbs-reply-chain");
- aNode.setAttribute("data-id", pid);
- aNode.textContent = "Reply chain";
- rcNode.appendChild(aNode);
- //if reported post, insert after "Report link"
- if (reported) {
- menu.firstChild.insertBefore(rcNode, $.cls("dd-admin")[3]);
- } else {
- menu.firstChild.insertBefore(rcNode, $.cls("dd-admin")[1]);
- }
- }
- menu.style.zIndex = "10001";
- };
- CFBS.runReportJumper = function() {
- if (CFBS.jumperIndex >= CFBS.jumperArray.length) CFBS.jumperIndex = 0;
- var el = $.id(`p${CFBS.jumperArray[CFBS.jumperIndex]}`);
- if (el) {
- el.scrollIntoView();
- window.scrollBy(0, -50); //pad top of page
- ++CFBS.jumperIndex;
- }
- CFBS.updateToolbox();
- };
- CFBS.removeFromJumper = function(no) {
- var index = CFBS.jumperArray.indexOf(no);
- if (index > -1) {
- CFBS.jumperArray.splice(index, 1);
- if (CFBS.jumperIndex > 0) CFBS.jumperIndex--;
- CFBS.reportsTotal--;
- }
- CFBS.updateToolbox();
- };
- CFBS.openReplyChain = function(pid) {
- CFBS.replyChainSeen = [];
- var bod = document.body;
- //Panel for posts
- var el = $.el("div");
- el.id = "settingsMenu";
- el.className = "UIPanel";
- el.setAttribute("data-cmd", "cfbs-close-replychain");
- el.innerHTML = `<div style="overflow-y: scroll;"><div class="extPanel reply" style="width: 98%;"><div class="panelHeader" id="cfbs-panelHeader">Viewing reply chain<span id="cfbs-panelCtrl" class="panelCtrl"></span></div></div></div>`;
- bod.appendChild(el);
- el.style.overflowY = "scroll";
- el.style.zIndex = "10000";
- //Close panel button
- var btn = $.el("img");
- btn.src = `//s.4cdn.org/image/buttons/${CFBS.style}/cross.png`;
- btn.setAttribute("data-cmd", "cfbs-close-replychain");
- btn.setAttribute("data-tip", "Close chain");
- btn.className = "pointer";
- $.id("cfbs-panelCtrl").appendChild(btn);
- //Submit deletions button
- btn = $.el("img");
- btn.src = `//s.4cdn.org/image/buttons/${CFBS.style}/report.png`;
- btn.setAttribute("data-cmd", "cfbs-delete-chain");
- btn.setAttribute("data-tip", "Delete selected from chain");
- btn.className = "pointer";
- $.id("cfbs-panelHeader").appendChild(btn);
- CFBS.addToChain(pid, el.firstChild); //recursive
- $.on(el, 'mouseover', window.Main.onThreadMouseOver);
- $.on(el, 'mouseover', CFBS.replyChainMouseover);
- $.on(el, 'mouseout', window.Main.onThreadMouseOut);
- $.dispatch("CFBSReplyChainDone");
- };
- CFBS.replyChainMouseover = function(el) {
- var t = el.target;
- if ($.hasClass(t, 'quotelink')) {
- var scan = setInterval(function() {
- if ($.id("quote-preview")) {
- clearInterval(scan);
- console.log("running");
- $.id("quote-preview").style.zIndex = "9009";//pro
- }
- }, 10);
- }
- };
- CFBS.closeReplyChain = function() {
- $.off($.id("settingsMenu"), 'mouseover', window.Main.onThreadMouseOver);
- $.off($.id("settingsMenu"), 'mouseover', CFBS.replyChainMouseover);
- $.off($.id("settingsMenu"), 'mouseout', window.Main.onThreadMouseOut);
- $.id("settingsMenu").parentNode.removeChild($.id("settingsMenu"));
- };
- CFBS.addToChain = function(postID, panel) {
- var link, links, post = $.id(`p${postID}`);
- var posts = [];
- if ($.id(`bl_${postID}`)) {
- links = $.id(`bl_${postID}`).childNodes;
- for (var i = 0; (link = links[i]); ++i) {
- link = link.firstChild.innerHTML.replace(">>", "");
- if (CFBS.replyChainSeen.includes(link)) continue;
- posts.push(link);
- CFBS.replyChainSeen.push(link);
- }
- }
- var clone = post.cloneNode(true);
- if (!$.hasClass(clone, "reply")) {
- $.addClass(clone, "reply"); //For OPs
- }
- clone.style.display = "block";
- clone.style.zIndex = "10000";
- if (!$.qs('[class="extControls"]', clone)) { //add buttons here
- var cnt = CFBS.buildPostIcons(postID);
- $.cls("postInfo desktop", clone)[0].insertBefore(cnt, $.cls("postNum desktop", clone)[0].nextSibling);
- }
- panel.appendChild(clone);
- for (i = 0; (post = posts[i]); ++i) {
- CFBS.addToChain(post, panel);
- }
- };
- CFBS.deleteFromChain = function() {
- var confirmed = confirm("Delete selected posts?");
- if (!confirmed) return;
- var marked = $.qsa("input[value='delete']:checked");
- var post;
- for (var i = 0; (post = marked[i]); ++i) {
- var id = post.name;
- CFBS.deleteChainRequest(id);
- }
- };
- CFBS.buildPostIcons = function(postID) {
- if (CFBS.style == undefined) CFBS = (window.style_group == "ws_style") ? "burichan" : "futaba"; //shrug
- var html = `<img class="extButton" alt="X" data-cmd="open-delete-prompt" data-id="${postID}" `
- + `src="//s.4cdn.org/image/buttons/${CFBS.style}/cross.png" title="Delete">`;
- if (window.spoilers && ($.id('fT' + postID))) {
- html += `<img class="extButton" alt="S" data-cmd="prompt-spoiler" `
- + `data-id="${postID}" src="//s.4cdn.org/image/buttons/${CFBS.style}/s.png" title="Toggle Spoiler">`;
- }
- if (!window.thread_archived) {
- var mode = ($.id("adminToolbox").childNodes.length > 4) ? "ban" : "open-banreq-prompt"; //hackerman
- html += `<img class="extButton" alt="B" data-cmd="${mode}" `
- + `data-id="${postID}" src="//s.4cdn.org/image/buttons/${CFBS.style}/ban.png" title="Ban Request">`;
- }
- var cnt = document.createElement('div');
- cnt.className = 'extControls';
- cnt.innerHTML = html;
- return cnt;
- };
- CFBS.init4chX = function() {
- if (!$.hasClass($.tag("html")[0], "fourchan-x")) return;
- var post, posts = $.cls("post");
- for (var i = 0; (post = posts[i]); ++i) {
- if ($.cls("extControls", post).length > 0) continue; //saw this post
- var postID = post.id.replace("p","");
- var cnt = CFBS.buildPostIcons(postID);
- $.id(`pi${postID}`).insertBefore(cnt, $.cls("postNum desktop", $.id(`pi${postID}`))[0].nextSibling);
- }
- if (!$.id("cfbs-j-link")) {
- var clone = $.id("j-link").cloneNode(true);
- clone.id = "cfbs-j-link";
- $.id("board-list").appendChild(clone);
- }
- };
- CFBS.deleteChainRequest = function(id) {
- var data = {"mode":"usrdel", "pwd":"janitorise"};
- data[id] = "delete";
- $.xhr("POST", `https://sys.${CFBS.domain}.org/${CFBS.board}/post`, {
- onreadystatechange: function() {
- if (this.readyState == 4 && this.status == 200) {
- CFBS.removeFromJumper(id);
- if (/Updating index/.test(this.responseText)) {
- var deleted = $.qsa(`[id="p${id}"]`);
- for (var k = 0; k < deleted.length; ++k) {
- deleted[k].style.opacity = "0.3";
- }
- } else {
- console.log(this.responseText);
- $.id("cfbs-panelHeader").innerHTML += "<font style='color:red;font-weight:700'>Error</font>";
- }
- }
- },
- onerror: function(e) {
- console.log("error deleting post " + id);
- $.id("cfbs-panelHeader").innerHTML += "<font style='color:red;font-weight:700'>Error</font>";
- console.log(e);
- }
- }, data, true);
- };
- CFBS.fetchReports = function() {
- $.xhr("GET", `https://reports.4chan.org/?action=get_reports&board=${CFBS.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;
- }
- CFBS.updateToolbox();
- $.on(document, "click", CFBS.onClick);
- $.dispatch("CFBSFetchQueueData"); //Should only run once
- CFBS.xhrReports = dat.data.reports;
- $.dispatch("CFBSReportsRetrieved");
- }
- },
- onerror: function() {
- console.log("error fetching reports or you don't have this board.");
- }
- }, null, true);
- };
- CFBS.fetchQueueData = function() {
- $.off(document, "CFBSFetchQueueData", CFBS.fetchQueueData);
- $.xhr("GET", "https://reports.4chan.org/", {
- onreadystatechange: function() {
- if (this.status == 200 && this.readyState == 4) {
- var a = $.el('html'); a.innerHTML = this.responseText; var b = $.tag('body', a);
- CFBS.page = b[0].getAttribute('data-tkn'); //cs_grad.png
- }
- },
- onerror: function() {
- console.log("error fetching rqd");
- }
- }, null, true);
- };
- CFBS.clearReport = function(pid) {
- var scan = setInterval(function() {
- $.id(`cfbs-reported-${pid}-txt`).innerHTML += ".";
- if ($.id(`cfbs-reported-${pid}-txt`).innerHTML.length > 4) {
- $.id(`cfbs-reported-${pid}-txt`).innerHTML = "";
- }
- }, 150);
- $.xhr("POST", `https://reports.4chan.org?action=clear_report`, {
- onreadystatechange: function() {
- if (this.status == 200 && this.readyState == 4) {
- clearInterval(scan);
- try {
- var res = JSON.parse(this.responseText);
- } catch(e) {
- console.log("error" + e);
- }
- if (res.status == "success") {
- $.id(`cfbs-reported-${pid}-txt`).innerHTML = "Cleared";
- $.id(`cfbs-reported-${pid}-txt`).style.color = "green";
- $.id(`cfbs-reported-button-${pid}`).parentNode.removeChild($.id(`cfbs-reported-button-${pid}`));
- } else {
- $.id(`cfbs-reported-${pid}-txt`).innerHTML = (res.message || "Unknown error");
- console.log(this.responseText);
- }
- }
- },
- onerror: function() {
- clearInterval(scan);
- $.id(`cfbs-reported-${pid}-txt`).innerHTML = "Clear failed";
- }
- }, {
- "_tkn": CFBS.page,
- "board": CFBS.board,
- "no": pid
- }, true);
- };
- CFBS.reportLink = function(no) {
- var url = `https://reports.4chan.org/?links{"reports":["report-${CFBS.board}-${no}"]}`;
- window.open(url);
- }
- CFBS.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;
- }
- CFBS.style = sheet;
- };
- CFBS.onClick = function(e) {
- var t = e.target;
- switch(t.getAttribute("data-cmd")) {
- case "post-menu":
- CFBS.updatePostMenu();
- break;
- case "cfbs-clear-report":
- CFBS.clearReport(t.getAttribute("data-id"));
- CFBS.removeFromJumper(t.getAttribute("data-id"));
- break;
- case "cfbs-report-link":
- CFBS.reportLink(t.getAttribute("data-id"));
- break;
- case "cfbs-reply-chain":
- CFBS.openReplyChain(t.getAttribute("data-id"));
- break;
- case "cfbs-close-replychain":
- CFBS.closeReplyChain();
- break;
- case "cfbs-delete-chain":
- CFBS.deleteFromChain();
- break;
- case "cfbs-jumper":
- CFBS.runReportJumper();
- break;
- case "open-banreq-prompt":
- case "ban":
- $.id("banReq").style.zIndex = "10001";
- break;
- case "delete-post":
- case "delete-image":
- CFBS.removeFromJumper(t.getAttribute("data-id"));
- break;
- default: break;
- }
- };
- var $={id:function(e){return document.getElementById(e)},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)},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]},parentByCls:function(e,n){for(var t=$.docEl,o=e;e!==t&&!$.hasClass(e,n);)e=e.parentNode;return o!==e?e:null}};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)},$.off=function(e,n,t){e.removeEventListener(n,t,!1)},$.xhr=function(e,n,t,o,r){var a,u,s;if((u=new XMLHttpRequest).open(e,n,!0),t)for(a in t)u[a]=t[a];if(o)if("string"==typeof o)u.setRequestHeader("Content-type","application/x-www-form-urlencoded");else{for(a in s=new FormData,o)s.append(a,o[a]);o=s}else o=null;return u.withCredentials=r||0,u.send(o),u},$.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,o,r;for(r=e+"=",o=document.cookie.split(";"),n=0;t=o[n];++n){for(;" "==t.charAt(0);)t=t.substring(1,t.length);if(0===t.indexOf(r))return decodeURIComponent(t.substring(r.length,t.length))}return null},$.getToken=function(){return document.body.getAttribute("data-tkn")},$.ago=function(e){var n,t,o,r;return(n=Date.now()/1e3-e)<1?"moments ago":n<60?(0|n)+" seconds ago":n<3600?(t=0|n/60)>1?t+" minutes ago":"one minute ago":n<86400?(o=(t=0|n/3600)>1?t+" hours":"one hour",(r=0|n/60-60*t)>1&&(o+=" and "+r+" minutes"),o+" ago"):(o=(t=0|n/86400)>1?t+" days":"one day",(r=0|n/3600-24*t)>1&&(o+=" and "+r+" hours"),o+" ago")},$.pluralise=function(e,n,t){return 1===e?n||"":t||"s"},$.now=function(){return Math.round((new Date).getTime()/1e3)},$.dispatch=function(e,n){var t=document.createEvent("Event");t.initEvent(e,!1,!1),document.dispatchEvent(t)},$.docEl=document.documentElement;
- if (/catalog/.test(window.location.href)) {
- return; //Don't run on the catalog
- }
- CFBS.board = window.location.href.split("/")[3];
- CFBS.domain = (/4channel/.test(window.location.href)) ? "4channel" : "4chan";
- CFBS.jumperIndex = 0;
- CFBS.jumperArray = [];
- CFBS.getStyle(); //twice on purpose
- /*run dispatch for toolbox setup as soon was the admin toolbox loads*/
- var scan = setInterval(function() {
- if ($.id("adminToolbox")) {
- clearInterval(scan);
- $.dispatch("CFBSRunToolbox");
- }
- }, 50);
- $.on(document, "DOMContentLoaded", function() {
- CFBS.fetchReports();
- CFBS.getStyle();
- });
- $.on(document, "CFBSRunToolbox", CFBS.setupToolbox);
- $.on(document, "CFBSReportsRetrieved", CFBS.parsePage);
- $.on(document, "CFBSFetchQueueData", CFBS.fetchQueueData);
- $.on(document, "PostsInserted", CFBS.init4chX);
- $.on(document, "ThreadUpdate", CFBS.init4chX);
- setTimeout(CFBS.updateListeners, 5000);
- setTimeout(CFBS.init4chX, 300);
- })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement