WaniKani Level Duration

This will display the number of days since your last level-up. Two display options are offered. By RhosVeedcy.

当前为 2014-03-29 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name WaniKani Level Duration
  3. // @namespace https://www.wanikani.com
  4. // @description This will display the number of days since your last level-up. Two display options are offered. By RhosVeedcy.
  5. // @version 1.1
  6. // @include https://www.wanikani.com/*
  7. // @include http://www.wanikani.com/*
  8. // @run-at document-end
  9. // @grant GM_registerMenuCommand
  10.  
  11. // ==/UserScript==
  12.  
  13.  
  14. function get(id) {
  15. console.log('get fct');
  16. if (id && typeof id === 'string') {
  17. console.log(id);
  18. id = document.getElementById(id);
  19. }
  20. return id || null;
  21. }
  22.  
  23.  
  24. function dateSuffix(d) {
  25. if(d>3 && d<21) return 'th'; // http://stackoverflow.com/questions/15397372/javascript-new-date-ordinal-st-nd-rd-th
  26. switch (d % 10) {
  27. case 1: return "st";
  28. case 2: return "nd";
  29. case 3: return "rd";
  30. default: return "th";
  31. }
  32. }
  33.  
  34.  
  35. function GMsetup() {
  36.  
  37. if (GM_registerMenuCommand) {
  38.  
  39. GM_registerMenuCommand('WaniKani Level Duration: Switch display type', function() {
  40. var curDType = localStorage.getItem("WKlvldurDType") || 0;
  41. curDType++;
  42. curDType %= 2;
  43. localStorage.setItem("WKlvldurDType", curDType);
  44. location.reload();
  45. });
  46.  
  47. GM_registerMenuCommand('WaniKani Level Duration: Set manually', function() {
  48. var minusDays = prompt('How many days ago did you level up?');
  49. if (minusDays != null) {
  50. minusDays = Number(minusDays);
  51. if (isNaN(minusDays) || minusDays < 0) {
  52. return;
  53. }
  54. var d = new Date();
  55. var n = d.getTime();
  56. minusDays *= 24*60*60*1000;
  57. localStorage.setItem("WKlvlupLevTime", n - minusDays); // record level-up time
  58. location.reload();
  59. }
  60. });
  61.  
  62. }
  63. }
  64.  
  65.  
  66. function checkLevel() {
  67.  
  68. console.log("checkLevel() start");
  69.  
  70. var lastKnownLevel = localStorage.getItem("WKlvlupPrevLevel") || 1;
  71. var curlevel = document.getElementsByClassName("levels")[0].getElementsByTagName("span")[0].innerHTML || lastKnownLevel;
  72.  
  73. var prev = Number(lastKnownLevel);
  74. var cur = Number(curlevel);
  75. var next = prev + 1;
  76.  
  77. if (cur == next) {
  78. console.log("leveled up!");
  79. var d = new Date();
  80. var n = d.getTime();
  81. localStorage.setItem("WKlvlupLevTime", n); // record level-up time
  82. localStorage.setItem("WKlvlupPrevLevel", cur); // update 'lastKnownLevel' for next time
  83.  
  84. } else if (cur != prev) {
  85. // either this is the first time we're running, or there's a different user here,
  86. // or the user's subscription status has changed, or something else weird is going on.
  87.  
  88. // if cur == 2, assume the user's subscription expired; leave everything be and wait for renewal. Otherwise,
  89.  
  90. if (cur != 2 || ! localStorage.getItem("WKlvlupPrevLevel")) {
  91.  
  92.  
  93. // clear WKlvlupLevTime to make sure we don't display incorrect level info
  94. console.log("reinitializing");
  95. localStorage.setItem("WKlvlupLevTime", 0);
  96. localStorage.setItem("WKlvlupPrevLevel", cur); // update 'lastKnownLevel' for next time
  97. }
  98.  
  99. } //else cur == prev, so 'lastKnownLevel' is still correct (or it will continue to default to 1 if it hasn't been stored yet)
  100.  
  101. console.log("prev level: ", prev);
  102. console.log("cur level: ", cur);
  103. console.log("next level: ", next);
  104. console.log("checkLevel() end");
  105.  
  106. return cur;
  107. }
  108.  
  109.  
  110.  
  111. function displayLastLevTime( curLevel ) {
  112.  
  113. console.log('displayLastLevTime()');
  114.  
  115. var lastKnownLevel = localStorage.getItem("WKlvlupPrevLevel") || 1;
  116. var levTime = localStorage.getItem("WKlvlupLevTime") || 0;
  117. var wkPage = window.location.pathname;
  118.  
  119. if (levTime != 0 && curLevel == lastKnownLevel) {
  120.  
  121. var datetime = new Date(Number(levTime));
  122. var now = new Date;
  123. var one10thDay = 24*60*60*100; // hours*minutes*seconds*milliseconds/10
  124. var diffDays = (Math.round((now.getTime() - datetime.getTime())/(one10thDay))) / 10;
  125. var curDType = localStorage.getItem("WKlvldurDType") || 0;
  126.  
  127. console.log("diffDays = ", diffDays);
  128. console.log("displayType = ", curDType);
  129.  
  130. if (curDType == 0) { // display type 0
  131.  
  132. var levelsbox = document.getElementsByClassName("levels")[0].getElementsByTagName("a")[0];
  133.  
  134. if (levelsbox) {
  135.  
  136. var t2 = document.createElement('div');
  137. t2.innerHTML = '<div id="WKlvldurLBTxt"> </div>'+
  138. '</div>';
  139.  
  140. levelsbox.appendChild(t2);
  141.  
  142. var thing3 = get("WKlvldurLBTxt");
  143.  
  144. if (thing3 && diffDays >= 0.1) {
  145.  
  146. var dayString = ((diffDays > 1.0) ? " days)" : " day)");
  147.  
  148. thing3.innerHTML = "(" + diffDays + dayString;
  149.  
  150. // this next block is to make everything else in the navbar line up properly (popups mainly)
  151.  
  152. var boxnames = ["title", "lessons", "reviews", "radicals", "kanji", "vocabulary", "account"];
  153.  
  154. for (var i=0; i < boxnames.length; i++) {
  155.  
  156. var innerStr = '<div id=' + boxnames[i] + 'xxlvlup' + ' style="color:#F2F2F2"> </div>'+ '</div>';
  157. var thebox = document.getElementsByClassName(boxnames[i])[0].getElementsByTagName("a")[0];
  158. var stubby = document.createElement('div');
  159. stubby.innerHTML = innerStr;
  160. thebox.appendChild(stubby);
  161. var theThing = get(boxnames[i]+'xxlvlup');
  162. theThing.innerHTML = ".";
  163. }
  164. }
  165. }
  166. } else if (wkPage === "/" || wkPage === "/dashboard") { // display type 1
  167.  
  168. var celebrationImg = get("WKlvlupImg");
  169. var celebrationTxt = get("WKlvlupTxt");
  170.  
  171. if (celebrationImg || celebrationTxt) { return; } // WK LevelUP Celebrator is doing its thing, don't crash the party
  172.  
  173. var msg = get("search");
  174.  
  175. if (msg) {
  176.  
  177. var t = document.createElement('div');
  178.  
  179. t.innerHTML = '<div id="WKlvldurTxt" align="center" style="margin:18px;text-align:center;line-height:110%;font-size:100%;"> </div>'+
  180. '</div>';
  181.  
  182. t.style.fontFamily = "'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif";
  183. msg.appendChild(t);
  184.  
  185. var thing2 = get("WKlvldurTxt");
  186.  
  187. if (thing2) {
  188.  
  189. var daynames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  190. var monthnames = ["January ", "February ", "March ", "April ", "May ", "June ", "July ", "August ", "September ", "October ", "November ", "December "];
  191. var dd = datetime.getDate();
  192. var hours = datetime.getHours();
  193. var minutes = datetime.getMinutes();
  194. var ampm = "AM";
  195.  
  196. if (hours > 12) {
  197.  
  198. hours -= 12;
  199. ampm = "PM";
  200. }
  201.  
  202. var theTxt = "You reached Level " + curLevel + " on " + daynames[datetime.getDay()] + ", " + monthnames[datetime.getMonth()] + dd + dateSuffix(dd) + " at " + hours + ":" + minutes + " " + ampm;
  203.  
  204. if (diffDays >= 0.1 && diffDays <= 1) {
  205.  
  206. theTxt += " (" + diffDays + " day ago)";
  207.  
  208. } else if (diffDays > 1) {
  209.  
  210. theTxt += " (" + diffDays + " days ago)";
  211. }
  212.  
  213. thing2.innerHTML= theTxt;
  214. }
  215. }
  216. }
  217. }
  218. }
  219.  
  220.  
  221. function init () {
  222.  
  223. console.log('init() start');
  224.  
  225. var curDType = localStorage.getItem("WKlvldurDType");
  226. if (!curDType) {
  227. localStorage.setItem("WKlvldurDType", 0);
  228. }
  229. console.log('init() end');
  230. }
  231.  
  232.  
  233.  
  234. function main () {
  235.  
  236. var curLevel;
  237.  
  238. console.log("pathname: ", window.location.pathname);
  239.  
  240. console.log("main()");
  241.  
  242. init();
  243.  
  244. GMsetup();
  245.  
  246. curLevel = checkLevel();
  247.  
  248. displayLastLevTime(curLevel);
  249. }
  250.  
  251. window.addEventListener("load", main, false);
  252.  
  253. console.log('script load end');