Greasy Fork

Greasy Fork is available in English.

Flashback TrackIgnore

Script to ignore and keep track of users, more or less

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        Flashback TrackIgnore
// @namespace   flashbacktrackignore
// @author      Innesko
// @description Script to ignore and keep track of users, more or less
// @include     *www.flashback.org/*
// @version     0.1
// @grant       GM_getValue
// @grant       GM_setValue
// ==/UserScript==

// This script helps you to keep track and ignore users on the Flashback forum,
// with a user friendly interface
// There are currently five things you can do:
// 1. Add a note
//    You can add a custom note for a specific user
// 2. Custom color
//    Customize the background color of the username. It's up to you
//    what the colors should mean
// 3. Hide/show the avatar picture
// 4. Hide/show text of user
//    If you want to see that a user has posted,
//    but don't want to read the provocative text
// 5. Hide/show entire posts of user
//    If you want to hide the entire post, the user disappears completely,
//    and only the post counter disclose there has been a post

// Acknowledgements
// Innesko is the main programmer to this script
// Thanks to kinesarsle for original programming and inspiration
// ttsp is helping out where he can
// Thanks to Fnords for fixing a bug and improving the function ttsp wrote in the early original programming


var taggedUsers = loadUserInformation();

injectIgnore();

function injectIgnore() {
	var tmpDisable = shouldTempDisable();
	
	var wholePost;
	wholePost = document.evaluate(
		"//div[@class='post']",
		document,
		null,
		XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
		null);

	var allUserText, thisUserText;
	allUserText = document.evaluate(
		"//div[@class='post-col post-right']",
		document,
		null,
		XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
		null);

	var allUserAv = document.evaluate(
		"//a[starts-with(@class, 'post-user-avatar')]",
		document,
		null,
		XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
		null);

	var allUsers = document.evaluate(
		"//a[@class='post-user-username dropdown-toggle']",
		document,
		null,
		XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
		null);

	// The main function
	for (var i = 0; i < allUserText.snapshotLength; i++) {

		var thisUser = allUsers.snapshotItem(i);
		var user = taggedUsers[thisUser.innerText];

		var editButton = document.createElement("button");
		editButton.innerHTML = "Editera";
		editButton.onclick = function(userName) {return e => editIgnoreProperties(userName, getAllUserNames());}(thisUser.innerText);
		thisUser.parentNode.parentNode.appendChild(editButton);

		if (user === undefined) continue;

		thisUser.style.backgroundColor = user.color;

		if (user.msg) {
			var infoButton = document.createElement("button");
			infoButton.innerHTML = 'Info';
			thisUser.parentNode.parentNode.appendChild(infoButton);
			infoButton.onclick = function(user) {return e => alert(user.msg);}(user);
		}

		if (tmpDisable) continue;
		
		if (user.hide == "completely") {
			wholePost.snapshotItem(i).style.display = "none";
		} else if (user.hide == "text") {
			thisUserText = allUserText.snapshotItem(i);
			var hideButton = document.createElement("button");
			hideButton.onclick = function(node) {
									return e => toggleVisibility(node, hideButton);
								}(thisUserText, hideButton);
			hideButton.onclick();
			thisUserText.previousElementSibling.appendChild(hideButton);
		}
		
		if (user.hideAvatar) {
			allUserAv.snapshotItem(i).style.display = "none";
		}
	}
}

// Hiding and showing the text
function toggleVisibility(node, hideButton) {
  if (node.style.display == 'inline' || !node.style.display) {
      node.style.display = 'none';
      hideButton.innerHTML = 'Visa text';
  } else {
      node.style.display = '';
      hideButton.innerHTML = 'Dölj text';
  }
}

function getAllUserNames() {
	var userNames = new Array();
	for (var name in taggedUsers) {
		userNames.push(name);
	}
	return userNames;
}

function editIgnoreProperties(userName, userNames) {
    var container = document.createElement("div");
    container.style = "position:fixed; top: 50%; left: 40%; width:35em; height:18em; margin-top: -9em; margin-left: -15em; border: 2px solid #333; background-color: #f3f3f3; padding: 5px";
    document.getElementsByTagName("body")[0].appendChild(container);

    var abortButton = document.createElement("input");
    abortButton.type = "button";
    abortButton.value = "Avbryt";

    var saveButton = document.createElement("input");
    saveButton.type = "button";
    saveButton.value = "Spara";
	
	var tmpDisableButton = document.createElement("input");
	tmpDisableButton.type = "button";
	tmpDisableButton.value = "Inaktivera temporärt";

    var hideCheck = document.createElement("select");
    hideCheck.innerHTML = "<option value=''> - </option><option value='completely'>Dölj fullständigt.</option><option value='text'>Dölj endast texten.</option>";
	hideCheck.style = "width: 100%;";
	
	var hideAvatarCheck = document.createElement("input");
	hideAvatarCheck.type = "checkbox";

    var colorInput = document.createElement("input");
    colorInput.type = "text";

    var msgInput = document.createElement("textarea");
    msgInput.style.width = "100%";
    msgInput.rows = 4;

    var table = document.createElement("table");
    table.style.width = "100%";

	var userNameSelect = document.createElement("select");
	userNameSelect.style = "width: 100%;";
	userNames.forEach(name => {
		if (name === userName) return;
		var option = document.createElement("option");
		option.value = name;
		option.text = name;
		userNameSelect.appendChild(option);
	});
	var op = document.createElement("option");
	op.value = userName;
	op.text = userName;
	userNameSelect.insertBefore(op, userNameSelect.firstChild);
	userNameSelect.value = userName;
    var userNameRow = document.createElement("tr");
    userNameRow.innerHTML = "<td>Användare:</td><td></td>";
	userNameRow.children[1].appendChild(userNameSelect);

    var ignoreRow = document.createElement("tr");
    ignoreRow.innerHTML = "<td>Ignorera:</td><td></td>";
    ignoreRow.children[1].appendChild(hideCheck);

	var ignoreAvatarRow = document.createElement("tr");
	ignoreAvatarRow.innerHTML = "<td>Dölj avatar:</td><td></td>";
	ignoreAvatarRow.children[1].appendChild(hideAvatarCheck);

    var colorRow = document.createElement("tr");
    colorRow.innerHTML = "<td>Färg:</td><td></td>";
    colorRow.children[1].appendChild(colorInput);

    var msgRow = document.createElement("tr");
    msgRow.innerHTML = "<td colspan=2>Meddelande:</td>";

    var msgContainer = document.createElement("tr");
    msgContainer.innerHTML = "<td colspan=2></td>";
    msgContainer.children[0].appendChild(msgInput);

    var buttonRow = document.createElement("tr");
    buttonRow.innerHTML = "<td></td><td align=\"right\"></td>";
	buttonRow.children[0].appendChild(tmpDisableButton);
    buttonRow.children[1].appendChild(abortButton);
    buttonRow.children[1].appendChild(saveButton);

    table.appendChild(userNameRow);
    table.appendChild(ignoreRow);
	table.appendChild(ignoreAvatarRow);
    table.appendChild(colorRow);
    table.appendChild(msgRow);
    table.appendChild(msgContainer);
    table.appendChild(buttonRow);

	tmpDisableButton.onclick = e => {
		setTempDisableTime();
		location.reload();
	};
    abortButton.onclick = e => container.parentNode.removeChild(container);
    saveButton.onclick = e => {
        var user = taggedUsers[userNameSelect.value];
        if (user === undefined) {
            user = {};
            taggedUsers[userNameSelect.value] = user;
        }
        user.hide = hideCheck.value;
		user.hideAvatar = hideAvatarCheck.checked;
        if (colorInput.value === "")
            delete user.color;
        else
            user.color = colorInput.value;

        if (msgInput.value === "")
            delete user.msg;
        else
            user.msg = msgInput.value;

        saveUserInformation();
        location.reload();
    };
	const showUserInfo = e => {
		var user = taggedUsers[userNameSelect.value];
		if (user === undefined) user = {};
		hideCheck.value = user.hide === undefined ? "" : user.hide;
		hideAvatarCheck.checked = user.hideAvatar === undefined ? false : user.hideAvatar;
		msgInput.value = user.msg === undefined ? "" : user.msg;
		colorInput.value = user.color === undefined ? "" : user.color;
	};
	userNameSelect.onchange = showUserInfo;
	showUserInfo();
    container.appendChild(table);
}

function saveUserInformation() {
    for (var userName in taggedUsers) {
        var user = taggedUsers[userName];
        if (isUserInfoEmpty(user)) {
            delete taggedUsers[userName];
        }
    }
    GM_setValue("taggedUsers", JSON.stringify(taggedUsers));
}

function loadUserInformation() {
    var strData = GM_getValue("taggedUsers");
    return strData ? JSON.parse(strData) : {};
}

function shouldTempDisable() {
	var tmpDisableTime = GM_getValue("tempDisableTime");
	tmpDisableTime = tmpDisableTime === undefined ? 0 : tmpDisableTime;
	return ((new Date()).valueOf() - tmpDisableTime) <= 1000*20;
}

function setTempDisableTime() {
	GM_setValue("tempDisableTime", (new Date()).valueOf());
}

function isUserInfoEmpty(user) {
    return (user.msg === undefined || user.msg === "") &&
           (user.color === undefined || user.color === "") &&
		   (user.hide === undefined || user.hide === "") && !user.hideAvatar;
}