PTH stats since last

Displays the changes in stats on PTH and PTP

  1. // ==UserScript==
  2. // @name PTH stats since last
  3. // @version 1.4
  4. // @description Displays the changes in stats on PTH and PTP
  5. // @author Chameleon
  6. // @include http*://*redacted.ch/*
  7. // @include http*://*passthepopcorn.me/*
  8. // @grant GM_getValue
  9. // @grant GM_setValue
  10. // @namespace https://greasyfork.org/users/87476
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. if((window.location.href.indexOf("threadid=1781") != -1 && window.location.host.indexOf('redacted') != -1) || (window.location.href.indexOf("threadid=30532") != -1 && window.location.host.indexOf('popcorn') != -1))
  17. showSettings();
  18.  
  19. var currentStats = {};
  20. var statspans = document.getElementById('userinfo_stats').querySelectorAll('span');
  21. currentStats.up = parseStats(statspans[0].textContent);
  22. currentStats.down = parseStats(statspans[1].textContent);
  23. currentStats.ratio = parseFloat(statspans[2].textContent);
  24. if(window.location.href.indexOf("redacted.ch") !== -1 && !isNaN(parseFloat(statspans[0].title)))
  25. {
  26. currentStats.up = parseStats(statspans[0].title);
  27. currentStats.down = parseStats(statspans[1].title);
  28. currentStats.ratio = parseFloat(statspans[2].title);
  29. }
  30. if(isNaN(currentStats.ratio))
  31. currentStats.ratio = 0;
  32. currentStats.time=(new Date())*1;
  33.  
  34. var oldStats = window.localStorage.lastStats;
  35.  
  36. if(!oldStats)
  37. oldStats = {up:currentStats.up, down:currentStats.down, ratio:currentStats.ratio};
  38. else
  39. oldStats = JSON.parse(oldStats);
  40.  
  41.  
  42. var settings = getSettings();
  43.  
  44. if(settings.persistTime && oldStats.time)
  45. {
  46. var difTime = (new Date())-oldStats.time;
  47. if(difTime > settings.persistTime*60000)
  48. window.localStorage.lastStats = JSON.stringify(currentStats);
  49. }
  50. else
  51. window.localStorage.lastStats = JSON.stringify(currentStats);
  52.  
  53. var difTime=false;
  54. if(oldStats.time)
  55. {
  56. difTime = (new Date())-oldStats.time;
  57. }
  58.  
  59. var li=false;
  60. if(settings.showBuffer)
  61. {
  62. li=document.createElement('li');
  63. if(window.location.host.indexOf('popcorn') != -1)
  64. li.setAttribute('class', 'user-info-bar__item');
  65. var before=document.getElementById('stats_ratio');
  66. before.parentNode.insertBefore(li, before);
  67. var buffer=renderStats((currentStats.up/1.05)-currentStats.down);
  68. if(window.location.host.indexOf('redacted') != -1)
  69. buffer=renderStats((currentStats.up/0.6)-currentStats.down);
  70. li.innerHTML='Buffer: <span class="stat">'+buffer+'</span>';
  71. li.setAttribute('id', 'stats_buffer');
  72. }
  73.  
  74. var change = {up:currentStats.up-oldStats.up, down:currentStats.down-oldStats.down, ratio:Math.round((currentStats.ratio-oldStats.ratio)*100)/100};
  75. if(settings.profileOnly && window.location.href.indexOf(document.getElementById('nav_userinfo').getElementsByTagName('a')[0].href) == -1)
  76. return;
  77. if(change.up != 0 || settings.noChange)
  78. {
  79. statspans[0].innerHTML += ' <span class="stats_last up">('+renderStats(change.up)+')</span>';
  80. if(difTime)
  81. statspans[0].title = (prettyTime(difTime))+' ago';
  82. }
  83. if(change.down != 0 || settings.noChange)
  84. {
  85. statspans[1].innerHTML += ' <span class="stats_last down">('+renderStats(change.down)+')</span>';
  86. if(difTime)
  87. statspans[1].title = (prettyTime(difTime))+' ago';
  88. }
  89. if((change.up != 0 || change.down != 0 || settings.noChange) && settings.showBuffer)
  90. {
  91. var span=li.getElementsByTagName('span')[0];
  92. var buffer=renderStats((change.up/1.05)-change.down);
  93. if(window.location.host.indexOf('redacted') != -1)
  94. buffer=renderStats((change.up/0.6)-change.down);
  95. span.innerHTML += ' <span class="stats_last buffer">('+buffer+')</span>';
  96. if(difTime)
  97. span.title = (prettyTime(difTime))+' ago';
  98. }
  99. if(change.ratio != 0 || settings.noChange)
  100. {
  101. statspans[2].innerHTML += ' <span class="stats_last ratio">('+change.ratio+')</span>';
  102. if(difTime)
  103. statspans[2].title = (prettyTime(difTime))+' ago';
  104. }
  105.  
  106. if(settings.alert && (change.up != 0 || change.down != 0 || change.ratio != 0))
  107. alert('Up: '+renderStats(change.up)+', Down: '+renderStats(change.down)+', Buffer: '+renderStats((change.up/1.05)-change.down)+', Ratio: '+change.ratio);
  108. })();
  109.  
  110. function prettyTime(time)
  111. {
  112. var t=time;
  113. if(t/60000 < 1)
  114. return Math.round(time/1000)+'s';
  115. if(t/(60000*60) < 1)
  116. return Math.round(time/60000)+'m';
  117. if(t/(60000*60*24) < 1)
  118. return Math.round(time/(60000*60))+'h';
  119. return Math.round(time/(60000*60*24))+'d '+(Math.round((time%(60000*60*24))/(60000*60)))+'h';
  120. }
  121.  
  122. function showSettings()
  123. {
  124. var before = document.getElementsByClassName('forum_post')[0];
  125. var div = document.createElement('div');
  126. before.parentNode.insertBefore(div, before);
  127. div.setAttribute('style', 'width: 100%; text-align: center; padding-bottom: 10px;');
  128. div.setAttribute('class', 'box');
  129. div.innerHTML = '<h2>PTH stats since last Settings</h2><br />';
  130. var settings = getSettings();
  131.  
  132. var a=document.createElement('a');
  133. a.href='javascript:void(0);';
  134. a.innerHTML = 'Show on no change: '+(settings.noChange ? 'On' : 'Off');
  135. a.addEventListener('click', changeSetting.bind(undefined, a), false);
  136. div.appendChild(a);
  137. div.appendChild(document.createElement('br'));
  138.  
  139. var a=document.createElement('a');
  140. a.href='javascript:void(0);';
  141. a.innerHTML = 'Show on profile only: '+(settings.profileOnly ? 'On' : 'Off');
  142. a.addEventListener('click', changeSetting.bind(undefined, a), false);
  143. div.appendChild(a);
  144. div.appendChild(document.createElement('br'));
  145.  
  146. var a=document.createElement('a');
  147. a.href='javascript:void(0);';
  148. a.innerHTML = 'Show buffer: '+(settings.showBuffer ? 'On' : 'Off');
  149. a.addEventListener('click', changeSetting.bind(undefined, a), false);
  150. div.appendChild(a);
  151. div.appendChild(document.createElement('br'));
  152.  
  153. var a=document.createElement('a');
  154. a.href='javascript:void(0);';
  155. a.innerHTML = 'Alert on change: '+(settings.alert ? 'On' : 'Off');
  156. a.addEventListener('click', changeSetting.bind(undefined, a), false);
  157. div.appendChild(a);
  158. div.appendChild(document.createElement('br'));
  159.  
  160. var input=document.createElement('input');
  161. input.setAttribute('placeholder', 'Persist Time');
  162. input.type='number';
  163. input.value = settings.persistTime ? settings.persistTime:'';
  164. div.appendChild(input);
  165. input.addEventListener('change', changeInput.bind(undefined, input), false);
  166. div.appendChild(document.createElement('br'));
  167.  
  168. var a=document.createElement('a');
  169. a.href='javascript:void(0);';
  170. a.innerHTML = 'Save';
  171. div.appendChild(a);
  172. div.appendChild(document.createElement('br'));
  173. }
  174.  
  175. function changeInput(input)
  176. {
  177. var settings = getSettings();
  178. settings.persistTime=input.value;
  179. GM_setValue('lastStatsSettings', JSON.stringify(settings));
  180. }
  181.  
  182. function changeSetting(a)
  183. {
  184. var on=false;
  185. if(a.innerHTML.indexOf('On') == -1)
  186. {
  187. on=true;
  188. a.innerHTML = a.innerHTML.replace('Off', 'On');
  189. }
  190. else
  191. {
  192. a.innerHTML = a.innerHTML.replace('On', 'Off');
  193. }
  194.  
  195. var settings = getSettings();
  196. if(a.innerHTML.indexOf('no change') != -1)
  197. {
  198. settings.noChange = on;
  199. }
  200. else if(a.innerHTML.indexOf('profile only') != -1)
  201. {
  202. settings.profileOnly = on;
  203. }
  204. else if(a.innerHTML.indexOf('Alert') != -1)
  205. {
  206. settings.alert = on;
  207. }
  208. else if(a.innerHTML.indexOf('Show buffer') != -1)
  209. {
  210. settings.showBuffer = on;
  211. }
  212. GM_setValue('lastStatsSettings', JSON.stringify(settings));
  213. }
  214.  
  215. function getSettings()
  216. {
  217. var settings = GM_getValue('lastStatsSettings', false);
  218. if(!settings)
  219. {
  220. settings = {noChange: false, profileOnly: false, alert: false, showBuffer: false, persistTime: ''};
  221. }
  222. else
  223. settings = JSON.parse(settings);
  224. return settings;
  225. }
  226.  
  227. function renderStats(number)
  228. {
  229. var amount = number;
  230. var pow = 0;
  231. for(var i=10; i<=50; i=i+10)
  232. {
  233. if(Math.abs(amount)/Math.pow(2, i) > 1)
  234. pow=i/10;
  235. }
  236. var suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
  237. if(window.location.host.indexOf('popcorn') != -1)
  238. suffixes = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'];
  239. return (Math.round(amount/Math.pow(2, pow*10)*100))/100+' '+suffixes[pow];
  240. }
  241.  
  242. function parseStats(string)
  243. {
  244. string=string.replace(/,/g, '');
  245. var suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
  246. if(window.location.host.indexOf('popcorn') != -1)
  247. suffixes = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'];
  248. var amount = parseFloat(string);
  249. if(string.indexOf(suffixes[1]) != -1)
  250. amount = amount*Math.pow(2, 10);
  251. else if(string.indexOf(suffixes[2]) != -1)
  252. amount = amount*Math.pow(2, 20);
  253. else if(string.indexOf(suffixes[3]) != -1)
  254. amount = amount*Math.pow(2, 30);
  255. else if(string.indexOf(suffixes[4]) != -1)
  256. amount = amount*Math.pow(2, 40);
  257. else if(string.indexOf(suffixes[5]) != -1)
  258. amount = amount*Math.pow(2, 50);
  259. return Math.round(amount);
  260. }