Destroy Spammer v0.5, an update to the moderator tools broke the script

This commit is contained in:
Glorfindel 2019-08-03 21:41:07 +02:00
parent ba08ba52bf
commit 8a209ac582
1 changed files with 41 additions and 47 deletions

View File

@ -3,7 +3,7 @@
// @namespace https://github.com/Glorfindel83/ // @namespace https://github.com/Glorfindel83/
// @description Adds a 'Destroy spammer' link for moderator on user profiles with only deleted posts. // @description Adds a 'Destroy spammer' link for moderator on user profiles with only deleted posts.
// @author Glorfindel // @author Glorfindel
// @version 0.4.5 // @version 0.5
// @match *://*.stackexchange.com/users/* // @match *://*.stackexchange.com/users/*
// @match *://*.stackoverflow.com/users/* // @match *://*.stackoverflow.com/users/*
// @match *://stackoverflow.com/users/* // @match *://stackoverflow.com/users/*
@ -15,83 +15,77 @@
// @grant none // @grant none
// ==/UserScript== // ==/UserScript==
(function () { (function () {
"use strict"; 'use strict';
// Determine user ID // Determine user ID
var userIDRegex = /\/users\/(\d+)\//g; 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 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 // Find 'Mod' dialog link
var moderatorLinkElement = $("a#user-moderator-link-" + userID); var moderatorLinkElement = $('a.js-user-moderator-link[data-user-id=' + userID + ']');
if (moderatorLinkElement.length === 0) { if (moderatorLinkElement.length == 0) // Current user is not a moderator, or wrong tab - no action possible
return; // Current user is not a moderator, or wrong tab - no action possible return;
}
var destroySpammerLinkAdded = false; var destroySpammerLinkAdded = false;
// This function will create the 'Destroy spammer' link; // This function will create the 'Destroy spammer' link;
// this can happen either synchronously or asynchronously (after fetching additional data). // this can happen either synchronously or asynchronously (after fetching additional data).
var createDestroyLink = function (userID) { var createDestroyLink = function (userID) {
// The link can be added only once. // The link can be added only once.
if (destroySpammerLinkAdded) { if (destroySpammerLinkAdded)
return; return;
}
destroySpammerLinkAdded = true; destroySpammerLinkAdded = true;
var destroyLink = document.createElement("a"); var destroyLink = document.createElement('a');
destroyLink.appendChild(document.createTextNode("Destroy spammer")); destroyLink.appendChild(document.createTextNode('Destroy spammer'));
destroyLink.onclick = function () { destroyLink.onclick = function () {
// Ask for confirmation // Ask for confirmation
if (window.confirm("Are you sure?")) { if (window.confirm('Are you sure?')) {
// TODO: remember the last time this script was activated, // TODO: remember the last time this script was activated,
// and build in a 5 second delay to prevent the rate limit from triggering. // and build in a 5 second delay to prevent the rate limit from triggering.
$.post({ $.post({
url: "https://" + document.location.host + "/admin/users/" + userID + "/destroy", 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], 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 () { success: function (data) {
// Reload page // Reload page
window.location.reload(); window.location.reload();
}, },
error: function (jqXHR, textStatus, errorThrown) { error: function (jqXHR, textStatus, errorThrown) {
window.alert("An error occurred, please try again later."); window.alert('An error occurred, please try again later.');
console.log("Error: " + textStatus + " " + errorThrown); console.log('Error: ' + textStatus + ' ' + errorThrown);
} }
}); });
} }
}; };
// Add to document // Add to document
moderatorLinkElement.after(destroyLink); moderatorLinkElement.after(destroyLink);
}; };
// Check for keywords in spammers' profiles // Check for keywords in spammers' profiles
$.get(document.location.href.split("?")[0] + "?tab=profile", function (data) { $.get(document.location.href.split('?')[0] + "?tab=profile", function (data) {
if (data.search(/1\D844\D909\D0831/g) !== -1) { if (data.search(/1\D844\D909\D0831/g) != -1) {
createDestroyLink(userID); createDestroyLink(userID);
} }
}); });
// Check for (deleted) questions and answers // Check for (deleted) questions and answers
var questionsPanel = $("#user-panel-questions"); var questionsPanel = $('#user-panel-questions');
var undeletedQuestions = questionsPanel.find("td.question-hyperlink").not(".deleted-answer").length; // yes, deleted-answer. Don"t ask why. 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; var deletedQuestions = questionsPanel.find('td.question-hyperlink.deleted-answer').length;
if (undeletedQuestions > 0) { if (undeletedQuestions > 0) // User has content - use the dialog instead
return; // User has content - use the dialog instead return;
} var answersPanel = $('#user-panel-answers');
var answersPanel = $("#user-panel-answers"); var undeletedAnswers = answersPanel.find('td.answer-hyperlink').not('.deleted-answer').length;
var undeletedAnswers = answersPanel.find("td.answer-hyperlink").not(".deleted-answer").length; var deletedAnswers = answersPanel.find('td.answer-hyperlink.deleted-answer').length;
var deletedAnswers = answersPanel.find("td.answer-hyperlink.deleted-answer").length; if (undeletedAnswers > 0) // User has content - use the dialog instead
if (undeletedAnswers > 0) { return;
return; // User has content - use the dialog instead if (deletedQuestions + deletedAnswers == 0 && !userNameIsSuspicious) // User has no deleted content - use the dialog instead
} return;
if (deletedQuestions + deletedAnswers === 0 && !userNameIsSuspicious) { if (deletedQuestions + deletedAnswers > 4) // User has too much deleted content - use the dialog instead
return; // User has no deleted content - use the dialog instead return;
}
if (deletedQuestions + deletedAnswers > 4) {
return; // User has too much deleted content - use the dialog instead
}
// Create Destroy link immediately // Create Destroy link immediately
createDestroyLink(userID); createDestroyLink(userID);
})(); }) ();