Greasy Fork镜像 is available in English.

AtCoder-Favorite-Person-Colors

AtCoderのお気に入り管理のユーザーに色がつきます

Versión del día 19/06/2025. Echa un vistazo a la versión más reciente.

// ==UserScript==
// @name         AtCoder-Favorite-Person-Colors
// @namespace    https://ruku.tellpro.net
// @version      2025-06-19
// @description  AtCoderのお気に入り管理のユーザーに色がつきます
// @author       ruku
// @match        https://atcoder.jp/settings/fav
// @icon         https://www.google.com/s2/favicons?sz=64&domain=atcoder.jp
// @grant        none
// @license      MIT
// ==/UserScript==

// 関数名がdiffToColor...?
// まあ、user名と一緒だしえっか.
// こんなコード誰も見てないでしょ.
// そのまんまでよしっ!!!
const diffToColor = (diff) => {
    if(diff === 0) {
        return "black";
    }
    if(diff < 399) {
        return "#808080";
    }
    if(diff < 799) {
        return "#804000";
    }
    if(diff < 1199) {
        return "#008000";
    }
    if(diff < 1599) {
        return "#00C0C0";
    }
    if(diff < 1999) {
        return "#0000FF";
    }
    if(diff < 2399) {
        return "#C0C000";
    }
    if(diff < 2799) {
        return "#FF8000";
    }
    return "#FF0000";
}

(async function() {
    'use strict';
    const users = document.querySelectorAll("td a[href^='/users/']");
    const userElements = Array.from(users);
    const processed = new Set();

    for(const userElem of userElements){
        const user = userElem.textContent.trim();
        if(!user) {
            console.warn("User not found");
            continue;
        }
        if(processed.has(user)) {
            console.info(`User ${user} already processed`);
            continue;
        }
        processed.add(user);

        try {
            const response = await fetch(`https://kenkoooo.com/atcoder/proxy/users/${user}/history/json`);
            if (!response.ok) {
                console.error(`Failed to fetch data for user: ${user}`);
                continue;
            }
            const data = await response.json();
            if (data.length === 0) {
                console.warn(`No data found for user: ${user}`);
                continue;
            }
            const lastColor = data[data.length - 1].NewRating;
            const color = diffToColor(lastColor);

            // 同じユーザー名の全ての要素に色をつける
            userElements
                .filter(el => el.textContent.trim() === user)
                .forEach(el => { el.style.color = color; });
        } catch (e) {
            console.error(`Error processing user ${user}:`, e);
        }
    }
})();
长期地址
遇到问题?请前往 GitHub 提 Issues。