Usuário:Juan90264/DesabilitarRollback.js/teste.js

Origem: Wikipédia, a enciclopédia livre.

Nota: Depois de publicar, poderá ter de contornar a cache do seu navegador para ver as alterações.

  • Firefox / Safari: Pressione Shift enquanto clica Recarregar, ou pressione Ctrl-F5 ou Ctrl-R (⌘-R no Mac)
  • Google Chrome: Pressione Ctrl-Shift-R (⌘-Shift-R no Mac)
  • Internet Explorer / Edge: Pressione Ctrl enquanto clica Recarregar, ou pressione Ctrl-F5
  • Opera: Pressione Ctrl-F5.
/// Carregar o CSS do script
mw.loader.load( 'https://pt.wikipedia.org/w/index.php?title=User:Juan90264/DesabilitarRollback.js/teste.css&action=raw&ctype=text/css', 'text/css' );

/// Cria uma lista dos usuários que editaram nas edições disponíveis
function usersEdits(reload) {
  var editsUsers = [];
  var editsUsersNumber = $("span.mw-rollback-link > a").length;
  for (var i = 0; i < editsUsersNumber; i++) {
    try {
      var edit = $("span.mw-rollback-link > a").eq(i).attr("href").replaceAll(/\+/gm, " ");
      var regexUser = /from=(?<user>[A-Za-zá-úÁ-Ú0-9-:\/\?+.,_% ]*)/gm;
      var resultUser = regexUser.exec(decodeURIComponent(edit));
      var resultUser1 = resultUser.groups.user;
      editsUsers.push(resultUser1);
    } catch {
      break;
    }
  }
  var set = new Set(editsUsers);
  var editUsersRemoveDuplicate = Array.from(set);
  /// Limita a quantidade de usuários para no máximo de 50 usuários,
  /// evitando ultrapassar o limite da API no "action=query&usprop=groups&ususers="
  var editsUsersNumberRemoveDuplicate = editUsersRemoveDuplicate.slice(0, 50).length;
  var editsUsers = editUsersRemoveDuplicate.slice(0, 50).join("|");

  /// Remove IPs da listagem IPV4 e IPV6
  /// Regex derivado do código disponível no GitHub
  /// De: https://gist.github.com/magnunleno/1190466
  /// Sob licença GLPv3
  var regexIPs = /(\|*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\|*)|(\|*([A-Za-z0-9]*::*[A-Za-z0-9]*)\|*)/gm;
  var editsUsersRemoveIPs = editsUsers.replaceAll(regexIPs, "|");
  var editsUsersNumberRemoveIPs = editsUsersRemoveIPs.trim().split("|").length;

  userAutorreviewer(editsUsersRemoveIPs, editsUsersNumberRemoveDuplicate, reload);
}

/// Identifica os usuários autorrevisores/não autorrevisores nas edições disponíveis
function userAutorreviewer(userEdit, editsUsersNumberRemoveDuplicate, reload) {
  var params = {
	  action: "query",
	  format: "json",
	  list: "users",
	  formatversion: "2",
	  usprop: "groups",
	  ususers: userEdit
  },
  api = new mw.Api();
  api.post( params ).done(function(r){
    /// Verifica também se é administrador ou eliminador, levando em consideração que esse estatuto
    /// acaba deixando obsoleto o estatuto de autorrevisor em alguns casos,
    /// e não aparecendo nos grupos de usuários do último usuário que editou uma página
    var userGroupsAutorreviewer = [];
    var userGroupsResult = [];
    for (var i = 0; i < editsUsersNumberRemoveDuplicate; i++) {
      /// Impede que o limite de edições pare o funcionamento do script
      /// Se o número de edições for menor do que o limite de edições
      try {
        userGroupsAutorreviewer.push(r.query.users[i].name);
        var userGroups = r.query.users[i].groups;
        var userGroupsConditions = ["autoreviewer", "sysop", "eliminator"];
        var resultAutorreviewer = userGroupsConditions.some(r => userGroups.toString().includes(r));
        userGroupsResult.push(resultAutorreviewer);
      } catch {
        break;
      }
    }

    /// Cria botão para desabilitar
    /// Se já houver o botão, o script ignora
    if ($("#ca-desabilitarollback").length) {
    } else {
      var menu = mw.util.addPortlet( 'p-cactions' );
      document.body.appendChild(menu);
      var menuButton = mw.util.addPortletLink( 
         'p-cactions', 
         '#', 
         'DesabilitarRollback (' + ( localStorage.getItem( 'desabilitarollbackHidden' ) == 'true' ? 'esconder' : 'exibir' ) + ')', 
         "ca-desabilitarollback" );
    }

    /// Remove o botão "DesabilitarRollback (exibir/esconder)",
    /// Caso haja um clique em "Ver as novas alterações"
    if (reload == "yes") {
      $("#ca-desabilitarollback").remove();
    } else {
    }

    /// Verifica se os usuários são autorrevisores ou não autorrevisores nas edições disponíveis
    for (var i = 0; i < editsUsersNumberRemoveDuplicate; i++) {
      /// Evita que ocorra um erro, quando não houver nenhum elemento "span",
      /// como o usuário autorrevisor
      try {
        var buttonRollbackPreload = "span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']";
        var separatorRollbackPreload = "span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span";
      } catch {
        var buttonRollbackPreload = "";
        var separatorRollbackPreload = "";
      }
      if (userGroupsResult[i]) {
        /// Verifica se o botão para desabilitar já estava ativado/não ativado
        if (localStorage.getItem( 'desabilitarollbackHidden' ) == 'true') {
          $(buttonRollbackPreload).parent().removeClass("RollbackNone");
          $(separatorRollbackPreload).removeClass("RollbackNone");
          /// Checa se aparece o botão agradecer ao lado do botão de reverter, se aparecer
          /// o script remove a classe para esconder os parenteses
          try {
            if ($("span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span > a").length) {
            } else if ($("span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span > span > a").length) {
            } else {
              $("span.mw-changeslist-links.mw-pager-tools:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "'])").removeClass("RollbackNone2");
            }
          } catch {
          }
        } else {
          $(buttonRollbackPreload).parent().addClass("RollbackNone");
          $(separatorRollbackPreload).addClass("RollbackNone");
          /// Checa se aparece o botão "agradecer" ao lado do botão "reverter", se não aparecer
          /// o script adiciona a classe para esconder os parenteses
          try {
            if ($("span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span > a").length) {
            } else if ($("span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span > span > a").length) {
            } else {
              $("span.mw-changeslist-links.mw-pager-tools:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "'])").addClass("RollbackNone2");
            }
          } catch {
          }
        }
      } else {
      }
    }

    /// Exibe/esconde o botão "Reverter"
    $("#ca-desabilitarollback").click(function(){
      if (localStorage.getItem( 'desabilitarollbackHidden' ) == 'true') {
        localStorage.setItem( 'desabilitarollbackHidden', false );
        $("#ca-desabilitarollback > a" ).text("DesabilitarRollback (exibir)");
        for (var i = 0; i < editsUsersNumberRemoveDuplicate; i++) {
          if (userGroupsResult[i]) {
            /// Evita que ocorra um erro, quando não houver nenhum elemento "span",
            /// como o usuário autorrevisor
            try {
              var buttonRollback = "span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']";
              var separatorRollback = "span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span";
            } catch {
              var buttonRollback = "";
              var separatorRollback = "";
            }
            $(buttonRollback).parent().addClass("RollbackNone");
            $(separatorRollback).addClass("RollbackNone");
            /// Checa se aparece o botão "agradecer" ao lado do botão "reverter", se não aparecer
            /// o script adiciona a classe para esconder os parenteses
            try {
              if ($("span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span > a").length) {
              } else if ($("span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span > span > a").length) {
              } else {
                $("span.mw-changeslist-links.mw-pager-tools:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "'])").addClass("RollbackNone2");
              }
            } catch {
            }
          } else {
          }
        }
      } else {
        localStorage.setItem( 'desabilitarollbackHidden', true );
        $("#ca-desabilitarollback > a").text("DesabilitarRollback (esconder)");
        for (var i = 0; i < editsUsersNumberRemoveDuplicate; i++) {
          if (userGroupsResult[i]) {
            /// Evita que ocorra um erro, quando não houver nenhum elemento "span",
            /// como o usuário autorrevisor
            try {
              var buttonRollback1 = "span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']";
              var separatorRollback1 = "span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span";
            } catch {
              var buttonRollback1 = "";
              var separatorRollback1 = "";
            }
            $(buttonRollback1).parent().removeClass("RollbackNone");
            $(separatorRollback1).removeClass("RollbackNone");
            try {
              if ($("span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span > a").length) {
              } else if ($("span:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "']) + span > span > a").length) {
              } else {
                $("span.mw-changeslist-links.mw-pager-tools:has(span.mw-rollback-link > a[href*='from=" + encodeURI(userGroupsAutorreviewer[i].replaceAll(/[ ]/gm, "+")) + "'])").removeClass("RollbackNone2");
              }
            } catch {
            }
          } else {
          }
        }
      }
    });
  }).catch(function(e){
      mw.notify( $( "<span>Não foi possível realizar a verificação dos usuários autorrevisores/não autorrevisores.<br />A API retornou o código de erro: " + e + "<br />Se o problema persistir, favor informar no <a href='" + mw.util.getUrl( 'WP:Café dos Programadores' ) + "'>Café dos programadores</a></span>"), { autoHideSeconds: 10 });
  });
}

/// Inicia o script
usersEdits();

/// Se houver novas alterações nas páginas vigiadas
/// e nas mudanças recentes, o script é novamente executado
$(".mw-rcfilters-ui-filterWrapperWidget-showNewChanges > a").click(function(){
  /// Espera 10 segundos antes de novamente executar o script
  setTimeout(function(){ 
    usersEdits("yes");
  }, 10000);
});