您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Highlight inactive members of faction.
当前为
// ==UserScript== // @name Faction Inactivity Highlight // @namespace https://www.torn.com/profiles.php?XID=1936821 // @version 1.2 // @description Highlight inactive members of faction. // @author TheFoxMan [1936821] // @owner Phillip_J_Fry [2184575] // @license MIT // @match https://www.torn.com/factions.php* // @run-at document-start // ==/UserScript== const APIKEY = "xQH4g47nGc1NGa4Q"; const activityHighlights = [ [1, 1, "#FFFFFF80"], [2, 4, "#ff990080"], [5, 6, "#FF000080"], [7, 999, "#cc00ff80"] ]; // SCRIPT BEYOND. // DO NOT EDIT. const APICOMMENT = "FactionLastAction"; if (!document.find) Object.defineProperties(Document.prototype, { find: { value(selector) { return document.querySelector(selector); }, enumerable: false }, findAll: { value(selector) { return document.querySelectorAll(selector); }, enumerable: false } }); if (!Element.prototype.find) Object.defineProperties(Element.prototype, { find: { value(selector) { return this.querySelector(selector); }, enumerable: false }, findAll: { value(selector) { return this.querySelectorAll(selector); }, enumerable: false } }); async function waitFor(sel, parent = document) { return new Promise((resolve) => { const intervalID = setInterval(() => { const el = parent.find(sel); if (el) { resolve(el); clearInterval(intervalID); } }, 500); }); } (() => { document.head.insertAdjacentHTML( "beforeend", `<style> .faction-info-wrap .members-list .table-body > li::after { display: block; content: attr(data-last-action); color: #fff; } </style>` ); if (window.location.href.includes("step=your") && window.location.hash.includes("tab=info")) showLastAction(); if (window.location.href.includes("step=profile")) showLastAction(); window.addEventListener("hashchange", () => { if (window.location.href.includes("step=your") && window.location.hash.includes("tab=info")) showLastAction(); }); })(); async function showLastAction() { await waitFor(".faction-info-wrap .members-list .table-body"); if (document.find(".faction-info-wrap .members-list .table-body > li[data-last-action]")) return; const factionID = document.find("#view-wars").parentElement.getAttribute("href")?.match(/\d+/)?.[0]; const data = await (await fetch(`https://api.torn.com/faction/${factionID || ""}?selections=basic&key=${APIKEY}&comment=${APICOMMENT}`)).json(); document.findAll(".faction-info-wrap .members-list .table-body > li").forEach((row) => { const profileID = parseInt(row.find("a[href*='profiles.php']").getAttribute("href").split("XID=")[1]); row.setAttribute("data-last-action", data.members[profileID].last_action.relative); const numberOfDays = Math.floor((Date.now() / 1000 - data.members[profileID].last_action.timestamp) / (24 * 60 * 60)); let color; activityHighlights.forEach((rule) => { if (rule[0] <= numberOfDays && numberOfDays <= rule[1]) color = rule[2]; }); if (!color) return; row.style.backgroundColor = color; }); }