WaniKani Dashboard Level Progress Detail

Show detailed progress bars.

  1. // ==UserScript==
  2. // @name WaniKani Dashboard Level Progress Detail
  3. // @version 0.1.0
  4. // @description Show detailed progress bars.
  5. // @require https://cdn.rawgit.com/curious-attempt-bunny/wanikani-user-script-helper/4374eae6a4a284c3c3da9d50caa83b8e1a1a6e5d/loader.js
  6. // @author hitechbunny
  7. // @include https://www.wanikani.com/
  8. // @include https://www.wanikani.com/dashboard
  9. // @include https://www.wanikani.com/review
  10. // @run-at document-end
  11. // @grant none
  12. // @namespace https://greasyfork.org/users/149329
  13. // ==/UserScript==
  14.  
  15. (function() {
  16. 'use strict';
  17.  
  18. // Hook into App Store
  19. try { $('.app-store-menu-item').remove(); $('<li class="app-store-menu-item"><a href="https://community.wanikani.com/t/there-are-so-many-user-scripts-now-that-discovering-them-is-hard/20709">App Store</a></li>').insertBefore($('.navbar .dropdown-menu .nav-header:contains("Account")')); window.appStoreRegistry = window.appStoreRegistry || {}; window.appStoreRegistry[GM_info.script.uuid] = GM_info; localStorage.appStoreRegistry = JSON.stringify(appStoreRegistry); } catch (e) {}
  20.  
  21. var locked_data_url = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkAQMAAABKLAcXAAAABlBMVEX////p6emlmyooAAAAAnRSTlMAgJsrThgAAAA1SURBVDjLY3huea54DpQ4wIBgnyuewDAHSdKAAUnhuQIGJIVzHjCMmjJqyqgpo6aMmkKkKQC2XQWeSEU1BQAAAABJRU5ErkJggg==')";
  22.  
  23. function render(json) {
  24. $('.progression').empty();
  25.  
  26. // console.log(json);
  27.  
  28. while(json.progresses.length > 3) {
  29. var progress = json.progresses[0];
  30. if (progress.max === 0 || progress.gurued_total*100.0/progress.max >= 90) {
  31. json.progresses = json.progresses.slice(1);
  32. } else {
  33. break;
  34. }
  35. }
  36.  
  37. var stageNames = ['', 'Apprentice I', 'Apprentice II', 'Apprentice III', 'Apprentice IV'];
  38. json.progresses.forEach(function(progress, j) {
  39. var html =
  40. '<div id="progress-'+progress.level+'-'+progress.type+'" class="vocab-progress">'+
  41. ' <h3>Level '+progress.level+' '+progress.type+' Progression</h3>'+
  42. ' <div class="chart">'+
  43. ' <div class="progress" title="Unstarted ('+progress.srs_level_totals[0]+'/'+progress.max+')">'+
  44. ' <div class="bar" title="Guru+ ('+progress.gurued_total+'/'+progress.max+')" style="background-color: #a100f1; background-image: linear-gradient(to bottom, #a0f, #9300dd); width: '+(progress.gurued_total*100.0/progress.max)+'%;">'+
  45. ' <span class="dark" style="display: none;">&nbsp;</span>'+
  46. ' </div>';
  47.  
  48. var opacity = 0.5;
  49. for(var i=4; i>=1; i--) {
  50. var percentage = progress.srs_level_totals[i]*100.0/progress.max;
  51. //console.log(cssClass, i, progress.srs_level_totals[i], progress.max, percentage);
  52.  
  53. html +=
  54. ' <div class="bar bar-supplemental" title="'+stageNames[i]+' ('+progress.srs_level_totals[i]+'/'+progress.max+')" style="opacity: '+opacity+'; background-color: #a100f1; background-image: linear-gradient(to bottom, #f0a, #dd0093); width: '+(percentage)+'%;">'+
  55. ' <span class="dark" style="display: none;"></span>'+
  56. ' </div>';
  57.  
  58. opacity *= 0.7;
  59. }
  60.  
  61. var unlockedCount = 0;
  62. progress.srs_level_totals.forEach(function(srs_level_total) {
  63. unlockedCount += srs_level_total;
  64. });
  65. var lockedCount = progress.max - unlockedCount;
  66.  
  67. html +=
  68. ' <div class="bar bar-supplemental" title="Locked ('+lockedCount+'/'+progress.max+')" style="float:right; background-color: #a8a8a8; background-image: '+locked_data_url+'; width: '+(lockedCount*100.0/progress.max)+'%;">'+
  69. ' <span class="dark" style="display: none;"></span>'+
  70. ' </div>';
  71.  
  72. html +=
  73. ' </div>'+progress.gurued_total+'<span class="pull-right total">'+progress.max+'</span>'+
  74. ' </div>'+
  75. '</div>';
  76.  
  77. if (j != json.progresses.length-1) {
  78. //html += '<hr class="custom-splitter"/>';
  79. }
  80.  
  81. $('.progression').append(html);
  82. });
  83. }
  84.  
  85. var cached_json = localStorage.getItem('level-progress-cache');
  86. if (cached_json) {
  87. render(JSON.parse(cached_json));
  88. }
  89.  
  90. window.WKHelper.init(GM_info, function() {
  91. window.WKHelper.ajax_retry('https://wanikanitools-golang.curiousattemptbunny.com/level/progress?api_key='+window.WKHelper.api_key_v2).then(function(json) {
  92. localStorage.setItem('level-progress-cache', JSON.stringify(json));
  93. render(json);
  94. });
  95. });
  96. })();