Advertisement
Guest User

WaniKani Real Times by Penx

a guest
Jul 15th, 2014
571
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.86 KB | None | 0 0
  1. // ==UserScript==
  2. // @name WaniKani Real Times
  3. // @namespace penx.scripts
  4. // @description Replaces WaniKani times with more exact times.
  5. // @include https://www.wanikani.com/*
  6. // @exclude https://www.wanikani.com/review*
  7. // @exclude https://www.wanikani.com/lesson*
  8. // @exclude https://www.wanikani.com/community/people/*
  9. // @exclude https://www.wanikani.com/account
  10. // @exclude https://www.wanikani.com/login
  11. // @version 1.2
  12. // @run-at document-end
  13. // ==/UserScript==
  14.  
  15. function main(){
  16.  
  17. GM_addStyle("time1 { cursor: help; font-family: \"Ubuntu\",Helvetica,Arial,sans-serif; }");
  18. GM_addStyle("time2 { cursor: help; font-family: \"Ubuntu\",Helvetica,Arial,sans-serif; }");
  19. GM_addStyle("time3 { cursor: help; font-family: \"Ubuntu\",Helvetica,Arial,sans-serif; }");
  20. GM_addStyle("time4 { cursor: help; font-family: \"Ubuntu\",Helvetica,Arial,sans-serif; }");
  21. GM_addStyle(".dashboard section.review-status time1 { display: block; margin-bottom: 0.5em; font-size: 36px; font-weight: bold; line-height: 1em; }");
  22. GM_addStyle("time2 { color: rgb(153, 153, 153); text-shadow: 0px 1px 0px rgb(255, 255, 255); }");
  23. GM_addStyle(".dashboard section.system-alert time4 { margin-left: 1em; color: rgb(119, 0, 79); font-weight: 600; text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.3); opacity: 0.45; }");
  24.  
  25. var timeElements = document.getElementsByClassName("timeago");
  26. var currentTime = new Date().valueOf();
  27.  
  28. for(var i=0;i<timeElements.length;i){
  29.  
  30. if(timeElements[i].parentNode.parentNode.parentNode.className.indexOf("review-status") != -1){
  31.  
  32. var reviewTimeHolder = timeElements[i];
  33. var reviewTime = new Date(reviewTimeHolder.getAttribute("datetime")*1000);
  34. var title = reviewTimeHolder.getAttribute("title");
  35. var children = reviewTimeHolder.childNodes;
  36. var parent = reviewTimeHolder.parentNode;
  37. var newNode = document.createElement("time1");
  38. newNode.setAttribute("title", title);
  39. newNode.setAttribute("datetime", reviewTime.valueOf());
  40.  
  41. for(var j=0;j<children.length;j++){
  42.  
  43. newNode.appendChild(children[j]);
  44.  
  45. }
  46.  
  47. parent.replaceChild(newNode,reviewTimeHolder);
  48.  
  49. }else if(timeElements[i].parentNode.parentNode.className.indexOf("system-alert") != -1){
  50.  
  51. var alertTimeHolder = timeElements[i];
  52. var alertTime = new Date(alertTimeHolder.getAttribute("datetime").valueOf());
  53. var title = alertTimeHolder.getAttribute("title");
  54. var children = alertTimeHolder.childNodes;
  55. var parent = alertTimeHolder.parentNode;
  56. var newNode = document.createElement("time4");
  57. newNode.setAttribute("title", title);
  58. newNode.setAttribute("datetime", alertTime.valueOf());
  59.  
  60. for(var j=0;j<children.length;j++){
  61.  
  62. newNode.appendChild(children[j]);
  63.  
  64. }
  65.  
  66. parent.replaceChild(newNode,alertTimeHolder);
  67.  
  68. }else{
  69.  
  70. var theTime = new Date(timeElements[i].getAttribute("datetime")).valueOf();
  71.  
  72. if(theTime){
  73.  
  74. var upCountHolder = timeElements[i];
  75. var upCountTime = new Date(upCountHolder.getAttribute("datetime")).valueOf();
  76. var title = upCountHolder.getAttribute("title");
  77. var children = upCountHolder.childNodes;
  78. var parent = upCountHolder.parentNode;
  79. var newNode = document.createElement("time3");
  80. newNode.setAttribute("title", upCountHolder.getAttribute("title"));
  81. newNode.setAttribute("datetime", upCountTime.valueOf());
  82.  
  83. for(var j=0;j<children.length;j++){
  84.  
  85. newNode.appendChild(children[j]);
  86.  
  87. }
  88.  
  89. parent.replaceChild(newNode,upCountHolder);
  90.  
  91. }else{
  92.  
  93. var downCountHolder = timeElements[i];
  94. var downCountTime = new Date(downCountHolder.getAttribute("datetime")*1000);
  95. var title = downCountHolder.getAttribute("title");
  96. var children = downCountHolder.childNodes;
  97. var parent = downCountHolder.parentNode;
  98. var newNode = document.createElement("time2");
  99. newNode.setAttribute("title", downCountHolder.getAttribute("title"));
  100. newNode.setAttribute("datetime", downCountTime.valueOf());
  101.  
  102. for(var j=0;j<children.length;j++){
  103.  
  104. newNode.appendChild(children[j]);
  105.  
  106. }
  107.  
  108. parent.replaceChild(newNode,downCountHolder);
  109.  
  110. }
  111.  
  112. }
  113.  
  114. }
  115.  
  116. alertCount = document.getElementsByTagName("time4");
  117. reviewCount = document.getElementsByTagName("time1");
  118.  
  119. downCounters = document.getElementsByTagName("time2");
  120. upCounters = document.getElementsByTagName("time3");
  121.  
  122. function newTimes(){
  123.  
  124. updateUpCounters(upCounters);
  125. updateUpCounters(alertCount);
  126. updateDownCounters(downCounters);
  127. updateDownCounters(reviewCount);
  128.  
  129. }
  130.  
  131. newTimes();
  132. window.setInterval(newTimes,30000);
  133.  
  134. }
  135.  
  136. window.addEventListener("load", main, false);
  137.  
  138. function updateUpCounters(up){
  139.  
  140. var currentTime = new Date();
  141.  
  142. for(var i=0;i<up.length;i++){
  143.  
  144. var diff = currentTime - up[i].getAttribute("datetime");
  145. var x = diff / 60000;
  146. var minutes = parseInt(x % 60);
  147.  
  148. if(minutes == 0){
  149.  
  150. minutes = "";
  151.  
  152. }else if(minutes > 1){
  153.  
  154. minutes += " minutes ";
  155.  
  156. }else{
  157.  
  158. minutes += " minute ";
  159.  
  160. }
  161.  
  162. x /= 60;
  163. var hours = parseInt(x % 24);
  164.  
  165. if(hours == 0){
  166.  
  167. hours = "";
  168.  
  169. }else if(hours > 1){
  170.  
  171. hours += " hours ";
  172.  
  173. }else{
  174.  
  175. hours += " hour ";
  176.  
  177. }
  178.  
  179. x /= 24;
  180. var days = parseInt(x % 30);
  181.  
  182. if(days == 0){
  183.  
  184. days = "";
  185.  
  186. }else if(days > 1){
  187.  
  188. days += " days ";
  189.  
  190. }else{
  191.  
  192. days += " day ";
  193.  
  194. }
  195.  
  196. x /= 30;
  197. var months = parseInt(x);
  198.  
  199. if(months == 0){
  200.  
  201. months = "";
  202.  
  203. }else if(months > 1){
  204.  
  205. months += " months ";
  206.  
  207. }else{
  208.  
  209. months += " month ";
  210.  
  211. }
  212.  
  213. var output = "";
  214.  
  215. if(diff > 7776000000){
  216.  
  217. output = months + "ago";
  218.  
  219. }else if(diff > 2592000000){
  220.  
  221. output = months + days + "ago";
  222.  
  223. }else if(diff > 259200000){
  224.  
  225. output = days + "ago";
  226.  
  227. }else if(diff > 86400000){
  228.  
  229. output = days + hours + "ago";
  230.  
  231. }else if(diff > 3600000){
  232.  
  233. output = hours + minutes + "ago";
  234.  
  235. }else if(diff > 60000){
  236.  
  237. output = minutes + "ago";
  238.  
  239. }else{
  240.  
  241. output = "Just now";
  242.  
  243. }
  244.  
  245. up[i].innerHTML = output;
  246.  
  247. }
  248.  
  249. }
  250.  
  251. function updateDownCounters(down){
  252.  
  253. var currentTime = new Date();
  254.  
  255. for(var i=0;i<down.length;i++){
  256.  
  257. var diff = down[i].getAttribute("datetime") - currentTime;
  258. var x = diff / 60000;
  259. var minutes = parseInt(x % 60);
  260.  
  261. if(minutes == 0){
  262.  
  263. minutes = "";
  264.  
  265. }else if(minutes > 1){
  266.  
  267. minutes += " minutes ";
  268.  
  269. }else{
  270.  
  271. minutes += " minute ";
  272.  
  273. }
  274.  
  275. x /= 60;
  276. var hours = parseInt(x % 24);
  277.  
  278. if(hours == 0){
  279.  
  280. hours = "";
  281.  
  282. }else if(hours > 1){
  283.  
  284. hours += " hours ";
  285.  
  286. }else{
  287.  
  288. hours += " hour ";
  289.  
  290. }
  291.  
  292. x /= 24;
  293. var days = parseInt(x % 30);
  294.  
  295. if(days == 0){
  296.  
  297. days = "";
  298.  
  299. }else if(days > 1){
  300.  
  301. days += " days ";
  302.  
  303. }else{
  304.  
  305. days += " day ";
  306. }
  307.  
  308. x /= 30;
  309. var months = parseInt(x);
  310.  
  311. if(months == 0){
  312.  
  313. months = "";
  314.  
  315. }else if(months > 1){
  316.  
  317. months += " months ";
  318.  
  319. }else{
  320.  
  321. months += " month ";
  322.  
  323. }
  324.  
  325. var output = "";
  326.  
  327. if(diff < 0 || (window.location.href.indexOf("dashboard") != -1 && document.getElementsByClassName("reviews")[0].getElementsByTagName("span")[0].innerHTML != "0")){
  328.  
  329. output = "Available Now";
  330.  
  331. }else if(diff > 7776000000){
  332.  
  333. output = months;
  334.  
  335. }else if(diff > 2592000000){
  336.  
  337. output = months + days;
  338.  
  339. }else if(diff > 259200000){
  340.  
  341. output = days;
  342.  
  343. }else if(diff > 86400000){
  344.  
  345. output = days + hours;
  346.  
  347. }else if(diff > 3600000){
  348.  
  349. output = hours + minutes;
  350.  
  351. }else if(diff > 60000){
  352.  
  353. output = minutes;
  354.  
  355. }else{
  356.  
  357. output = "Soon&#8482;";
  358.  
  359. }
  360.  
  361. down[i].innerHTML = output;
  362.  
  363. }
  364.  
  365. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement