Skip to content

Instantly share code, notes, and snippets.

@qntmpkts
Created July 2, 2018 05:43
Show Gist options
  • Save qntmpkts/d6d8f98fa0870f5ad2f1c91c38388728 to your computer and use it in GitHub Desktop.
Save qntmpkts/d6d8f98fa0870f5ad2f1c91c38388728 to your computer and use it in GitHub Desktop.
http://anonsw.github.io/8chjs before it vanished from the 'net
/*
* q.js v2018.3-6.1
* http://anonsw.github.io/8chjs/
*/
// User Settings
var anonsw = {
qflair: '', // Examples: REAL, →
qcolor: '#ff0',
youcolor: '#cff',
scrollcolor: 'rgba(153, 153, 153, 0.6)',
scrollbackcolor: '#333',
scrolltime: 400, // ms
updateDelay: 200, // ms
sidenavWidth: 30, // px
floodEnabled: false,
floodThreshold: 15, // min # posts before beginning fade
floodVanish: 25, // max # posts before completed fade/hide
floodBehavior: 'fade', // hide, fade
fadenametripregex: /^(Anon(ymous)?-.*|.*-!CbboFOtcZs)$/i,
fadenametripfloodvalue: -1, // Effective post count for fading, or -1 for auto of floodThreshold+post count
strikeThroughNameFags: true,
rateHistoryLen: 50, // Data points on chart
rateAvgLen: 10 // Number of data points to average for instantaneous rate
// Suggestions from 589388.html#590283
// ...shill detection features, such as
// easily knowing the proportion of posts from a user that don't link.
// I'd want to know any ID that was posting > 1/3 posts targetting noone.
// TODO: Behavior for post hover should be to show original post visual before all q.js mods
// TODO: Add flags to turn on/off features
// TODO: Custom-regex -> post color/fade (auto-filter by selecting text and choosing new menu item?)
// Examples: daily reminder, guys, check this out, shill, get out, filtered, tell us more, archive everything
// TODO: Manual shade
// TODO: remove Q trip codes from post content?
// TODO: remove Q from end of post content if not a Q post?
// TODO: recognize all of known Q trip codes? (make to sure to exclude known comps)
// TODO: Links to reset on current Q/(you) post
// TODO: Link to go to latest post (end key doesn't always work, but try capturing that as well?)
// TODO: Keyboard shortcuts for navigation
// TODO: Current/Total overall post navigation
// TODO: Remap end key to always go to end of page
// TODO: Check box for each post to mark as "read", "spam", ?
// TODO: Autocorrect all-caps posts (50% threshold)?
// TODO: Correct broken links but remove referral when clicked?
// TODO: Make flood post fading non-linear to give leniency to posters just passing flood threshold
// TODO: Penalize reposts in flood detection (if id's different, merge?) ?
// TODO: Scorecard of posters ordered by post count (post rate, reply count, ...)?
// TODO: Color/shade posts where there are no references and no question marks
// TODO: If Q or trip used in name field, strike them out or replace with Anonymous?
// TODO: embedded posts in Q posts don't have background-color and inherit Q color, fix?
};
!function(t,$,n){var e,s,r,h,l=[],o=[],a=-1,c=[],d=-1,f=[],p=[],v=[];function g(t){$("html, body").animate({scrollTop:$(t).offset().top-$("div.boardlist").height()},anonsw.scrolltime)}function u(){return $(c).each(function(){$(this).css("background-color",anonsw.youcolor)}),$.Deferred().resolve()}function w(){return $('div.body:icontains("(You)")').each(function(){$(this).find(":not(small)").contents().filter(function(){return 3==this.nodeType}).each(function(){this.textContent=this.textContent.replace(/\(+ *You *\)+/gi,"you")})}),$.Deferred().resolve()}function y(){return $(o).each(function(t,n){$(n).css("background-color")!==anonsw.qcolor&&(""!==anonsw.qflair&&$(n).find("p.intro > label > span.trip").first().prepend(anonsw.qflair+" "),$(n).css("background-color",anonsw.qcolor))}),$.Deferred().resolve()}function m(){var t,n=-1;for(a>l.length&&(a=l.length),d>c.length&&(d=c.length),i=0;i<l.length;i++){var o=$(l).get(i);if(-1==n&&(n=$(o).css("font-size"),t=Math.floor(1.5*parseInt(n.replace("px","")))),$(o).offset().top+$(o).height()-2.25*t>$(window).scrollTop()){a=i;break}}for(i=0;i<c.length;i++){o=$(c).get(i);if(-1==n&&(n=$(o).css("font-size"),t=Math.floor(1.5*parseInt(n.replace("px","")))),$(o).offset().top+$(o).height()-2.25*t>$(window).scrollTop()){d=i;break}}$(".qcount").text("("+(a+1)+":"+l.length+")"),$(".youcount").text("("+(d+1)+":"+c.length+")")}function b(){var t=$("#sidenav");if(t.length){for($(t).css("height",$(window).height()-$("div.boardlist").height()),h=e.canvas.height/($(window).height()-$("div.boardlist").height()),e.clearRect(0,0,e.canvas.width,e.canvas.height),f=[],e.fillStyle=anonsw.qcolor,i=0;i<l.length;i++){var n=$(l).get(i);(o=$(n).height()/$(document).height()*e.canvas.height)<h&&(o=h),f[i]={x:s,y:$(n).offset().top/$(document).height()*e.canvas.height,width:e.canvas.width-2*s,height:o},e.fillRect(f[i].x,f[i].y,f[i].width,f[i].height)}for(p=[],e.fillStyle=anonsw.youcolor,i=0;i<c.length;i++){var o;n=$(c).get(i);(o=$(n).height()/$(document).height()*e.canvas.height)<h&&(o=h),p[i]={x:s,y:$(n).offset().top/$(document).height()*e.canvas.height,width:e.canvas.width-2*s,height:o},e.fillRect(p[i].x,p[i].y,p[i].width,p[i].height)}if(e.fillStyle=anonsw.scrollcolor,e.fillRect(r/2,$(window).scrollTop()/$(document).height()*e.canvas.height,r,$(window).height()/$(document).height()*e.canvas.height),750<$("#thread_stats_posts").text()){var a=8192/($(window).height()-$("div.boardlist").height());e.fillStyle="#f66",e.fillRect(0,e.canvas.height-a,e.canvas.width,a)}}}function x(){m(),b(),function(){var t=$("div.post").not(".post-hover"),n=t.length-(anonsw.rateHistoryLen+anonsw.rateAvgLen)+1;n<1&&(n=1),$($($(t).get(0)).find(".intro time").get(0)).attr("unixtime"),v=[],timehistory=[];for(var o=n;o<t.length;o++){var a=$($($(t).get(o)).find(".intro time").get(0)).attr("unixtime");if(timehistory[timehistory.length]=a,0<=timehistory.length-anonsw.rateAvgLen-1){var e=timehistory[timehistory.length-1],i=timehistory[timehistory.length-anonsw.rateAvgLen-1];v[v.length]=anonsw.rateAvgLen/((e-i)/60)}else v[v.length]=0}if($(".postRate").text(v[v.length-1].toFixed(1)),v.length>anonsw.rateAvgLen){var s=Math.max.apply(null,v),r=Math.min.apply(null,v);s-.5<r&&(r=s-.5,s+=.5),r<0&&(r=0);var h=timehistory[timehistory.length-1],l=timehistory[anonsw.rateAvgLen];$(".postRateChart").each(function(){var t=$(this).get(0).getContext("2d");t.clearRect(0,0,t.canvas.width,t.canvas.height),t.strokeStyle=$("div.boardlist a").css("color"),t.beginPath();var n=0,o=t.canvas.height-(v[anonsw.rateAvgLen]-r)/(s-r)*t.canvas.height;t.moveTo(n,o);for(var a=anonsw.rateAvgLen+1;a<v.length;a++)n=(timehistory[a]-l)/(h-l)*t.canvas.width,o=t.canvas.height-(v[a]-r)/(s-r)*t.canvas.height,t.lineTo(n,o);t.stroke(),t.closePath()})}}()}function _(){return c=$.map($('div.post:not(.post-hover) > p.intro > label span.name > span.own_post, div.post:not(.post-hover) > div.body > p.body-line > small:icontains("(You)")'),function(t){return $(t).closest("div.post")}),$.Deferred().resolve()}function T(){if(anonsw.floodEnabled){var e={},i=null,t=$("div.post:not(.post-hover)").not(".you");$(t).each(function(){var t,n=$(this).find("p > span.poster_id").first().text();if(null!=i){if(n in e||(e[n]={count:0,namefag:!1,floodcount:0}),e[n].count++,!e[n].namefag){var o=(t=$(this).find("p > label span.name").first()).contents().not(t.children()).text(),a=$(this).find("p > label > span.trip").first().text();e[n].namefag=!anonsw.fadenametripregex.test(o+"-"+a)}e[n].namefag?anonsw.fadenametripfloodvalue<0?e[n].floodcount=anonsw.floodThreshold+e[n].count:e[n].floodcount=anonsw.fadenametripfloodvalue:e[n].floodcount=e[n].count}null==i&&(i=n)}),$.each(e,function(t,n){if(t!==i){var o=$('span.poster_id:contains("'+t+'")');if(n.floodcount>anonsw.floodThreshold||n.namefag)if(anonsw.strikeThroughNameFags&&n.namefag&&$(o).each(function(){$(this).closest("div.post").find("p > label span.name").first().css("text-decoration","line-through")}),"fade"===anonsw.floodBehavior){var a=n.floodcount;a>anonsw.floodVanish&&(a=anonsw.floodVanish),(a=(anonsw.floodVanish-anonsw.floodThreshold-(a-anonsw.floodThreshold))/(anonsw.floodVanish-anonsw.floodThreshold))<.1&&(a=.1),$(o).each(function(){$(this).closest("div.post").css("opacity",a),$(this).closest("div.post").hover(function(){$(this).animate({opacity:1},anonsw.updateDelay)},function(){$(this).animate({opacity:a},anonsw.updateDelay)})})}else"hide"===anonsw.floodBehavior&&n.count>=anonsw.floodVanish&&$(o).each(function(){$(this).closest("div.post").hide()});else $(o).each(function(){$(this).closest("div.post").css("opacity",1)})}})}return $.Deferred().resolve()}function k(){(l=$.map($('div.post:not(.post-hover) > p.intro > label > span.trip:contains("!CbboFOtcZs")'),function(t){return $(t).closest("div.post")}),o=$.map($('div.post:not(.post-hover) > p.intro > label > span.trip:contains("!CbboFOtcZs")'),function(t){return $(t).closest("div.post")}),$.Deferred().resolve()).done(y).done(w).done(_).done(u).done(T).done(x)}!function($){var e,i=$.fn.on;$.fn.on=function(){var t=Array.apply(null,arguments),n=t[t.length-1];if(isNaN(n)||1===n&&t.pop())return i.apply(this,t);var o=t.pop(),a=t.pop();return t.push(function(){var t=this,n=arguments;clearTimeout(e),e=setTimeout(function(){a.apply(t,n)},o)}),i.apply(this,t)}}(this.jQuery||this.Zepto),$.expr[":"].icontains=jQuery.expr.createPseudo(function(n){return function(t){return 0<=jQuery(t).text().toUpperCase().indexOf(n.toUpperCase())}}),t.nextq=function(){0<l.length&&(a<l.length-1&&a++,g($(l).get(a)))},t.lastq=function(){0<l.length&&(a=l.length-1,g($(l).get(a)))},t.prevq=function(){0<l.length&&(0<a&&a--,g($(l).get(a)))},t.firstq=function(){0<l.length&&(a=0,g($(l).get(a)))},t.nextyou=function(){0<c.length&&(d<c.length-1&&d++,g($(c).get(d)))},t.lastyou=function(){0<c.length&&(d=c.length-1,g($(c).get(d)))},t.prevyou=function(){0<c.length&&(0<d&&d--,g($(c).get(d)))},t.firstyou=function(){0<c.length&&(d=0,g($(c).get(d)))},$(window).on("scroll",function(t){m(),b()},anonsw.updateDelay),$(window).on("resize",function(t){x()},anonsw.updateDelay),t.toggleFlood=function(){anonsw.floodEnabled?(anonsw.floodEnabled=!1,$(".toggleFloodState").text("On"),"fade"===anonsw.floodBehavior?$("span.poster_id").each(function(){$(this).closest("div.post").css("opacity",1),$(this).closest("div.post").off("mouseenter mouseleave")}):"hide"===anonsw.floodBehavior&&$(this).closest("div.post").show()):(anonsw.floodEnabled=!0,$(".toggleFloodState").text("Off"),k())},t.Q=function(){$("div.boardlist").append('<span>[ <a href="javascript:anonsw_main.firstq();"><i class="fa fa-step-backward"></i></a> <a href="javascript:anonsw_main.prevq();"><i class="fa fa-backward"></i></a> <span style="filter:brightness(70%);">Q</span> <span class="qcount">(?:?)</span> <a href="javascript:anonsw_main.nextq();"><i class="fa fa-forward"></i></a> <a href="javascript:anonsw_main.lastq();"><i class="fa fa-step-forward"></i></a> ]</span>'),$("div.boardlist").append('<span>[ <a href="javascript:anonsw_main.firstyou();"><i class="fa fa-step-backward"></i></a> <a href="javascript:anonsw_main.prevyou();"><i class="fa fa-backward"></i></a> <span style="filter:brightness(70%);">(You)</span> <span class="youcount">(?:?)</span> </span><a href="javascript:anonsw_main.nextyou();"><i class="fa fa-forward"></i></a> <a href="javascript:anonsw_main.lastyou();"><i class="fa fa-step-forward"></i></a> ]</span>'),$("div.boardlist").append('<span>[ <a href="javascript:anonsw_main.toggleFlood();">Turn Post Fading <span class="toggleFloodState">Off</span></a> ]</span>'),function(){var n=$("div.boardlist").height()-1;$("div.boardlist").append('<span>[ Post Rate: <span class="postRate">0</span> posts/min <canvas class="postRateChart"></canvas>]</span>'),$(".postRate").css("color",$("div.boardlist a").css("color"));var t=$(".postRateChart");$(t).each(function(){$(this).css("width","100px"),$(this).css("height",n),$(this).css("vertical-align","middle");var t=$(this).get(0).getContext("2d");t.canvas.height=20,t.canvas.width=100})}(),function(){$("body").append('<canvas id="sidenav"></canvas>');var t=$("#sidenav");$(t).css("position","fixed"),$(t).css("top",$("div.boardlist").height()),$(t).css("right",0),$(t).css("width",anonsw.sidenavWidth),$(t).css("height",$(window).height()-$("div.boardlist").height()),$(t).css("background-color",anonsw.scrollbackcolor),$("body").css("margin-right",anonsw.sidenavWidth),(e=$("#sidenav").get(0).getContext("2d")).canvas.height=2048,e.canvas.width=anonsw.sidenavWidth,s=1,r=e.canvas.width/2}(),k();var t=$("div.thread")[0];new MutationObserver(function(t){for(var n in t)if("childList"==t[n].type){k();break}}).observe(t,{childList:!0})}}(window.anonsw_main=window.anonsw_main||{},jQuery),$(document).ready(anonsw_main.Q);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment