🏠 Home 

คุณต้องเข้าสู่ระบบหรือลงทะเบียนก่อนดำเนินการต่อ

WaniKani Answer Checker

Modifiable answer checker in reviews and lessons

สคริปต์นี้ไม่ควรถูกติดตั้งโดยตรง มันเป็นคลังสำหรับสคริปต์อื่น ๆ เพื่อบรรจุด้วยคำสั่งเมทา // @require https://update.greasyfork.org/scripts/470201/1215595/WaniKani%20Answer%20Checker.js

// ==UserScript==
// @name         WaniKani Answer Checker
// @namespace    http://www.wanikani.com
// @version      0.1.0
// @description  Modifiable answer checker in reviews and lessons
// @author       polv
// @match        https://www.wanikani.com/*
// @match        https://preview.wanikani.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=wanikani.com
// @license      MIT
// @source       https://github.com/patarapolw/wanikani-userscript/blob/master/userscripts/answer-checker.user.js
// @grant        none
// ==/UserScript==
// @ts-check
/// <reference path="./types/answer-checker.d.ts" />
(function () {
class ModAnswerChecker {
/**
* @type {TryEvaluationFunction[]}
*/
mods = [];
/**
* @type {{
*   oldEvaluate?: EvaluationFunction
*   evaluate: EvaluationFunction
* } | null}
*/
answerChecker = null;
/**
*
* @param {TryEvaluationFunction} fn
*/
register(fn) {
this.mods.push(fn);
}
constructor() {
// Automatically init on new instance
window.addEventListener('turbo:load', (e) => {
// @ts-ignore
const url = e.detail.url;
if (!url) return;
/**
* e.g.
* https://www.wanikani.com/subjects/lesson/quiz?queue=${subjectIds.join('-')}
* https://www.wanikani.com/subjects/review
* https://www.wanikani.com/subjects/extra_study?queue_type=${queueType}
*/
if (/(session|quiz|review|extra_study)/.test(url)) {
// @ts-ignore
const Stimulus = window.Stimulus;
if (!Stimulus) return;
const startDate = +new Date();
const intervalId = setInterval(() => {
this.answerChecker =
Stimulus.controllers.find((x) => {
return x.answerChecker;
})?.answerChecker || null;
if (this.answerChecker) {
clearInterval(intervalId);
if (this.answerChecker.oldEvaluate) return;
const answerChecker = this.answerChecker;
console.log('Found new answerChecker');
const oldEvaluate = answerChecker.evaluate.bind(answerChecker);
answerChecker.oldEvaluate = oldEvaluate;
/** @type {(fns: TryEvaluationFunction[]) => EvaluationFunction} */
const evaluateWith = (fns) => {
return (e) => {
for (const fn of fns) {
const r = fn(
e,
evaluateWith(fns.filter((it) => it !== fn)),
);
if (r) return r;
}
return oldEvaluate(e);
};
};
answerChecker.evaluate = evaluateWith(this.mods);
}
if (startDate + 5000 < +new Date()) {
clearInterval(intervalId);
}
}, 500);
}
});
}
}
window.modAnswerChecker = window.modAnswerChecker || new ModAnswerChecker();
})();