Spaz's Reddit Delete

Replaces all VISIBLE comments with garbage text, then deletes the comment. Works with RES!

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        Spaz's Reddit Delete
// @namespace   Reddit
// @include     http*://*.reddit.com/user/*
// @version     1
// @description Replaces all VISIBLE comments with garbage text, then deletes the comment. Works with RES!
// ==/UserScript==

RD = unsafeWindow.RedditDelete = {};
RD.DELAY_SAVE   = 2 * 1000;
RD.DELAY_DELETE = 3 * 1000;
RD.chars      = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz><.-,+!@#$%^&*();:[]~';
RD.started    = false;

function __getRNGString(maxLength) {
  var rnum, repl_str = '';

  for (var x = 0; x < maxLength; x++){
    rnum = Math.floor(Math.random() * RD.chars.length);
    repl_str += RD.chars.charAt(rnum, 1);
  }

  return repl_str;
}

function _setupEnv() {
  if (RD.started) return;

  RD.numDel       = 0;
  RD.contentCtnr  = document.querySelector('div.content');
  RD.infoBar      = document.createElement('span');
  RD.userName     = document.querySelector('span.user > a:not(.login-required)').innerHTML;
  RD.infoBar.setAttribute('class', 'nextprev');
  RD.started      = true;
}

function _setupUI() {
  //Build DELETE-ALL Link
  var delAllLink        = document.createElement('a');
  delAllLink.innerHTML  = 'SECURE DELETE ALL COMMENTS';
  delAllLink.onclick    = _promptDeleteAll;
  delAllLink.style.cssText = "color: rgb(200, 0, 0); text-shadow: -1px 0px 6px rgba(0,0,0, 0.7);";

  //Add to infoBar!
  RD.infoBar.appendChild(delAllLink);
  RD.contentCtnr.insertBefore(RD.infoBar, RD.contentCtnr.firstChild);
}

function _promptDeleteAll() {
  var doDelete = confirm("Are you sure you want to delete all comments on the screen?\n\n"
    + "ProTip: If you want to delete ALL, use RES and use 'Never Ending Reddit' feature to show ALL comments.");

  if (!doDelete) return;

  _deleteAll();
}

function _deleteAll() {
  var modalCntr = RD.modalCntr = document.createElement('div');
  var modalMsg  = RD.modalMsg  = document.createElement('div');
  var cancelBtn  = document.createElement('button');
  modalCntr.style.cssText = ''
   + 'position: fixed; top: 0; left: 0; right: 0; bottom: 0;'
   + 'height: 100%; width: 100%; background: rgba(0,0,0,0.8);'

  modalMsg.style.cssText = ''
   + 'position: absolute; font-size: 32px; transform: translateX(-50%); top: 50%; left: 50%;'

  cancelBtn.style.cssText = ''
   + 'position: absolute; font-size: 22px;'
   + 'transform: translateX(-50%); top: 63%; left: 50%;'

  cancelBtn.innerHTML = "Cancel";
  cancelBtn.onclick = function() {
    RD.modalMsg.innerHTML = "Cancelling..."
    RD.numDel = RD.comments.length;
  }

  RD.comments = __getVisibleComments();
  RD.numDel     = 0;

  modalCntr.appendChild(modalMsg);
  modalCntr.appendChild(cancelBtn);
  document.body.appendChild(modalCntr);

  __deleteCommentIndex(0);
}

function __getVisibleComments() {
  var foundComments = [];

  var entries     = RD.contentCtnr.querySelectorAll('.entry.likes');
  var entry       = null;
  var entryAuthor = '';

  for (var idx = 0; idx < entries.length; idx++) {
    entry = entries[idx];
    entryAuthor = entry.querySelector('.author');

    if (!entryAuthor || entryAuthor.innerHTML !== RD.userName) continue;

    foundComments.push(entry);
  };

  return foundComments;
}

function __deleteCommentIndex(idx) {
  var comment = RD.comments[idx];

  __overwriteComment(comment, function(comment) {
    __deleteComment(comment, function() {
      var complete = RD.numDel >= RD.comments.length;
      if (false === complete) {
        RD.numDel++;
        __deleteCommentIndex(RD.numDel);
      } else {
        window.location.reload();
      }
    });
  });
}

function __overwriteComment(comment, callback) {
  var editLink = comment.querySelector('.edit-usertext');
  var editText, newText, saveLink;

  RD.modalMsg.innerHTML = 'Overwriting ' + (RD.numDel + 1) + ' of ' + RD.comments.length + '...';

  if (!editLink) { if (callback) callback(comment); return; }

  //Enable editing...
  editLink.click();
  editText = comment.querySelector('textarea');
  saveBtn = comment.querySelector('.usertext-buttons .save');

  //Replace Text with RNG string
  newText         = __getRNGString(editText.value.length);
  editText.value  = newText;

  //Do the save...
  saveBtn.click();
  setTimeout(function() { if (callback) callback(comment); }, RD.DELAY_SAVE);
}

function __deleteComment(comment, callback) {
  RD.modalMsg.innerHTML = 'Deleting ' + (RD.numDel + 1) + ' of ' + RD.comments.length + '...';

  var deleteLink = comment.querySelector('form.del-button .togglebutton')
  var yesLink;

  //Enable deleting...
  deleteLink.click();
  yesLink = comment.querySelector('.option.error.active a.yes');

  if (!yesLink) { if (callback) callback(); return; }

  //Delay clicking YES so the user can see it
  setTimeout(function() {
    //Do the delete...
    yesLink.click();
    setTimeout(function() { if (callback) callback(); }, RD.DELAY_DELETE);
  }, 250);
}

(function() {
  _setupEnv();
  _setupUI();
})();