🏠 Home 

Gazelle progress to next Class

Shows the progress to the next user classes


Install this script?
  1. // ==UserScript==
  2. // @name Gazelle progress to next Class
  3. // @version 0.6
  4. // @description Shows the progress to the next user classes
  5. // @author arch
  6. // @match http*://*apollo.rip/user.php?id=*
  7. // @match http*://*passtheheadphones.me/user.php?id=*
  8. // @grant none
  9. // @namespace https://greasyfork.org/users/90188
  10. // ==/UserScript==
  11. (function() {
  12. 'use strict';
  13. var ourId=document.getElementById('nav_userinfo').getElementsByTagName('a')[0].href.split('?id=')[1];
  14. var r=new RegExp(ourId+'$');
  15. if(window.location.href.match(r) === null)
  16. return;
  17. var div=document.createElement('div');
  18. div.setAttribute('class', 'box box_info box_userinfo_nextclass');
  19. var before=document.getElementsByClassName('box_userinfo_percentile')[0];
  20. before.parentNode.insertBefore(div, before);
  21. renderStats();
  22. })();
  23. function renderStats(index)
  24. {
  25. var requirements=[
  26. {title:'User', time: 0, upload: 0, ratio:0, torrents:0, perfectFLACs: 0, uniqueGroups: 0},
  27. {title:'Member', time: 604800, upload: 10737418240, torrents:0, ratio:0.65, perfectFLACs: 0, uniqueGroups: 0},
  28. {title:'Power User', time: 1209600, upload: 26843545600, torrents:10, ratio:1.05, perfectFLACs: 0, uniqueGroups: 0},
  29. {title:'Elite', time: 2419200, upload: 107374182400, ratio:1.05, torrents:50, perfectFLACs: 0, uniqueGroups: 0},
  30. {title:'Torrent Master', time: 4838400, upload: 536870912000, ratio:1.05, torrents:500, perfectFLACs: 0, uniqueGroups: 0},
  31. {title:'Power TM', time: 4838400, upload: 536870912000, ratio:1.05, torrents:500, perfectFLACs: 0, uniqueGroups: 500},
  32. {title:'Elite TM', time: 4838400, upload: 536870912000, ratio:1.05, torrents:500, perfectFLACs: 500, uniqueGroups: 500},
  33. ];
  34. var div=document.getElementsByClassName('box_userinfo_nextclass')[0];
  35. div.innerHTML = '';
  36. var header=document.createElement('div');
  37. header.setAttribute('class', 'head colhead_dark');
  38. header.innerHTML = 'Class Progress (';
  39. div.appendChild(header);
  40. var hideCompleted=window.localStorage.classProgressShowComplete != "false";
  41. var a=document.createElement('a');
  42. header.appendChild(a);
  43. a.innerHTML = (hideCompleted ? 'Show':'Hide')+' completed';
  44. a.href='javascript:void(0);';
  45. header.appendChild(document.createTextNode(')'));
  46. var time=document.getElementsByClassName('time')[0];
  47. if(!time.title)
  48. {
  49. div.innerHTML += 'Styled tooltips must be turned off for this to work. (This can be found in your profile settings)';
  50. return;
  51. }
  52. var s = getCurrentStats();
  53. if(isNaN(index))
  54. index=findNextClass(s, requirements);
  55. if(index >= requirements.length)
  56. index=0;
  57. a.addEventListener('click', toggleCompleted.bind(undefined, index, hideCompleted), false);
  58. var r=requirements[index];
  59. var stats=document.createElement('ul');
  60. stats.setAttribute('class', 'stats nobullet');
  61. div.appendChild(stats);
  62. var li=document.createElement('li');
  63. stats.appendChild(li);
  64. li.appendChild(document.createTextNode('Class: '));
  65. var a=document.createElement('a');
  66. li.appendChild(a);
  67. a.href='javascript:void(0);';
  68. a.innerHTML = r.title;
  69. a.addEventListener('click', renderStats.bind(undefined, index+1), false);
  70. var li=document.createElement('li');
  71. stats.appendChild(li);
  72. var percent=Math.round((s.ratio/r.ratio)*100);
  73. var span=document.createElement('span');
  74. if(percent >= 100 || s.ratio == 'Infinite')
  75. {
  76. span.style.color='green';
  77. if(hideCompleted)
  78. li.setAttribute('style', 'display:none;');
  79. }
  80. if(s.ratio == "Infinite")
  81. percent='∞';
  82. else
  83. percent=percent.toLocaleString();
  84. li.innerHTML = 'Ratio: ';
  85. span.innerHTML=(s.ratio == "Infinite" ? '∞':(Math.floor(s.ratio*100))/100)+' / '+r.ratio+' ('+percent+'%)';
  86. li.appendChild(span);
  87. var li=document.createElement('li');
  88. stats.appendChild(li);
  89. if(r.time === 0)
  90. percent='∞';
  91. else
  92. percent=Math.round((s.time/r.time)*100);
  93. var span=document.createElement('span');
  94. if(r.time === 0 || percent >= 100)
  95. {
  96. span.style.color='green';
  97. if(hideCompleted)
  98. li.setAttribute('style', 'display:none;');
  99. }
  100. if(r.time !== 0)
  101. percent=percent.toLocaleString();
  102. li.innerHTML = 'Time: ';
  103. span.innerHTML=prettyTime(s.time)+' / '+prettyTime(r.time)+' ('+percent+'%)';
  104. li.appendChild(span);
  105. var li=document.createElement('li');
  106. stats.appendChild(li);
  107. if(r.upload === 0)
  108. percent='∞';
  109. else
  110. percent=Math.round((s.upload/r.upload)*100);
  111. var span=document.createElement('span');
  112. if(r.upload === 0 || percent >= 100)
  113. {
  114. span.style.color='green';
  115. if(hideCompleted)
  116. li.setAttribute('style', 'display:none;');
  117. }
  118. if(r.upload !== 0)
  119. percent=percent.toLocaleString();
  120. li.innerHTML = 'Upload: ';
  121. span.innerHTML=prettySize(s.upload)+' / '+prettySize(r.upload)+' ('+percent+'%)';
  122. li.appendChild(span);
  123. var li=document.createElement('li');
  124. stats.appendChild(li);
  125. if(r.torrents === 0)
  126. percent='∞';
  127. else
  128. percent=Math.round((s.torrents/r.torrents)*100);
  129. var span=document.createElement('span');
  130. if(r.torrents === 0 || percent >= 100)
  131. {
  132. span.style.color='green';
  133. if(hideCompleted)
  134. li.setAttribute('style', 'display:none;');
  135. }
  136. if(r.upload !== 0)
  137. percent=percent.toLocaleString();
  138. li.innerHTML = 'Torrents: ';
  139. span.innerHTML=s.torrents.toLocaleString()+' / '+r.torrents+' ('+percent+'%)';
  140. li.appendChild(span);
  141. var li=document.createElement('li');
  142. stats.appendChild(li);
  143. if(r.uniqueGroups === 0)
  144. percent='∞';
  145. else
  146. percent=Math.round((s.uniqueGroups/r.uniqueGroups)*100);
  147. var span=document.createElement('span');
  148. if(r.uniqueGroups === 0 || percent >= 100)
  149. {
  150. span.style.color='green';
  151. if(hideCompleted)
  152. li.setAttribute('style', 'display:none;');
  153. }
  154. if(r.uniqueGroups !== 0)
  155. percent=percent.toLocaleString();
  156. li.innerHTML = 'Unique Groups: ';
  157. span.innerHTML=s.uniqueGroups.toLocaleString()+' / '+r.uniqueGroups+' ('+percent+'%)';
  158. li.appendChild(span);
  159. var li=document.createElement('li');
  160. stats.appendChild(li);
  161. if(r.perfectFLACs === 0)
  162. percent='∞';
  163. else
  164. percent=Math.round((s.perfectFLACs/r.perfectFLACs)*100);
  165. var span=document.createElement('span');
  166. if(r.perfectFLACs === 0 || percent >= 100)
  167. {
  168. span.style.color='green';
  169. if(hideCompleted)
  170. li.setAttribute('style', 'display:none;');
  171. }
  172. if(r.perfectFLACs !== 0)
  173. percent=percent.toLocaleString();
  174. li.innerHTML = 'Perfect FLACs: ';
  175. span.innerHTML=s.perfectFLACs.toLocaleString()+' / '+r.perfectFLACs+' ('+percent+'%)';
  176. li.appendChild(span);
  177. }
  178. function toggleCompleted(index, state)
  179. {
  180. if(state)
  181. {
  182. window.localStorage.classProgressShowComplete = "false";
  183. }
  184. else
  185. {
  186. window.localStorage.classProgressShowComplete = "true";
  187. }
  188. renderStats(index);
  189. }
  190. function prettyTime(time)
  191. {
  192. var weeks=Math.floor(time/604800);
  193. var days=Math.floor((time%604800)/86400);
  194. var res=weeks+'w'+(days !== 0 ?', '+days+'d':'');
  195. return res;
  196. }
  197. function findNextClass(s, requirements)
  198. {
  199. var i=requirements.length-1;
  200. for(; i>-1; i--)
  201. {
  202. var r=requirements[i];
  203. if(s.time >= r.time && s.upload >= r.upload && (s.ratio == "Infinite" || s.ratio >= r.ratio) && s.torrents >= r.torrents && s.perfectFLACs >= r.perfectFLACs && s.uniqueGroups >= r.uniqueGroups)
  204. break;
  205. }
  206. i++;
  207. if(i>=requirements.length)
  208. i=requirements.length-1;
  209. return i;
  210. }
  211. function getCurrentStats()
  212. {
  213. var time=((new Date())-(new Date(document.getElementsByClassName('time')[0].title+' UTC')))/1000;
  214. var upload=unPretty(document.getElementsByClassName('box_userinfo_stats')[0].getElementsByTagName('li')[2].title);
  215. var torrents=parseInt(document.getElementsByClassName('box_userinfo_percentile')[0].getElementsByTagName('li')[2].title.replace(',', ''));
  216. var ratio=document.getElementsByClassName('box_userinfo_stats')[0].getElementsByTagName('li')[4].getElementsByTagName('span')[0].title.replace(',', '');
  217. var perfectFLACs=parseInt(document.getElementById('comm_perfectflac').textContent.split(': ')[1].replace(',', ''));
  218. var uniqueGroups=parseInt(document.getElementById('comm_uniquegroup').textContent.split(': ')[1].replace(',', ''));
  219. if(ratio != "Infinite")
  220. ratio = parseFloat(ratio);
  221. return {time:time, upload:upload, torrents:torrents, ratio:ratio, perfectFLACs:perfectFLACs, uniqueGroups:uniqueGroups};
  222. }
  223. function unPretty(size)
  224. {
  225. var s=parseFloat(size);
  226. if(size.indexOf('KB') != -1)
  227. s = s*Math.pow(2, 10);
  228. else if(size.indexOf('MB') != -1)
  229. s = s*Math.pow(2, 20);
  230. else if(size.indexOf('GB') != -1)
  231. s = s*Math.pow(2, 30);
  232. else if(size.indexOf('TB') != -1)
  233. s = s*Math.pow(2, 40);
  234. else if(size.indexOf('PB') != -1)
  235. s = s*Math.pow(2, 50);
  236. return Math.round(s);
  237. }
  238. function prettySize(size)
  239. {
  240. var newSize=size;
  241. var i=0;
  242. while(newSize > 1)
  243. {
  244. i++;
  245. newSize = size/Math.pow(2, i*10);
  246. }
  247. i--;
  248. if(i<0)
  249. i=0;
  250. newSize=size/Math.pow(2, (i)*10);
  251. var suffixes=["B", "KB", "MB", "GB", "TB", "PB"];
  252. newSize = Math.round(newSize*100)/100;
  253. newSize = newSize+' '+suffixes[i];
  254. return newSize;
  255. }