Benutzer:Basti/Greasemonkey-Userscripts/Hide Annoying Tweeps

Wechseln zu: Navigation, Suche

In der Vergangenheit habe ich das ein oder andere Mal einer Art temporäre Block-Funktion bei Twitter vermisst. Man will manchen Leuten nicht gleich unfollowen, sondern sie - vielleicht für einen Abend - einfach mal nicht in der Timeline haben, z.B. wenn irgendein Großereignis stattfindet, von dem oder über das live getwittert wird ("Wetten, dass..?", "Echo" o.ä.).

Mit diesem Userscript bekommt man auf Tastendruck ein Eingabeprompt, in dem man temporär zu blockierende Twitterer angeben kann (so viele man will). Dieses Blocken wird nicht bei Twitter gespeichert und niemand außer euch bekommt es mit. Sobald Twitter neu aufgerufen wird, sind alle Blockings vergessen. Es ist sowohl zum alten als auch zum neuen Twitter-Userinterface kompatibel (Erkennung erfolgt automatisch).


Hinweis: Teilweise macht die F10-Taste Probleme (2x drücken nötig oder reagiert gar nicht). Dann kann man versuchen, eine andere Taste zu belegen. Dabei sollte man aber darauf achten, dass es kein Buchstabe oder Zeichen ist, dass man z.B. bei der Eingabe neuer Tweets benötigt (sonst poppt jedes Mal das Eingabefenster auf). Eine Liste mit KeyCodes gibt es z.B. hier. <highlightSyntax language="javascript"> // ==UserScript== // @name Hide Annoying Tweeps // @description Hides annoying people in your Twitter timeline temporarily. Add a user by hitting F10. // @namespace https://hickerspace.org/wiki/Benutzer:Basti // @include http://twitter.com/* // @include https://twitter.com/* // ==/UserScript==

var promptKeyCode = 121; // the F10 key var blacklist = new Array(); var active = false;

/**

* Checks if an array contains a certain value.
*
* By David Chambers (http://davidchambersdesign.com/)
*/

function contains(arr, value) {

   var i = arr.length;
   while (i--) {
       if (arr[i] === value) return true;
   }
   return false;

}

/**

* Hides all elements with the given class name.
* Optionally gets an additional class, which has to match too.
* 
* (note that this class is not case-sensitive, so better give a 
* fixed class name as first parameter and a dynamic as second)
*/

function hideElementsWithClass(className, additionalClass) { var elements = document.getElementsByClassName(className);

for (var i = 0; i < elements.length; i++) { if (additionalClass === undefined) { elements[i].style.display = "none"; } else { if (contains(elements[i].getAttribute("class").toLowerCase().split(" "), additionalClass.toLowerCase())) { elements[i].style.display = "none"; } } } }

/**

* Hides a tweet, which is blacklisted and a child of the given streamItem.
*/

function hideViaAttribute(streamItem) { var tweet = streamItem.getElementsByClassName("tweet",streamItem)[0];

var name = tweet.getAttribute("data-screen-name");

for (var k = 0; k < blacklist.length; k++) { if (name.toLowerCase() == blacklist[k].toLowerCase()) { streamItem.style.display = "none"; } } }

/**

* Provides the hiding method for old Twitter (called on DOMNodeInserted event).
*/

function oldTwitter(event){ var tweet = event.target; if (tweet == null) return; for (var i = 0; i < blacklist.length; i++) { hideElementsWithClass("status", "u-" + blacklist[i]); } }

/**

* Provides the hiding method for new Twitter (called on DOMNodeInserted event).
*/

function newTwitter(event) { var streamItem = event.target; if (streamItem == null) return;

if (streamItem.getAttribute("class") != "stream-item") return;

hideViaAttribute(streamItem); }

/**

* When user presses the defined key, a box pops up prompting the user to blacklist a tweep in the timeline.
*/

function addBlacklistedItem(e) { if (e.keyCode == promptKeyCode) { var successfull = false; var blacklistedName = prompt("Which user should be ignored?"); if (blacklistedName != null && blacklistedName != "") { if (!contains(blacklist, blacklistedName)) { blacklist.push(blacklistedName); successfull = true; } } if (successfull) { if (document.getElementsByClassName("phoenix-old-version").length > 0) { //oldTwitter if (!active) document.addEventListener("DOMNodeInserted", oldTwitter, false);

for (var i = 0; i < blacklist.length; i++) { hideElementsWithClass("status", "u-" + blacklist[i]);

} } else { //newTwitter if (!active) document.addEventListener("DOMNodeInserted", newTwitter, false);

var streamItems = document.getElementsByClassName("stream-item");

for (var i = 0; i < streamItems.length; i++) { hideViaAttribute(streamItems[i]); }

} active = true; } } }

// add the key listener document.addEventListener("keypress", addBlacklistedItem, false); </highlightSyntax>