Wanikani Forums Lesson/Review Status

Shows status of your Wanikani lessons/reviews while in the forums.

当前为 2017-03-09 提交的版本,查看 最新版本

// ==UserScript==
// @name        Wanikani Forums Lesson/Review Status
// @namespace   rfindley
// @description Shows status of your Wanikani lessons/reviews while in the forums.
// @version     1.0.1
// @include     https://community.wanikani.com/*
// @require     https://gf.qytechs.cn/scripts/27967-wanikani-forums-global-framework/code/Wanikani%20Forums%20Global%20Framework.js?version=179603
// @copyright   2017+, Robin Findley
// @license     MIT; http://opensource.org/licenses/MIT
// @run-at      document-end
// @grant       none
// ==/UserScript==

window.wkf_lrstatus = {};

(function(gobj) {

    var settings_url = '/scripts/lrstatus';
    var randomize_query = 300; // Randomize API query times over a 300 sec period to spread server load.

    //-------------------------------------------------------------------
    // Let the global script know about our settings page (if we have one)
    //-------------------------------------------------------------------
//    window.wkf_global.add_script('Lesson/Review Status', settings_url);
    var apikey = window.wkf_global.get_apikey();
    if (apikey === null) return; // Just in case the auto-redirect doesn't work

    // Don't run past this point if we are on a settings screen.
    if (window.location.pathname.match(/^\/scripts\//) !== null) return;

    //-------------------------------------------------------------------
    // Styling info for this script.
    //-------------------------------------------------------------------
    var css =
        '.dashboard_bubble {background-color:#6cf; font-size:0.8em; border-radius:0.5em; padding:0 6px; margin:0 4px; color:#fff; font-weight:bold;}'+
        '.dashboard_bubble.zero {background-color:#bdbdbd;}';

    //-------------------------------------------------------------------
    // Update the lesson/review count info on the screen.
    //-------------------------------------------------------------------
    function update_counts(lessons, reviews) {
        var lc = $('#lesson_count');
        var rc = $('#review_count');
        if (lc.length != 1) {
            $('head').append('<style type="text/css">'+css+'</style>');
            lc = $('<span id="lesson_count" class="dashboard_bubble"></span>');
            rc = $('<span id="review_count" class="dashboard_bubble"></span>');
            $('.wanikani-app-nav > ul > li:contains("Lessons")').append(lc);
            $('.wanikani-app-nav > ul > li:contains("Reviews")').append(rc);
        }
        lc.text(lessons);
        rc.text(reviews);
        if (lessons === 0)
            lc.addClass('zero');
        else
            lc.removeClass('zero');
        if (reviews === 0)
            rc.addClass('zero');
        else
            rc.removeClass('zero');
    }

    //-------------------------------------------------------------------
    // Fetch lesson/review count info from the server.
    //-------------------------------------------------------------------
    function fetch_data() {
        var now = Math.round(new Date().getTime()/1000);
        window.wkf_global.query_api('/study-queue')
        .then(function(json){
            var lessons = json.requested_information.lessons_available;
            var reviews = json.requested_information.reviews_available;
            localStorage.setItem('wkf_lrstatus.last_query', now);
            localStorage.setItem('wkf_lrstatus.lesson_count', lessons);
            localStorage.setItem('wkf_lrstatus.review_count', reviews);
            update_counts(lessons, reviews);
        });
        var next_query = Math.trunc((now/900)+1) * 900 + Math.round(Math.random()*randomize_query) - now;
        setTimeout(fetch_data, next_query*1000);
    }

    //-------------------------------------------------------------------
    // Startup. Runs at document 'load' event.
    //-------------------------------------------------------------------
    function startup() {
        var last_user = localStorage.getItem('wkf_lrstatus.last_user') || '';
        var current_user = $('#current-user img').attr('title');
        if (last_user != current_user && current_user !== undefined) {
            localStorage.removeItem('wkf_lrstatus.last_query');
            localStorage.removeItem('wkf_lrstatus.lesson_count');
            localStorage.removeItem('wkf_lrstatus.review_count');
            localStorage.setItem('wkf_lrstatus.last_user', current_user);
        }
        var now = Math.trunc(new Date().getTime()/1000);
        var last_qtr_hr = Math.trunc(now / 900) * 900;
        var last_query = Number(localStorage.getItem('wkf_lrstatus.last_query'));

        if (last_query < last_qtr_hr) {
            fetch_data();
        } else {
            var lessons = Number(localStorage.getItem('wkf_lrstatus.lesson_count'));
            var reviews = Number(localStorage.getItem('wkf_lrstatus.review_count'));
            update_counts(lessons, reviews);
        }

        var next_query = Math.trunc((now/900)+1) * 900 + Math.round(Math.random()*randomize_query) - now;
        setTimeout(fetch_data, next_query*1000);
    }

    // Run startup() after window.onload event.
    if (document.readyState === 'complete')
        startup();
    else
        window.addEventListener("load", startup, false);

})(window.wkf_lrstatus);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址