From 8a209ac5827014ea5fbb466651093127abf921ce Mon Sep 17 00:00:00 2001 From: Glorfindel Date: Sat, 3 Aug 2019 21:41:07 +0200 Subject: [PATCH] Destroy Spammer v0.5, an update to the moderator tools broke the script --- destroy-spammer/destroy-spammer.user.js | 88 ++++++++++++------------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/destroy-spammer/destroy-spammer.user.js b/destroy-spammer/destroy-spammer.user.js index ca776fd..c4b3cd9 100644 --- a/destroy-spammer/destroy-spammer.user.js +++ b/destroy-spammer/destroy-spammer.user.js @@ -3,7 +3,7 @@ // @namespace https://github.com/Glorfindel83/ // @description Adds a 'Destroy spammer' link for moderator on user profiles with only deleted posts. // @author Glorfindel -// @version 0.4.5 +// @version 0.5 // @match *://*.stackexchange.com/users/* // @match *://*.stackoverflow.com/users/* // @match *://stackoverflow.com/users/* @@ -15,83 +15,77 @@ // @grant none // ==/UserScript== (function () { - "use strict"; - + 'use strict'; + // Determine user ID var userIDRegex = /\/users\/(\d+)\//g; - var userID = userIDRegex.exec(document.location)[1]; + var userID = userIDRegex.exec(document.location) [1]; var userName = $(".name.mod-tabs").attr("title"); - var userNameIsSuspicious = typeof userName !== "undefined" && userName.toLowerCase().contains("insur"); + var userNameIsSuspicious = typeof userName !== 'undefined' && userName.toLowerCase().contains("insur"); // Find 'Mod' dialog link - var moderatorLinkElement = $("a#user-moderator-link-" + userID); - if (moderatorLinkElement.length === 0) { - return; // Current user is not a moderator, or wrong tab - no action possible - } + var moderatorLinkElement = $('a.js-user-moderator-link[data-user-id=' + userID + ']'); + if (moderatorLinkElement.length == 0) // Current user is not a moderator, or wrong tab - no action possible + return; var destroySpammerLinkAdded = false; - + // This function will create the 'Destroy spammer' link; // this can happen either synchronously or asynchronously (after fetching additional data). var createDestroyLink = function (userID) { // The link can be added only once. - if (destroySpammerLinkAdded) { + if (destroySpammerLinkAdded) return; - } destroySpammerLinkAdded = true; - - var destroyLink = document.createElement("a"); - destroyLink.appendChild(document.createTextNode("Destroy spammer")); + + var destroyLink = document.createElement('a'); + destroyLink.appendChild(document.createTextNode('Destroy spammer')); destroyLink.onclick = function () { // Ask for confirmation - if (window.confirm("Are you sure?")) { - // TODO: remember the last time this script was activated, - // and build in a 5 second delay to prevent the rate limit from triggering. + if (window.confirm('Are you sure?')) { + // TODO: remember the last time this script was activated, + // and build in a 5 second delay to prevent the rate limit from triggering. $.post({ - url: "https://" + document.location.host + "/admin/users/" + userID + "/destroy", - data: "annotation=&deleteReasonDetails=&mod-actions=destroy&destroyReason=This+user+was+created+to+post+spam+or+nonsense+and+has+no+other+positive+participation&destroyReasonDetails=&fkey=" + window.localStorage["se:fkey"].split(",")[0], - success: function () { + url: 'https://' + document.location.host + '/admin/users/' + userID + '/destroy', + data: 'annotation=&deleteReasonDetails=&mod-actions=destroy&destroyReason=This+user+was+created+to+post+spam+or+nonsense+and+has+no+other+positive+participation&destroyReasonDetails=&fkey=' + window.localStorage["se:fkey"].split(",")[0], + success: function (data) { // Reload page window.location.reload(); }, error: function (jqXHR, textStatus, errorThrown) { - window.alert("An error occurred, please try again later."); - console.log("Error: " + textStatus + " " + errorThrown); + window.alert('An error occurred, please try again later.'); + console.log('Error: ' + textStatus + ' ' + errorThrown); } }); } }; - + // Add to document moderatorLinkElement.after(destroyLink); }; - + // Check for keywords in spammers' profiles - $.get(document.location.href.split("?")[0] + "?tab=profile", function (data) { - if (data.search(/1\D844\D909\D0831/g) !== -1) { + $.get(document.location.href.split('?')[0] + "?tab=profile", function (data) { + if (data.search(/1\D844\D909\D0831/g) != -1) { createDestroyLink(userID); } }); // Check for (deleted) questions and answers - var questionsPanel = $("#user-panel-questions"); - var undeletedQuestions = questionsPanel.find("td.question-hyperlink").not(".deleted-answer").length; // yes, deleted-answer. Don"t ask why. - var deletedQuestions = questionsPanel.find("td.question-hyperlink.deleted-answer").length; - if (undeletedQuestions > 0) { - return; // User has content - use the dialog instead - } - var answersPanel = $("#user-panel-answers"); - var undeletedAnswers = answersPanel.find("td.answer-hyperlink").not(".deleted-answer").length; - var deletedAnswers = answersPanel.find("td.answer-hyperlink.deleted-answer").length; - if (undeletedAnswers > 0) { - return; // User has content - use the dialog instead - } - if (deletedQuestions + deletedAnswers === 0 && !userNameIsSuspicious) { - return; // User has no deleted content - use the dialog instead - } - if (deletedQuestions + deletedAnswers > 4) { - return; // User has too much deleted content - use the dialog instead - } - + var questionsPanel = $('#user-panel-questions'); + var undeletedQuestions = questionsPanel.find('td.question-hyperlink').not('.deleted-answer').length; // yes, deleted-answer. Don't ask why. + var deletedQuestions = questionsPanel.find('td.question-hyperlink.deleted-answer').length; + if (undeletedQuestions > 0) // User has content - use the dialog instead + return; + var answersPanel = $('#user-panel-answers'); + var undeletedAnswers = answersPanel.find('td.answer-hyperlink').not('.deleted-answer').length; + var deletedAnswers = answersPanel.find('td.answer-hyperlink.deleted-answer').length; + if (undeletedAnswers > 0) // User has content - use the dialog instead + return; + if (deletedQuestions + deletedAnswers == 0 && !userNameIsSuspicious) // User has no deleted content - use the dialog instead + return; + if (deletedQuestions + deletedAnswers > 4) // User has too much deleted content - use the dialog instead + return; + // Create Destroy link immediately createDestroyLink(userID); -})(); +}) ();