Advanced button stats

Show Advanced button stats

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Advanced button stats
// @namespace    http://www.reddit.com/r/thebutton/ABS-pastymage
// @version      0.5.17
// @description  Show Advanced button stats
// @author       pastymage (forked from /u/bwochinski 0.5)
// @match        *://www.reddit.com/r/thebutton/*
// @grant        none
// ==/UserScript==

//CONFIG
	var advInterval = 500; //update interval in milliseconds
	var advKeepAmt = 60; //history to keep (in seconds)

//if you want it to automatically click, change -1 in the
// line below to the time (remaining) that you want
	var timeyouwant = -1

//Important variables
	var parHist = [];
	var histLen = (1000 / advInterval) * advKeepAmt;
	var lowestTime = 60.00;
	var clicked = false;
	

if ( !document.getElementsByClassName ) {
	document.getElementsByClassName = function(cl, tag) {
	   var els, matches = [],
	      i = 0, len,
	      regex = new RegExp('(?:\\s|^)' + cl + '(?:\\s|$)');
	 
	   // If no tag name is specified,
	   // we have to grab EVERY element from the DOM	 
	   els = document.getElementsByTagName(tag || "*");
	   if ( !els[0] ) return false;

	   for ( len = els.length; i < len; i++ ) {
	      if ( els[i].className.match(regex) ) {
	         matches.push( els[i]);
	      }
	   }
	   return matches; // an array of elements that have the desired classname
	};
}
 
// Very simple implementation. We're only checking for an id, class, or tag name.
// Does not accept CSS selectors in pre-querySelector browsers.
function qq(el, tag) {
   var firstChar = el.charAt(0);

   switch ( firstChar ) {
      case "#":
         return document.getElementById( el.slice(1) );
      case ".":
		 var res = document.getElementsByClassName( el.slice(1));
		 return res;
      default:
         return document.getElementsByTagName(tag);
   }
};

function qqf(el, tag) {
	var res = qq(el,tag);
	return res[0];
}
	
function setupABSDisplay() {
	var div;
	var tmp;
	
	const LEFTSTYLE = "style='Font: 18px Verdana normal black; width: 100%; float: left;'"
//	const LEFTSTYLE = "style='Font: 18px Verdana normal black; width: 400px; float: left;''"
	const RIGHTSTYLE = "style='Font: 18px Verdana normal black; width: 90px; float: left;'"
		
	div=document.createElement('div');
	div.id='advButtonStats'
	div.style='position: absolute; bottom: 0; margin-top: 100px; margin: 0 auto; width: 480px;'
	qqf(".thebutton-form").appendChild(div);
	tmp=document.createElement('div');
	tmp.innerHTML = "<div id='advSPACER' " + LEFTSTYLE + "><br></div>";
	qq("#advButtonStats").appendChild(tmp.firstChild);
	tmp.innerHTML = "<div id='advBOPS' " + RIGHTSTYLE + ">BOPS:</div>";
	qq("#advButtonStats").appendChild(tmp.firstChild);
	tmp.innerHTML = "<div id='advLowest' " + RIGHTSTYLE + ">Lowest Seen:</div>";
	qq("#advButtonStats").appendChild(tmp.firstChild);
	tmp.innerHTML = "<div id='advPPM' " + RIGHTSTYLE + ">Clicks/min:</div>";
	qq("#advButtonStats").appendChild(tmp.firstChild);
	tmp.innerHTML = "<div id='advFlair' " + RIGHTSTYLE + ">Current Flair:</div>";
	qq("#advButtonStats").appendChild(tmp.firstChild);
	tmp.innerHTML = "<div id='advSPC' " + RIGHTSTYLE + ">Avg Secs/Click:</div>";
	qq("#advButtonStats").appendChild(tmp.firstChild);
	if (timeyouwant != -1) {
		tmp.innerHTML = "<div id='advCamp' " + RIGHTSTYLE + "><b>Auto Click:</b> " + timeyouwant.toString() + "</div>";
		qq("#advButtonStats").appendChild(tmp.firstChild);
	}
}

function advStatUpdate() {
    if (parHist.length > histLen) {
        parHist.pop();
    }
    var advText = qqf(".thebutton-participants").textContent.replace(",","");
    parHist.unshift(parseInt(advText));

    //console.log(parHist);
    var curBOPS = (parHist[0] - parHist[parHist.length - 1]) / (parHist.length / (1000 / advInterval));
    var curPPM = (parHist[0] - parHist[parHist.length - 1]) * (60 / advKeepAmt) * (advKeepAmt / (parHist.length / (1000 / advInterval)));
    var curTime = parseFloat(qq("#thebutton-s-10s").textContent + qq("#thebutton-s-1s").textContent + "." + qq("#thebutton-s-100ms").textContent + qq("#thebutton-s-10ms").textContent);
	if (!clicked) {
		if (curTime < lowestTime) {
			lowestTime = curTime;
			document.title=curTime.toString();
		} else {
			document.title="the button";
		}
	}
	if (!clicked && (curTime < timeyouwant + 1) && (curtime >= timeyouwant)) {
		document.title = "Done!"
		qq("#thebutton").click();
		clicked=true;
	}
    qq("#advBOPS").innerHTML = "<b>BOPS:</b> " + curBOPS.toFixed(5);
    qq("#advPPM").innerHTML = "<b>Clicks/min:</b> " + Math.round(curPPM);
    qq("#advFlair").innerHTML = "<b>Current Flair:</b> <span class='flair flair-press-" + String(curTime + 9).substring(0,1) + "'>" + String(curTime).substring(0,2) + "s</span>";
    qq("#advLowest").innerHTML = "<b>Lowest Seen:</b> " + lowestTime + "s</span>";
    qq("#advSPC").innerHTML = "<b>Avg Secs/Click:</b> " + (1 / curBOPS.toFixed(5)).toFixed(2);
}

function main() {
	setupABSDisplay();
	advStatUpdate();
	setInterval(advStatUpdate, advInterval);
}


main();