您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Show the total number of questions per difficulty in LeetCode's statsbar.
当前为
您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
- // ==UserScript==
- // @name Better Statsbar (LeetCode)
- // @description Show the total number of questions per difficulty in LeetCode's statsbar.
- // @namespace https://greatest.deepsurf.us/en/users/128831-marvinyan
- // @match https://leetcode.com/problemset/algorithms/
- // @grant GM.getValue
- // @grant GM.setValue
- // @grant GM_getValue
- // @grant GM_setValue
- // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
- // @require https://greatest.deepsurf.us/scripts/374849-library-onelementready-es6/code/Library%20%7C%20onElementReady%20ES6.js?version=649483
- // @version 0.0.1.20190108010704
- // ==/UserScript==
- (() => {
- const LC_ALGO_API = 'https://leetcode.com/api/problems/algorithms/';
- const CACHE_DURATION_MS = 10 * 1000; // Optional rate limit (default: 10s)
- const CURRENT_TIME_MS = new Date().getTime();
- const getData = async url => {
- const lastCheck = await GM.getValue('lastCheck', Number.MAX_VALUE);
- const cachedJsonStr = await GM.getValue('cachedJsonStr', null);
- const timeSinceCheck = CURRENT_TIME_MS - lastCheck;
- return new Promise(resolve => {
- if (timeSinceCheck < CACHE_DURATION_MS && cachedJsonStr !== null) {
- resolve(cachedJsonStr);
- } else {
- const xhr = new XMLHttpRequest();
- xhr.open('GET', url, true);
- xhr.onload = () => {
- if (xhr.status >= 200 && xhr.status < 300) {
- GM.setValue('lastCheck', CURRENT_TIME_MS);
- GM.setValue('cachedJsonStr', xhr.responseText);
- resolve(xhr.responseText);
- }
- };
- xhr.send();
- }
- });
- };
- const parseData = response => {
- const counts = [0, 0, 0];
- const questions = JSON.parse(response).stat_status_pairs;
- questions.forEach(q => {
- counts[q.difficulty.level - 1]++;
- });
- return counts;
- };
- const updateStatsBar = counts => {
- const statsBar = $('#welcome > span > span');
- let $totalSolvedSpan = $(statsBar[0]).closest('span');
- const newText = $totalSolvedSpan.text().replace('/', ' / ');
- $totalSolvedSpan.text(newText);
- for (let i = 1; i < statsBar.length; i++) {
- statsBar[i].append(` / ${counts[i - 1]}`);
- }
- };
- const run = async () => {
- const data = await getData(LC_ALGO_API);
- const counts = parseData(data);
- updateStatsBar(counts);
- };
- waitForKeyElements('#welcome', run);
- })();