PTH stats since last

Displays the changes in stats on PTH

目前为 2016-12-17 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name PTH stats since last
  3. // @version 0.5
  4. // @description Displays the changes in stats on PTH
  5. // @author Chameleon
  6. // @include http*://*passtheheadphones.me/*
  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. if((window.location.href.indexOf("threadid=1781") != -1 && window.location.host.indexOf('headphones') != -1) || (window.location.href.indexOf("threadid=30532") != -1 && window.location.host.indexOf('popcorn') != -1))
  16. showSettings();
  17.  
  18. var currentStats = {};
  19. var statspans = document.getElementById('userinfo_stats').querySelectorAll('span');
  20. currentStats.up = parseStats(statspans[0].textContent);
  21. currentStats.down = parseStats(statspans[1].textContent);
  22. currentStats.ratio = parseFloat(statspans[2].textContent);
  23. if(isNaN(currentStats.ratio))
  24. currentStats.ratio = 0;
  25.  
  26. var oldStats = window.localStorage.lastStats;
  27.  
  28. if(!oldStats)
  29. oldStats = {up:currentStats.up, down:currentStats.down, ratio:currentStats.ratio};
  30. else
  31. oldStats = JSON.parse(oldStats);
  32. window.localStorage.lastStats = JSON.stringify(currentStats);
  33.  
  34. var settings = getSettings();
  35. var li=false;
  36. if(settings.showBuffer)
  37. {
  38. li=document.createElement('li');
  39. var before=document.getElementById('stats_ratio');
  40. before.parentNode.insertBefore(li, before);
  41. li.innerHTML='Buffer: <span class="stat">'+renderStats((currentStats.up/1.05)-currentStats.down)+'</span>';
  42. }
  43.  
  44. var change = {up:currentStats.up-oldStats.up, down:currentStats.down-oldStats.down, ratio:Math.round((currentStats.ratio-oldStats.ratio)*100)/100};
  45. if(settings.profileOnly && window.location.href.indexOf(document.getElementById('nav_userinfo').getElementsByTagName('a')[0].href) == -1)
  46. return;
  47. if(change.up != 0 || settings.noChange)
  48. statspans[0].innerHTML += ' ('+renderStats(change.up)+')';
  49. if(change.down != 0 || settings.noChange)
  50. statspans[1].innerHTML += ' ('+renderStats(change.down)+')';
  51. if((change.up != 0 || change.down != 0 || settings.noChange) && settings.showBuffer)
  52. {
  53. var span=li.getElementsByTagName('span')[0];
  54. span.innerHTML += ' ('+renderStats(change.up-change.down)+')</span>';
  55. }
  56. if(change.ratio != 0 || settings.noChange)
  57. statspans[2].innerHTML += ' ('+change.ratio+')';
  58. if(settings.alert && (change.up != 0 || change.down != 0 || change.ratio != 0))
  59. alert('Up: '+renderStats(change.up)+', Down: '+renderStats(change.down)+', Buffer: '+renderStats((change.up/1.05)-change.down)+', Ratio: '+change.ratio);
  60. })();
  61.  
  62. function showSettings()
  63. {
  64. var before = document.getElementsByClassName('forum_post')[0];
  65. var div = document.createElement('div');
  66. before.parentNode.insertBefore(div, before);
  67. div.setAttribute('style', 'width: 100%; text-align: center; padding-bottom: 10px;');
  68. div.setAttribute('class', 'box');
  69. div.innerHTML = '<h2>PTH stats since last Settings</h2><br />';
  70. var settings = getSettings();
  71. var a=document.createElement('a');
  72. a.href='javascript:void(0);';
  73. a.innerHTML = 'Show on no change: '+(settings.noChange ? 'On' : 'Off');
  74. a.addEventListener('click', changeSetting.bind(undefined, a), false);
  75. div.appendChild(a);
  76. div.appendChild(document.createElement('br'));
  77. var a=document.createElement('a');
  78. a.href='javascript:void(0);';
  79. a.innerHTML = 'Show on profile only: '+(settings.profileOnly ? 'On' : 'Off');
  80. a.addEventListener('click', changeSetting.bind(undefined, a), false);
  81. div.appendChild(a);
  82. div.appendChild(document.createElement('br'));
  83. var a=document.createElement('a');
  84. a.href='javascript:void(0);';
  85. a.innerHTML = 'Show buffer: '+(settings.showBuffer ? 'On' : 'Off');
  86. a.addEventListener('click', changeSetting.bind(undefined, a), false);
  87. div.appendChild(a);
  88. div.appendChild(document.createElement('br'));
  89. var a=document.createElement('a');
  90. a.href='javascript:void(0);';
  91. a.innerHTML = 'Alert on change: '+(settings.alert ? 'On' : 'Off');
  92. a.addEventListener('click', changeSetting.bind(undefined, a), false);
  93. div.appendChild(a);
  94. div.appendChild(document.createElement('br'));
  95. }
  96.  
  97. function changeSetting(a)
  98. {
  99. var on=false;
  100. if(a.innerHTML.indexOf('On') == -1)
  101. {
  102. on=true;
  103. a.innerHTML = a.innerHTML.replace('Off', 'On');
  104. }
  105. else
  106. {
  107. a.innerHTML = a.innerHTML.replace('On', 'Off');
  108. }
  109. var settings = getSettings();
  110. if(a.innerHTML.indexOf('no change') != -1)
  111. {
  112. settings.noChange = on;
  113. }
  114. else if(a.innerHTML.indexOf('profile only') != -1)
  115. {
  116. settings.profileOnly = on;
  117. }
  118. else if(a.innerHTML.indexOf('Alert') != -1)
  119. {
  120. settings.alert = on;
  121. }
  122. else if(a.innerHTML.indexOf('Show buffer') != -1)
  123. {
  124. settings.showBuffer = on;
  125. }
  126. GM_setValue('lastStatsSettings', JSON.stringify(settings));
  127. }
  128.  
  129. function getSettings()
  130. {
  131. var settings = GM_getValue('lastStatsSettings', false);
  132. if(!settings)
  133. {
  134. settings = {noChange: false, profileOnly: false, alert: false, showBuffer: false};
  135. }
  136. else
  137. settings = JSON.parse(settings);
  138. return settings;
  139. }
  140.  
  141. function renderStats(number)
  142. {
  143. var amount = number;
  144. var pow = 0;
  145. for(var i=10; i<=50; i=i+10)
  146. {
  147. if(Math.abs(amount)/Math.pow(2, i) > 1)
  148. pow=i/10;
  149. }
  150. var suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
  151. return (Math.round(amount/Math.pow(2, pow*10)*100))/100+' '+suffixes[pow];
  152. }
  153.  
  154. function parseStats(string)
  155. {
  156. var amount = parseFloat(string);
  157. if(string.indexOf('KB') != -1)
  158. amount = amount*Math.pow(2, 10);
  159. else if(string.indexOf('MB') != -1)
  160. amount = amount*Math.pow(2, 20);
  161. else if(string.indexOf('GB') != -1)
  162. amount = amount*Math.pow(2, 30);
  163. else if(string.indexOf('TB') != -1)
  164. amount = amount*Math.pow(2, 40);
  165. else if(string.indexOf('PB') != -1)
  166. amount = amount*Math.pow(2, 50);
  167. return Math.round(amount);
  168. }