Dynamically sets threshold to and hides higher scores on nrtool.to/history pages
当前为
// ==UserScript==
// @name NRTool Dynamic Score Filter
// @namespace http://tampermonkey.net/
// @version 1.4
// @description Dynamically sets threshold to and hides higher scores on nrtool.to/history pages
// @author ZaZaZa
// @match https://nrtool.to/nrtool/history/*
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// States: 0=Min(0.06), 1=Med(0.10), 2=Max(Unlimited)
const deltas = [0.06, 0.10, 3.0]; // 1.0 = unrestricted
let currentState = 0;
// Load saved state
function loadState() {
const saved = localStorage.getItem('nrtool_state');
if (saved !== null) {
currentState = parseInt(saved) % deltas.length;
}
}
// Save state and refresh
function toggleState() {
currentState = (currentState + 1) % deltas.length;
localStorage.setItem('nrtool_state', currentState.toString());
location.reload(); // Refresh to apply
}
// Keyboard listener
document.addEventListener('keydown', function(e) {
if (e.ctrlKey && e.shiftKey && e.key === 'F') {
e.preventDefault();
toggleState();
}
});
function filterResults() {
loadState();
const delta = deltas[currentState];
const captions = document.querySelectorAll('.item__caption');
if (captions.length === 0) {
return;
}
const scores = [];
captions.forEach(caption => {
const text = caption.textContent.trim();
const match = text.match(/^(\d+\.\d+)/);
if (match) {
scores.push(parseFloat(match[1]));
}
});
if (scores.length === 0) {
return;
}
const minScore = Math.min(...scores);
const threshold = minScore + delta;
let hiddenCount = 0;
captions.forEach(caption => {
const text = caption.textContent.trim();
const match = text.match(/^(\d+\.\d+)/);
if (match) {
const number = parseFloat(match[1]);
if (number > threshold && delta < 1.0) { // Skip hiding if unrestricted
const fullItem = caption.closest('.sim-item');
if (fullItem && fullItem.style.display !== 'none') {
fullItem.style.display = 'none';
hiddenCount++;
}
}
}
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', filterResults);
} else {
filterResults();
}
const observer = new MutationObserver(function(mutations) {
let shouldRefilter = false;
mutations.forEach(function(mutation) {
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
shouldRefilter = true;
}
});
if (shouldRefilter) {
setTimeout(filterResults, 500);
}
});
observer.observe(document.body, { childList: true, subtree: true });
})();