Greasy Fork is available in English.

OhYE!

Hide users in Tapuz

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name OhYE!
// @namespace   imdfl1
// @description Hide users in Tapuz
// @include http://www.tapuz.co.il/forums2008/*forumid*
// @version 1.14
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
 
(function() {
	"use strict";

	var oldUsers = [
			{id:  1615810, name: "ye44"},
			{id: 2340317, name: unescape("%u05D5%20%u05D5%20%u05D9%20%u05E0%20%u05E1%20%u05D8%20%u05D5%20%u05DF")},		
		], hiding = true,
		users = JSON.parse(GM_getValue("ignored_users1") || "[]") || [];
		
//		console.log("saved users: ", users);
		
	function isIgnored(id) {
		var rec = users.filter(function(u) {
			return u.id === id;
		})[0];
		return Boolean(rec);
	}
	
	function ignoreUser(id, name, bIgnore) {
		var user = {id: id, name: name};
		if (isIgnored(id)) {
			if (bIgnore) {
				return;
			}
			var rec;
			for (var i = users.length - 1; i >= 0; --i) {
				if (users[i].id == id) {
					users.splice(i);
				}
			}
		}
		else if (bIgnore) {
			users.push(user);
		}
		if (hiding) {
			toggleUser(user, bIgnore);
		}
		GM_setValue("ignored_users1", JSON.stringify(users));
	}

		
	function getParent(e, selector) {
		var p = e && e.parentNode,
			classes;
		while (p) {
			if (p.tagName.toLowerCase() === selector)
				return p;
			classes = (p.className || "").split(' ');
			if (classes.indexOf(selector) > -1) {
				return p;
			}
			p = p.parentNode;		
		}
		return null;
	}
	
	function toggleOne(div, parentSelector, hide, mode) {
		var parent = getParent(div, parentSelector), toggled;
		if (parent) {
			if (hide) {
				if (mode === "height") {
					parent.style.height = "1px";
				}
				else {
					parent.style.display = "none";
				}
			}
			else {
				if (mode === "height") {
					parent.style.height = "";  
				}
				else {
					parent.style.display = "block";
				}
			}
		}
		else {
//			console.log("cannot find parent with selector", parentSelector);
		}
	}
	
	function toggleUser(user, isHidden) {
//		console.log("toggling user", user.id);
		var divs = document.querySelectorAll("div#user_" + user.id),
			len,
			i;

		for (i = 0, len = divs.length; i < len; ++i) {
			toggleOne(divs[i], "msg-title", isHidden && hiding, "height");
		}
	}
	
	function toggleIt() {
		users.forEach(function(user) {
			toggleUser(user, hiding);
		});
	}
	
	function onIgnoreChange(id, name, event) {
		var target = event.currentTarget || event.target,
			ignore = target.checked;
//		console.log("ignore changed to ", ignore);
		ignoreUser(id, name, ignore);
	}
	
	function addIgnoreUI(node) {
		if (node.querySelector("input.imdfl-checkbox")) {
			return console.log("new new already contains ignore ui");
		}
		var anchors = node.querySelectorAll("a"),
			send, userId, userName;
		anchors = [].slice.call(anchors);
		anchors.forEach(function(a) {
			var href = (a.href || a.getAttribute("href") || "").toLowerCase(),
				ind;
			if (href.indexOf("newmsg") >= 0) {
				send = a;
			}
			else if ((ind = href.indexOf("userid=")) >= 0) {
				userId = href.substring(ind + 7).replace(/[^\d]/g, '');
			}
		});
		
		var bees = node.querySelectorAll("b");
		bees = [].slice.call(bees);
		bees.forEach(function(b) {
			if (b.innerHTML.indexOf("שם") >= 0) {
				userName = (b.nextSibling.textContent || "").replace(/^\s+/g, '').replace(/\s+$/g, '');
			}
		});
		
		if (send) {
			var div = document.createElement("div"),
				id="chk_" + Date.now(),
				checked = isIgnored(id) ? "" : "";
			div.style.display = "inline-block";
			div.innerHTML = '<input type="checkbox" class="imdfl-checkbox" id="' + id + '" name="' + id + '"' + checked + ' /><label for="' + id + '">התעלם</label>';
			send.parentNode.appendChild(div);
			var chk = div.querySelector("input");
			chk.checked = isIgnored(userId);
			chk.addEventListener("change", onIgnoreChange.bind(this, userId, userName));
		}
	}
	
	function onDomMutation(mutations) {
			var i, len = mutations.length, m,
				nodeIndex, nodeCount, lst,
				node, attr,
				addNodes = [],
				delNodes = [];
			for (i = 0; i < len; ++i) {
				m = mutations[i];
				switch (m.type) {
					case "childList":
						lst  = m.addedNodes;
						for (nodeIndex = 0, nodeCount = lst.length; nodeIndex < nodeCount; nodeIndex++) {
							node = (lst[nodeIndex]);
							if (node.className === "user-details-card") {
								addIgnoreUI(node);
							}
						}
				}
			}
	}

	function toggleNotifications(nDiv) {
		var anchors = nDiv.querySelectorAll("a");
//		window.console.log("found", anchors.length, "anchors");

		for (var i = 0, len = users.length; i < len; ++i) {
			var user = users[i],
				wrote = unescape(user.name + "%20%u05DB%u05EA%u05D1"),
				a;
			for (var j = 0, alen = anchors.length; j < alen; ++j) {
				a = anchors[j];
				if (a.innerHTML.indexOf(wrote) >= 0) {
					toggleOne(a, "li", hiding, "display");
				}
			}
		}
	}

	function testNotifications() {
		//console.log("testNotifications");
		var nInterval = window.setInterval(function() {
			var nDiv = document.querySelector("div.notificationsHistoryContainer");
//			console.log("checking notifications container, display", nDiv && nDiv.style.display);
			if (! nDiv || nDiv.style.display === "none") {
				return;
			}
			clearInterval(nInterval);
			var cb = toggleNotifications.bind(this, nDiv);
			setTimeout(cb, 300);
			setTimeout(cb, 600);
			setTimeout(cb, 1500);
		}, 200);
//		console.log("set interval to", nInterval);
	}
	
	var button,
		interval = setInterval(function() {
			button = document.querySelector("div.notificationsHistoryButton");
			if (button) {
				clearInterval(interval);
				button.addEventListener("click", testNotifications, true);
			}
		}, 1000);
		
	var domObserver = new window.MutationObserver(onDomMutation),
		domObserverConfig = {
			attributes: true,
			childList: true,
			characterData: false,
			subtree: true,
			attributeFilter: ["style", "class"]
		};
	domObserver.observe(document.body, domObserverConfig);		

	document.body.addEventListener("keydown", function(event) {
		if (event.keyCode === 89 && event.altKey && event.ctrlKey) {
			hiding = ! hiding;
			toggleIt();
		}
	});

	
	toggleIt();

}());