🎉 欢迎访问GreasyFork.Org 镜像站!本镜像站由公众号【爱吃馍】搭建,用于分享脚本。联系邮箱📮

Greasy fork 爱吃馍镜像

Greasy Fork is available in English.

📂 缓存分发状态(共享加速已生效)
🕒 页面同步时间:2025/12/23 08:53:26
🔄 下次更新时间:2025/12/23 09:53:26
手动刷新缓存

Better Statsbar (LeetCode)

Show the total number of questions per difficulty in LeetCode's statsbar.

目前為 2019-01-08 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

🚀 安装遇到问题?关注公众号获取帮助

公众号二维码

扫码关注【爱吃馍】

回复【脚本】获取最新教程和防失联地址

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

🚀 安装遇到问题?关注公众号获取帮助

公众号二维码

扫码关注【爱吃馍】

回复【脚本】获取最新教程和防失联地址

// ==UserScript==
// @name            Better Statsbar (LeetCode)
// @description     Show the total number of questions per difficulty in LeetCode's statsbar.
// @namespace       https://greasyfork.org/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://greasyfork.org/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);
})();