NOTWHATCD :: progress to next Class

Shows the progress to the next user classes

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