Faction Inactivity Highlight

Highlight inactive members of faction.

Versão de: 01/01/2024. Veja: a última versão.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==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 = "Add API Here";

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