WaniKani Fast Abridged Wrong/Multiple Answer

try to take over the world!

  1. // ==UserScript==
  2. // @name WaniKani Fast Abridged Wrong/Multiple Answer
  3. // @namespace http://tampermonkey.net/
  4. // @version 4.12
  5. // @description try to take over the world!
  6. // @author You
  7. // @match https://*.wanikani.com/subjects/review*
  8. // @match https://*.wanikani.com/subjects/extra_study*
  9. // @match https://wanikani.com/
  10. // @match https://wanikani.com/dashboard
  11. // @match https://www.wanikani.com/
  12. // @match https://www.wanikani.com/dashboard
  13. // @match https://preview.wanikani.com/
  14. // @match https://preview.wanikani.com/dashboard
  15. // @require https://code.jquery.com/jquery-3.6.3.min.js
  16. // @grant none
  17. // ==/UserScript==
  18.  
  19. window.wk_fawa = {};
  20.  
  21. //var wrongCountFAWA;
  22. (function(global) {
  23.  
  24.  
  25. /* global wkof, Stimulus, WaniKani, importShim, $ */
  26.  
  27. 'use strict';
  28. // Hook into App Store
  29. // 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) {}
  30.  
  31. if (!window.wkof) {
  32. if (confirm('WaniKani Fast Abridged Wrong/Multiple Answer requires Wanikani Open Framework.\nDo you want to be forwarded to the installation instructions?'))
  33. window.location.href = 'https://community.wanikani.com/t/instructions-installing-wanikani-open-framework/28549';
  34. return;
  35. }
  36.  
  37. var settings_dialog;
  38. var defaults = {
  39. alwaysShow: false,
  40. alwaysShowOnlyMultiple: false,
  41. dontShowWrong: false,
  42. correctColor: "#88cc00",
  43. incorrectColor: "#ff0033",
  44. customColor: false
  45. };
  46.  
  47.  
  48. if(window.location.pathname == "/" || window.location.pathname == "/dashboard"){
  49. wkof.include('Apiv2, Menu, Settings');
  50. wkof.ready('Menu').then(install_menu);
  51. wkof.ready('Settings').then(install_settings);
  52. debugger;
  53. $('.dashboard__content').before("<section class='dashboard__notice'><div class='dashboard__notice-section'><span class='main'>WaniKani Fast Abridged Wrong/Multiple Answer has been retired</span><span class='link'><a href='https://greasyfork.org/en/scripts/511539-wanikani-reviews-plus'>Wanikani Reviews Plus</a> has taken its place, with more features</span><span class='lick'></span><a href='https://community.wanikani.com/t/userscript-wanikani-reviews-plus/67455/17'>Community Discussion</a></div></section>");
  54. } else {
  55. wkof.include('Apiv2, Settings');
  56. wkof.ready('Settings').then(install_settings).then(function(){
  57. $('#user-response').after("<div id='divCorrect' class='hidden quiz-input__input'><span id='lblCorrect' type='text' style='display: none;' disabled></span></div>");
  58. window.addEventListener("didAnswerQuestion", function (e) {
  59. showCorrect(e);
  60. })
  61. window.addEventListener(`willShowNextQuestion`, e => {
  62. $('#divCorrect').addClass('hidden');
  63. });
  64. window.addEventListener("didUnanswerQuestion", function (e) {
  65. $('#divCorrect').addClass('hidden');
  66. })
  67. //document.body.addEventListener('keydown', function(event){
  68. // if ((event.which === 27 || event.which === 8) &&
  69. // (event.target.nodeName === 'BODY') &&
  70. // (!document.querySelector('#wkofs_doublecheck')))
  71. // {
  72. // $('#divCorrect').addClass('hidden');
  73. // }
  74. // return true;
  75. //});
  76. });
  77. }
  78.  
  79. function install_menu() {
  80. wkof.Menu.insert_script_link({
  81. script_id: 'fawa',
  82. name: 'fawa',
  83. submenu: 'Settings',
  84. title: 'Fast Abridged Wrong/Multiple Answer',
  85. on_click: open_settings
  86. });
  87. }
  88. function open_settings() {
  89. settings_dialog.open();
  90. }
  91. function install_settings() {
  92. settings_dialog = new wkof.Settings({
  93. script_id: 'fawa',
  94. name: 'fawa',
  95. title: 'Fast Abridged Wrong/Multiple Answer',
  96. on_save: process_settings,
  97. settings: {
  98. 'grp_main': {
  99. type:'group',
  100. label:'Main',
  101. content:{
  102. 'alwaysShow': {type:'checkbox',label:'Always Show Correct Answers',default:defaults.alwaysShow,on_change:alwaysShowChanged},
  103. 'alwaysShowOnlyMultiple': {type:'checkbox',label:'&nbsp;&nbsp;&nbsp;(Only if multiple answers)',default:defaults.alwaysShowOnlyMultiple},
  104. 'dontShowWrong': {type:'checkbox',label:'&nbsp;&nbsp;&nbsp;(Don\'t show wrongs)',default:defaults.dontShowWrong}
  105. }
  106. },
  107. 'grp_colors':{
  108. type: 'group',
  109. label: 'colors',
  110. content: {
  111. 'customColor': {type:'checkbox',label:'Custom Colors',default:defaults.customColor,on_change:customColorsChanged},
  112. 'correctColor': {type:'color',label:'Correct',default:defaults.correctColor},
  113. 'incorrectColor': {type:'color',label:'Incorrect',default:defaults.incorrectColor},
  114. }
  115. }
  116. }
  117. });
  118. settings_dialog.load().then(function(){
  119. wkof.settings.fawa = $.extend(true, {}, defaults, wkof.settings.fawa);
  120. addStyle('#divCorrect.hidden {' +
  121. ' display: none !important;' +
  122. '}' +
  123. '#divCorrect {' +
  124. ' width: 100% !important;' +
  125. ' display:table !important;' +
  126. '}' +
  127. '#lblCorrect {' +
  128. ' height: ' + $('#answer-form input[type=text]').css('height') + ' !important;' +
  129. ' min-height: ' + $('#answer-form input[type=text]').css('height') + ' !important;' +
  130. ' display:table-cell !important;' +
  131. ' vertical-align:middle; !important;' +
  132. ' font-family: ' + $('#user-response').css('font-family') + ';' +
  133. ' font-size: ' + $('#user-response').css('font-size') + ';' +
  134. ' color: #fff; !important;' +
  135. ' -webkit-text-fill-color: #fff; !important;' +
  136. ' text-shadow: ' + ($(window).width() < 767 ? '1px 1px 0 rgba(0,0,0,0.2);' : '2px 2px 0 rgba(0,0,0,0.2);') + ' !important;' +
  137. ' -webkit-transition: background-color 0.1s ease-in; !important;' +
  138. ' -moz-transition: background-color 0.1s ease-in; !important;' +
  139. ' -o-transition: background-color 0.1s ease-in; !important;' +
  140. ' transition: background-color 0.1s ease-in; !important;' +
  141. ' opacity: 1 !important;' +
  142. '}' +
  143. '.quiz-input__input-container[correct=true] #divCorrect {' +
  144. ' background-color: ' + (wkof.settings.fawa.customColor == true ? wkof.settings.fawa.correctColor : '#88cc00') + ' !important;' +
  145. '}' +
  146. '.quiz-input__input-container[correct=false] #divCorrect {' +
  147. ' background-color: ' + (wkof.settings.fawa.customColor == true ? wkof.settings.fawa.incorrectColor : '#f03') + '!important;' +
  148. '}' +
  149. '.dashboard__notice {' +
  150. ' background: deeppink;' +
  151. ' color: white;' +
  152. ' padding: 20px;' +
  153. ' border-radius: 6px;' +
  154. ' margin-bottom: 20px;' +
  155. '}' +
  156. '.dashboard__notice .dashboard__notice-section {' +
  157. ' row-gap: 2px;' +
  158. ' display: grid;' +
  159. '}' +
  160. '.dashboard__notice .main {' +
  161. ' font-size: 2rem;' +
  162. ' padding-bottom: 5px;' +
  163. ' font-weight: bold;' +
  164. '}' +
  165. '.dashboard__notice .link {' +
  166. ' font-size: 1.5rem;' +
  167. '}')
  168. });
  169. }
  170. function alwaysShowChanged(){
  171. if($(this).prop('checked') == false){
  172. $('#fawa_alwaysShowOnlyMultiple').attr('disabled','disabled');
  173. $('#fawa_alwaysShowOnlyMultiple').prop("checked",false);
  174. $('#fawa_alwaysShowOnlyMultiple').closest('.row').css('display','none');
  175. $('#fawa_dontShowWrong').attr('disabled','disabled');
  176. $('#fawa_dontShowWrong').prop("checked",false);
  177. $('#fawa_dontShowWrong').closest('.row').css('display','none');
  178. } else {
  179. $('#fawa_alwaysShowOnlyMultiple').removeAttr('disabled');
  180. $('#fawa_alwaysShowOnlyMultiple').closest('.row').css('display','block');
  181. $('#fawa_dontShowWrong').removeAttr('disabled');
  182. $('#fawa_dontShowWrong').closest('.row').css('display','block');
  183. }
  184. }
  185. function customColorsChanged(){
  186. if($(this).prop('checked') == false){
  187. $('#fawa_grp_colors .row:gt(0)').css('display','none');
  188. } else {
  189. $('#fawa_grp_colors .row:gt(0)').css('display','block');
  190. }
  191. }
  192. function process_settings(){
  193. settings_dialog.save();
  194. console.log('Settings saved!');
  195. }
  196.  
  197. function showBar(correct){
  198. $('#lblCorrect').css('display','block');
  199. }
  200.  
  201. function getMeanings(e){
  202. let quiz_input = Stimulus.getControllerForElementAndIdentifier(document.querySelector(`[data-controller~="quiz-input"]`),'quiz-input')
  203. let synonyms = quiz_input.quizUserSynonymsOutlet.synonymsForSubjectId(e.detail.subjectWithStats.subject.id);
  204. //let synonyms = [];
  205. //if(quiz_input.quizUserSynonymsOutlet.synonyms.hasOwnProperty(e.detail.subjectWithStats.subject)){
  206. // synonyms = [...quiz_input.quizUserSynonymsOutlet.synonyms[5894]];
  207. //}
  208. return [...e.detail.subjectWithStats.subject.meanings, ...synonyms].join(", ")
  209. }
  210.  
  211. function getReadings(e){
  212. return e.detail.subjectWithStats.subject.readings.map(r => r.reading).join(", ")
  213. }
  214.  
  215. function showCorrect(e){
  216. switch((e.detail.subjectWithStats.subject.type + ' ' + e.detail.questionType).toLowerCase()) {
  217. case "vocabulary reading":
  218. if(e.detail.results.passed && wkof.settings.fawa.alwaysShowOnlyMultiple == true && getReadings(e).indexOf(",") === -1) return;
  219. showBar(e.detail.results.passed);
  220. $('#lblCorrect').text(getReadings(e));
  221. $('#divCorrect').removeClass('hidden');
  222. break;
  223. case "vocabulary meaning":
  224. case "kanji meaning":
  225. case "radical meaning":
  226. case "kanavocabulary meaning":
  227. debugger;
  228. if(e.detail.results.passed && wkof.settings.fawa.alwaysShowOnlyMultiple == true && (getMeanings(e).indexOf(",") === -1)) return;
  229. showBar(e.detail.results.passed);
  230. $('#lblCorrect').text(getMeanings(e));
  231. $('#divCorrect').removeClass('hidden');
  232. break;
  233. case "kanji reading":
  234. switch(e.detail.subjectWithStats.subject.primary_reading_type){
  235. case "onyomi":
  236. if(e.detail.results.passed && wkof.settings.fawa.alwaysShowOnlyMultiple == true && e.detail.subjectWithStats.subject.onyomi.length === 1) return;
  237. showBar(e.detail.results.passed);
  238. $('#lblCorrect').text(e.detail.subjectWithStats.subject.onyomi.join(", "));
  239. $('#divCorrect').removeClass('hidden');
  240. break;
  241. case "kunyomi":
  242. if(e.detail.results.passed && wkof.settings.fawa.alwaysShowOnlyMultiple == true && e.detail.subjectWithStats.subject.kunyomi.length === 1) return;
  243. showBar(e.detail.results.passed);
  244. $('#lblCorrect').text(e.detail.subjectWithStats.subject.kunyomi.join(", "));
  245. $('#divCorrect').removeClass('hidden');
  246. break;
  247. }
  248. break;
  249. }
  250. }
  251.  
  252. function addStyle(aCss) {
  253. var head, style;
  254. head = document.getElementsByTagName('head')[0];
  255. if (head) {
  256. style = document.createElement('style');
  257. style.setAttribute('type', 'text/css');
  258. style.textContent = aCss;
  259. head.appendChild(style);
  260. return style;
  261. }
  262. return null;
  263. }
  264. })(window.wk_fawa);