// ==UserScript== // @name Trisquel Userlist Highlighting // @description Helps find spammers on the Trisquel.info userlist // @include /^https?://trisquel\.info/(en|es|fr|gl|de)/about($|\?page=.*$)/ // @grant GM_xmlhttpRequest // ==/UserScript== "use strict"; // constants var settingsURL = "http://localhost/trisquelspammers.json"; // edit this var settingsURLAddDate = true; // appends a date to the URL, e.g. ?date=807937200000 // globals var userElems = []; var users; var saveBtn; function saveRequired() { saveBtn.style.display = "block"; } function saveNotRequired() { saveBtn.style.display = "none"; } function saveJSON() { var usersJSON = JSON.stringify(users); window.open( "data:application/octet-stream;base64," + window.btoa(usersJSON), "Save JSON", "width=100,height=100" ); saveNotRequired(); } function getUserNameFromElem(userElem) { var href, usernameMatch; href = userElem.getAttribute("href"); if (!href) throw 'non-existent attribute "href"'; usernameMatch = href.match(/(?:https?:\/\/trisquel.info)?\/[a-z]+\/users\/(.+)$/); if (!usernameMatch) throw 'non-matching URL: ' + href; return usernameMatch[1]; } function highlightUser(userElem, userIsSpammer) { var color; switch (userIsSpammer) { case "y": color = "red"; break; case "n": color = "#3B5996"; break; default: color = "black"; } userElem.style.color = color; } function setStatus(username, userIsSpammer, userElem) { highlightUser(userElem, userIsSpammer); saveRequired(); if (userIsSpammer == "?") delete users[username]; else users[username] = {"spam":userIsSpammer}; } function showUserMenu(event) { var sender = event.target, username, popupInput, userIsSpammer; event.preventDefault(); username = getUserNameFromElem(sender); if (!username) return; do { popupInput = window.prompt( "Options:\r\n" + "(1) set user as spammer\r\n" + "(2) set user as unknown\r\n" + "(3) set user as okay\r\n" + "(0) visit user page\r\n\r\n" + "Enter a number:", "1" ); switch (popupInput) { case "1": userIsSpammer = "y"; break; case "2": userIsSpammer = "?"; break; case "3": userIsSpammer = "n"; break; case "0": if (window.confirm("Do you want to save changes before leaving this page?\r\n" + "Else, changes will be lost.")) { saveJSON(); } window.top.location = sender.href; return; case null: return; } if (!userIsSpammer) { window.alert("You did not enter a valid option. Please try again."); } } while (!userIsSpammer); setStatus(username, userIsSpammer, sender); } function setupUserLink(userElem) { userElem.addEventListener("click", showUserMenu, false); } function discoverUsers() { var u, lenU, userElem, username, user, userIsSpammer; userElems = document.getElementsByClassName("views-view-grid")[0].getElementsByTagName("a"); for (u = 0, lenU = userElems.length; u < lenU; u += 1) { userElem = userElems[u]; username = getUserNameFromElem(userElem); user = users[username]; userIsSpammer = ((user) ? user["spam"] : null); highlightUser(userElem, userIsSpammer); setupUserLink(userElem); } } function setupSaveBtn() { saveBtn = document.createElement("button"); saveBtn.addEventListener("click", saveJSON, false); saveBtn.setAttribute("id", "saveBtn"); saveNotRequired(); saveBtn.appendChild(document.createTextNode("Save changes")); document.getElementsByClassName("views-view-grid")[0].parentNode.appendChild(saveBtn); } var settingsURLDate = ((settingsURLAddDate) ? "?date=" + Date.parse(new Date()) : ""); GM_xmlhttpRequest({ method: "GET", url: settingsURL + settingsURLDate, onload: function (response) { if (response.responseText) { users = JSON.parse(response.responseText); setupSaveBtn(); discoverUsers(); } } });