您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Highlight changes in own upload snatches
// ==UserScript== // @name [GMT] Highlight changes in upload snatches // @namespace https://greasyfork.org/users/321857-anakunda // @version 1.00.0 // @match https://*/torrents.php?* // @run-at document-end // @author Anakunda // @copyright 2021, Anakunda (https://greasyfork.org/users/321857-anakunda) // @license GPL-3.0-or-later // @description Highlight changes in own upload snatches // @grant GM_getValue // @grant GM_setValue // ==/UserScript== (function() { 'use strict'; const params = new URLSearchParams(document.location.search); let snapshot, touched = false, counter = 0; function getTorrentId(node) { if (node instanceof HTMLElement) for (let a of node.getElementsByTagName('A')) { if (a.pathname != '/torrents.php') continue; let torrentId = new URLSearchParams(a.search).get('torrentid'); if (torrentId) return parseInt(torrentId); } } function foo(torrentId, snatchesColumn) { if (!torrentId || !(snatchesColumn instanceof HTMLElement)) return; // assertion failed const snatches = parseInt(snatchesColumn.textContent); if (!(snatches >= 0) || snatches == snapshot[torrentId]) return; if (snapshot[torrentId] >= 0) { ++counter; let span = document.createElement('span'); span.textContent = snatches > snapshot[torrentId] ? '+' + (snatches - snapshot[torrentId]) : snatches - snapshot[torrentId]; span.style = ` margin-left: 4px; border: solid 1px black; padding: 0 3px; font-weight: 600; background-color: yellow; color: black; `; span.className = 'delta'; snatchesColumn.append(span); } snapshot[torrentId] = snatches; touched = true; } switch (document.location.pathname.slice(1)) { case 'torrents.php': if (params.get('type') == 'uploaded') { var selector = 'table.torrent_table > tbody > tr.torrent'; snapshot = GM_getValue(document.domain, { }); for (let tr of document.body.querySelectorAll(selector)) { const torrentId = getTorrentId(tr); if (torrentId > 0) foo(torrentId, tr.children[4]); const leechers = parseInt(tr.children[6].textContent); if (leechers > 0) tr.children[6].style = 'color: green; font-weight: bold;'; } } else if (params.get('id') > 0) { selector = 'table#torrent_details > tbody > tr.torrent_row'; snapshot = GM_getValue(document.domain, { }); for (let tr of document.body.querySelectorAll(selector)) { if (tr.querySelector('span.torrent_action_buttons > a.button_rm') == null) continue; // not own upload let torrentId = /^(?:torrent(\d+))$/i.exec(tr.id); if (torrentId != null) foo(parseInt(torrentId[1]), tr.children[2]); const leechers = parseInt(tr.children[4].textContent); if (leechers > 0) tr.children[4].style = 'color: green; font-weight: bold;'; } } break; } if (touched > 0) GM_setValue(document.domain, snapshot); if (counter > 0) { let div = document.createElement('DIV'); div.innerHTML = '<span class="deltacounter">' + counter + '</span> ' + (counter != 1 ? 'changes' : 'change') + ' in snatches'; div.style = ` position: fixed; right: 20px; top: 20px; opacity: 1; transition: opacity 1s ease-in-out; border: solid 3px darkorange; padding: 5px; color: darkorange; background: antiquewhite; font: 12pt bold; box-shadow: 0 0 10px orange; cursor: pointer; z-index: 999999; `; if (selector) div.onclick = function(evt) { for (let elem of document.body.querySelectorAll(selector)) if (elem.querySelector('span.delta') == null) elem.style.visibility = 'collapse'; if (evt.currentTarget.hTimer) clearTimeout(evt.currentTarget.hTimer); evt.currentTarget.remove(); }; document.body.append(div); const delay = GM_getValue('toast_timeout', 10); if (delay > 0) { //setTimeout(div => { div.style.opacity = 1 }, 0, div); div.hTimer = setTimeout(div => { div.style.opacity = 0; div.hTimer = setTimeout(div => { div.remove() }, 1000, div); }, (delay + 1) * 1000, div); } } })();