OhYE!

Hide users in Tapuz

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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();

}());