Advanced button stats

Show Advanced button stats

  1. // ==UserScript==
  2. // @name Advanced button stats
  3. // @namespace http://www.reddit.com/r/thebutton/ABS-pastymage
  4. // @version 0.5.17
  5. // @description Show Advanced button stats
  6. // @author pastymage (forked from /u/bwochinski 0.5)
  7. // @match *://www.reddit.com/r/thebutton/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. //CONFIG
  12. var advInterval = 500; //update interval in milliseconds
  13. var advKeepAmt = 60; //history to keep (in seconds)
  14.  
  15. //if you want it to automatically click, change -1 in the
  16. // line below to the time (remaining) that you want
  17. var timeyouwant = -1
  18.  
  19. //Important variables
  20. var parHist = [];
  21. var histLen = (1000 / advInterval) * advKeepAmt;
  22. var lowestTime = 60.00;
  23. var clicked = false;
  24.  
  25. if ( !document.getElementsByClassName ) {
  26. document.getElementsByClassName = function(cl, tag) {
  27. var els, matches = [],
  28. i = 0, len,
  29. regex = new RegExp('(?:\\s|^)' + cl + '(?:\\s|$)');
  30. // If no tag name is specified,
  31. // we have to grab EVERY element from the DOM
  32. els = document.getElementsByTagName(tag || "*");
  33. if ( !els[0] ) return false;
  34.  
  35. for ( len = els.length; i < len; i++ ) {
  36. if ( els[i].className.match(regex) ) {
  37. matches.push( els[i]);
  38. }
  39. }
  40. return matches; // an array of elements that have the desired classname
  41. };
  42. }
  43. // Very simple implementation. We're only checking for an id, class, or tag name.
  44. // Does not accept CSS selectors in pre-querySelector browsers.
  45. function qq(el, tag) {
  46. var firstChar = el.charAt(0);
  47.  
  48. switch ( firstChar ) {
  49. case "#":
  50. return document.getElementById( el.slice(1) );
  51. case ".":
  52. var res = document.getElementsByClassName( el.slice(1));
  53. return res;
  54. default:
  55. return document.getElementsByTagName(tag);
  56. }
  57. };
  58.  
  59. function qqf(el, tag) {
  60. var res = qq(el,tag);
  61. return res[0];
  62. }
  63. function setupABSDisplay() {
  64. var div;
  65. var tmp;
  66. const LEFTSTYLE = "style='Font: 18px Verdana normal black; width: 100%; float: left;'"
  67. // const LEFTSTYLE = "style='Font: 18px Verdana normal black; width: 400px; float: left;''"
  68. const RIGHTSTYLE = "style='Font: 18px Verdana normal black; width: 90px; float: left;'"
  69. div=document.createElement('div');
  70. div.id='advButtonStats'
  71. div.style='position: absolute; bottom: 0; margin-top: 100px; margin: 0 auto; width: 480px;'
  72. qqf(".thebutton-form").appendChild(div);
  73. tmp=document.createElement('div');
  74. tmp.innerHTML = "<div id='advSPACER' " + LEFTSTYLE + "><br></div>";
  75. qq("#advButtonStats").appendChild(tmp.firstChild);
  76. tmp.innerHTML = "<div id='advBOPS' " + RIGHTSTYLE + ">BOPS:</div>";
  77. qq("#advButtonStats").appendChild(tmp.firstChild);
  78. tmp.innerHTML = "<div id='advLowest' " + RIGHTSTYLE + ">Lowest Seen:</div>";
  79. qq("#advButtonStats").appendChild(tmp.firstChild);
  80. tmp.innerHTML = "<div id='advPPM' " + RIGHTSTYLE + ">Clicks/min:</div>";
  81. qq("#advButtonStats").appendChild(tmp.firstChild);
  82. tmp.innerHTML = "<div id='advFlair' " + RIGHTSTYLE + ">Current Flair:</div>";
  83. qq("#advButtonStats").appendChild(tmp.firstChild);
  84. tmp.innerHTML = "<div id='advSPC' " + RIGHTSTYLE + ">Avg Secs/Click:</div>";
  85. qq("#advButtonStats").appendChild(tmp.firstChild);
  86. if (timeyouwant != -1) {
  87. tmp.innerHTML = "<div id='advCamp' " + RIGHTSTYLE + "><b>Auto Click:</b> " + timeyouwant.toString() + "</div>";
  88. qq("#advButtonStats").appendChild(tmp.firstChild);
  89. }
  90. }
  91.  
  92. function advStatUpdate() {
  93. if (parHist.length > histLen) {
  94. parHist.pop();
  95. }
  96. var advText = qqf(".thebutton-participants").textContent.replace(",","");
  97. parHist.unshift(parseInt(advText));
  98.  
  99. //console.log(parHist);
  100. var curBOPS = (parHist[0] - parHist[parHist.length - 1]) / (parHist.length / (1000 / advInterval));
  101. var curPPM = (parHist[0] - parHist[parHist.length - 1]) * (60 / advKeepAmt) * (advKeepAmt / (parHist.length / (1000 / advInterval)));
  102. var curTime = parseFloat(qq("#thebutton-s-10s").textContent + qq("#thebutton-s-1s").textContent + "." + qq("#thebutton-s-100ms").textContent + qq("#thebutton-s-10ms").textContent);
  103. if (!clicked) {
  104. if (curTime < lowestTime) {
  105. lowestTime = curTime;
  106. document.title=curTime.toString();
  107. } else {
  108. document.title="the button";
  109. }
  110. }
  111. if (!clicked && (curTime < timeyouwant + 1) && (curtime >= timeyouwant)) {
  112. document.title = "Done!"
  113. qq("#thebutton").click();
  114. clicked=true;
  115. }
  116. qq("#advBOPS").innerHTML = "<b>BOPS:</b> " + curBOPS.toFixed(5);
  117. qq("#advPPM").innerHTML = "<b>Clicks/min:</b> " + Math.round(curPPM);
  118. 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>";
  119. qq("#advLowest").innerHTML = "<b>Lowest Seen:</b> " + lowestTime + "s</span>";
  120. qq("#advSPC").innerHTML = "<b>Avg Secs/Click:</b> " + (1 / curBOPS.toFixed(5)).toFixed(2);
  121. }
  122.  
  123. function main() {
  124. setupABSDisplay();
  125. advStatUpdate();
  126. setInterval(advStatUpdate, advInterval);
  127. }
  128.  
  129.  
  130. main();