WaniKani Review Order

WaniKani Review Order by Alucardeck

  1. // ==UserScript==
  2. // @name WaniKani Review Order
  3. // @namespace https://www.wanikani.com
  4. // @description WaniKani Review Order by Alucardeck
  5. // @version 0.35
  6. // @include https://www.wanikani.com/review/session
  7. // @include http://www.wanikani.com/review/session
  8. // @grant none
  9. // ==/UserScript==
  10. function get(id) {
  11. if (id && typeof id === 'string') {
  12. id = document.getElementById(id);
  13. }
  14. return id || null;
  15. }
  16.  
  17. function init(){
  18. console.log('init() start');
  19. var stats = $("#stats")[0];
  20. var t = document.createElement('div');
  21. stats.appendChild(t);
  22. t.innerHTML = '<div id="wkroStatus"><table align="right"><tbody>'+
  23. '<tr><td>Rad</td><td align="right"><span id="wkroRadCount"></span></td></tr>'+
  24. '<tr><td>Kan</td><td align="right"><span id="wkroKanCount"></span></td></tr>'+
  25. '<tr><td>Voc</td><td align="right"><span id="wkroVocCount"></span></td></tr>'+
  26. '</tbody></table></div><div id="divSt">Not Ordered!</div>'+
  27. '<button id="reorderBtn1" type="button" onclick="window.dispatchEvent(new Event(\'reorderWKBulk\'));">Bulk Mode</button>'+
  28. '<button id="reorderBtn2" type="button" onclick="window.dispatchEvent(new Event(\'reorderWKSingle\'));">Single Mode</button>'+
  29. '</div>';
  30. $.jStorage.listenKeyChange("activeQueue",displayUpdate);
  31. window.addEventListener('reorderWKSingle',reorderSingle);
  32. window.addEventListener('reorderWKBulk',reorderBulk);
  33. displayUpdate();
  34. console.log('init() end');
  35. }
  36.  
  37. function reorderBulk(){
  38. //Reordering method following original parameters of 10 activeQueue list
  39. method = "BULK";
  40. reorder();
  41. }
  42.  
  43. function reorderSingle(){
  44. //Reordering method following the 1 activeQueue list, that makes both reading/meaning coming in pairs.
  45. //method = "SINGLE";
  46. //reorder();
  47. try{
  48. unsafeWindow.Math.random = function() { return 0; }
  49. }catch(e){
  50. Math.random = function() { return 0; }
  51. }
  52. reorderBulk();
  53. }
  54.  
  55. function reorder(){
  56. console.log('reorder() start');
  57. var divSt = get("divSt");
  58. var reorderBtn1= get("reorderBtn1");
  59. var reorderBtn2= get("reorderBtn2");
  60. reorderBtn1.style.visibility="hidden";
  61. reorderBtn2.style.visibility="hidden";
  62. divSt.innerHTML = 'Reordering.. please wait!';
  63. var cur = $.jStorage.get("currentItem");
  64. var qt = $.jStorage.get("questionType");
  65. var actList = $.jStorage.get("activeQueue");
  66. var revList = $.jStorage.get("reviewQueue");
  67. console.log('current item: '+cur);
  68. var curt = cur.kan?'kan':cur.voc?'voc':'rad';
  69. var removedCount = 0;
  70. for(var i=0;i<actList.length;i++){
  71. var it = actList[i];
  72. var itt = cur.kan?'kan':cur.voc?'voc':'rad';
  73. console.log(it);
  74. if(!(curt==itt&&cur.id==it.id)){
  75. actList.splice(i--,1);
  76. revList.push(it);
  77. removedCount++;
  78. }
  79. }
  80. console.log('Items removed from ActiveQueue: '+removedCount);
  81. for(var i=revList.length-1;i>=0;i--){
  82. var it=revList[i];
  83. if(it.kan){
  84. revList.splice(i,1);
  85. revList.push(it);
  86. //console.log('kan '+it.kan);
  87. }
  88. }
  89. for(var i=revList.length-1;i>=0;i--){
  90. var it=revList[i];
  91. if(it.rad){
  92. revList.splice(i,1);
  93. revList.push(it);
  94. //console.log('rad '+it.rad);
  95. }
  96. }
  97. if(method=='BULK')
  98. for(var i=0;i<removedCount;i++)
  99. actList.push(revList.pop());
  100. console.log('Ordered ReviewQueue:');
  101. for(var i=0;i<revList.length;i++){
  102. var it=revList[i];
  103. if(it.rad)
  104. console.log('rad '+it.rad);
  105. else if(it.kan)
  106. console.log('kan '+it.kan);
  107. else if(it.voc)
  108. console.log('voc '+it.voc);
  109. }
  110. $.jStorage.set("reviewQueue",revList);
  111. $.jStorage.set("activeQueue",actList);
  112. divSt.innerHTML = 'Done!';
  113. console.log('reorder() end');
  114. }
  115.  
  116. function displayUpdate(){
  117. var radC = 0, kanC = 0, vocC = 0;
  118. var list = $.jStorage.get("reviewQueue").concat($.jStorage.get("activeQueue"));
  119. console.log('ReviewQueue ('+$.jStorage.get("reviewQueue").length+') ActiveQueue ('+$.jStorage.get("activeQueue").length+')');
  120. for(var i=0;i<list.length;i++){
  121. var it=list[i];
  122. if(it.rad)
  123. radC++;
  124. else if(it.kan)
  125. kanC++;
  126. else if(it.voc)
  127. vocC++;
  128. }
  129. console.log('Rad '+radC+' Kan '+kanC+' Voc '+vocC);
  130. var radSpan = $("#wkroRadCount")[0];
  131. var kanSpan = $("#wkroKanCount")[0];
  132. var vocSpan = $("#wkroVocCount")[0];
  133. radSpan.innerHTML = radC;
  134. kanSpan.innerHTML = kanC;
  135. vocSpan.innerHTML = vocC;
  136. }
  137. var method = "";
  138. init();
  139. console.log('script load end');