您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
try to take over the world!
// ==UserScript== // @name atcoder-lang // @namespace // @version 0.1 // @description try to take over the world! // @author uesugi // @match https://atcoder.jp/* // @grant none // ==/UserScript== async function aaa() { const res = await fetch("https://kenkoooo.com/atcoder/resources/lang.json", { cache: 'force-cache' }); const list = await res.json(); Array.prototype.forEach.call(document.querySelectorAll('.username'), function (u) { if (!u.href.includes('/users/')) { return; } const user_id = u.text; const angArray = fcfc(list, user_id); if (angArray.length === 0) { return; } const str_array = angArray.map((element) => { return element['language'] + ' : ' + element['count']; }); let lang = angArray[0]['language']; const langSize = angArray.length; let lang_str = ''; if (langSize >= 3) { lang_str += '/' + angArray[2]['language']; } if (langSize >= 2) { lang += '<span style="font-size: 10px;">' + '/' + angArray[1]['language'] + lang_str + ' </span>'; } u.insertAdjacentHTML('beforeend', '/' + '<span data-toggle="tooltip" data-html="true" data-placement="right" style="font-size: 12px;" title="' + str_array.join('<br>') + '">' + lang + '</span>'); $('[data-toggle="tooltip"]').tooltip(); }); } function fcfc(list, user_id) { const trim_user_id = user_id.trim(); const index = binary_search(list, trim_user_id); return sequence_search(trim_user_id, list, index); } function binary_search(list, key) { let left = -1; let right = list.length; while (right - left > 1) { let mid = Math.floor(left + (right - left) / 2); if (isOK(mid, key, list)) { right = mid; } else { left = mid; } } return right; } function isOK(index, key, list) { if (list[index]['user_id'] >= key) { return true; } return false; } function sequence_search(user_id, list, index) { let array = new Array(); array = array.concat(search_one(user_id, list, index, 1)); array = array.concat(search_one(user_id, list, index - 1, -1)); array.sort((a, b) => b['count'] - a['count']); return array; } function search_one(user_id, list, index, add) { const array = new Array(); while (1) { if (list[index]['user_id'] !== user_id) { break; } array.push(list[index]); index += add; } return array; } function bbb() { const target = document.querySelector('#standings-tbody'); const observer = new MutationObserver(records => { aaa(); }); observer.observe(target, { subtree: true, childList: true }); aaa(); } const MAX_RETRY_COUNT_FIND_DIFF_CONTAINER = 30; var retry_counter = 0; function getDiffContainerElements() { retry_counter++; if (retry_counter > MAX_RETRY_COUNT_FIND_DIFF_CONTAINER) { clearInterval(set_interval_id); delete set_interval_id; } var diff_container_elements = document.getElementById('standings-tbody'); if (diff_container_elements != null) { if (typeof (set_interval_id) != 'undefined') { clearInterval(set_interval_id); delete set_interval_id; bbb(); } else { return diff_container_elements; } } } var set_interval_id = setInterval(getDiffContainerElements, 1000);