🏠 Home 

notwhat.cd progress to next Class

Shows the progress to the next user classes


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