Faction Inactivity Highlight

Highlight inactive members of faction.

Инсталирай този скрипт?
Препоръчано от автора

Може да харесате и Company Inactivity Highlight.

Инсталирай този скрипт

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Faction Inactivity Highlight
// @namespace    https://www.torn.com/profiles.php?XID=1936821
// @version      1.5
// @description  Highlight inactive members of faction.
// @author       TheFoxMan [1936821]
// @match        https://www.torn.com/factions.php*
// @run-at       document-end
// @license      Apache License 2.0
// ==/UserScript==

const APIKEY = "###PDA-APIKEY###";

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;
	});
}