User:Majr/editcounter.js

From Minecraft Wiki
Jump to: navigation, search
/***********************************************************************************/
/* Edit counter script                                                             */
/*   author:        User:Najzere @ strategywiki.org                                */
/*   source:        http://strategywiki.org/wiki/User:Najzere/edit_counter.js      */
/*   documentation: http://strategywiki.org/wiki/User_talk:Najzere/edit_counter.js */
/*   contact:       http://strategywiki.org/wiki/User_talk:Najzere                 */
/*   license:       CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/)  */
/***********************************************************************************/

$(document).ready(function() {

// Add a new link after "User contributions" in the toolbox
  if ($('#t-contributions').length==0) {
    alert('Expected element not found. Please see http://strategywiki.org/wiki/User_talk:Najzere to have your wiki added.');
    return;
  };
  var $editCountLink = $('<a>Edit counter</a>').attr( { id: 't-editcounter', href: '#', title: 'Run edit counter script' } );
  $('#t-contributions').after($('<li></li>').html($editCountLink));

  $('#t-editcounter').click( function() {

  // Change edit counter link to let the user know it's thinking
  $(this).html('Calculating...');

  // Set up variables
  var editSummary = 'Edited with http://strategywiki.org/wiki/User_talk:Najzere/edit_counter.js';
  var tableTop = '[http://strategywiki.org/wiki/User_talk:Najzere/edit_counter.js edit counter.js]';
  if (typeof(editPage) == 'undefined') {editPage = 'Edit count'};
  if (typeof(tableClass) == 'undefined') {tableClass = ''};
  if (typeof(tableStyle) == 'undefined') {tableStyle = ''};
  if (editPage == '') {editPage = 'Edit count'};
  var skipcaptcha = false;
  var oldpage = false;
  var edits = [];
  var namespaces = [];
  var movelog = [];
  var protectlog = [];
  var next;
  var edittoken;
  var succeeded = false;
  var brace = '{';
  var table = '<div style="text-align: center; margin-bottom: 1em"><span style="font-weight: bold">Edit count</span>\n{| class="wikitable '+tableClass+'" style="text-align: center; margin: 0 auto"\n|-\n! ';

  // Check if the user is autoconfirmed
  for (var right in wgUserGroups)
    if (wgUserGroups[right] == 'autoconfirmed') {skipcaptcha = true};

  // Initialize namespace, move log and patrol log arrays
  $.ajax({
    url: '/api.php?action=query&meta=siteinfo&siprop=namespaces&format=json',
    dataType: 'json',
    async: false,
    success: function(siResponse) {
      for (var ns in siResponse.query.namespaces) {
        if (siResponse.query.namespaces[ns].id > -1) {
          if(siResponse.query.namespaces[ns].id != namespaces.length)
            break;
          if (siResponse.query.namespaces[ns].id == 0) {
            namespaces[siResponse.query.namespaces[ns].id] = 'Main';
          } else if (siResponse.query.namespaces[ns].id == 4) {
            namespaces[siResponse.query.namespaces[ns].id] = 'Minecraft Wiki';
          } else if (siResponse.query.namespaces[ns].id == 5) {
            namespaces[siResponse.query.namespaces[ns].id] = 'Minecraft Wiki talk';
          } else {
            namespaces[siResponse.query.namespaces[ns].id] = siResponse.query.namespaces[ns].canonical;
          };
          movelog[siResponse.query.namespaces[ns].id] = 0;
          protectlog[siResponse.query.namespaces[ns].id] = 0;
        };
      };
    }
  });

  // Fill move log array
  next = '';
  while (next != 'stop') {
    $.ajax({
      url: '/api.php?action=query&list=logevents&letype=move&leuser='+mw.config.get('wgUserName')+'&lelimit=max&leprop=title&format=json'+next,
      dataType: 'json',
      async: false,
      success: function(moveResponse) {
        for (var event in moveResponse.query.logevents) {
          movelog[moveResponse.query.logevents[event].ns] += 1;
        };
        if (moveResponse["query-continue"]) {
          next = '&lestart='+moveResponse["query-continue"].logevents.lestart;
        } else {
          next = 'stop';
        };
      }
    });
  };

  // Fill protect log array
  next = '';
  while (next != 'stop') {
    $.ajax({
      url: '/api.php?action=query&list=logevents&letype=protect&leuser='+mw.config.get('wgUserName')+'&lelimit=max&leprop=title&format=json'+next,
      dataType: 'json',
      async: false,
      success: function(protectResponse) {
        for (var event in protectResponse.query.logevents) {
          protectlog[protectResponse.query.logevents[event].ns] += 1;
        };
        if (protectResponse["query-continue"]) {
          next = '&lestart='+protectResponse["query-continue"].logevents.lestart;
        } else {
          next = 'stop';
        };
      }
    });
  };
  
  // Loop through namespaces counting edits and subtracting page moves and patrols
  for (var i = 0; i < namespaces.length; i++) {
    next = '';
    while (next != 'stop') {
      $.ajax({
        url: '/api.php?action=query&list=usercontribs&ucuser='+mw.config.get('wgUserName')+'&uclimit=max&ucdir=newer&format=json&ucnamespace='+i+next,
        dataType: 'json',
        async: false,
        success: function(ucResponse) {
          edits[i] = ucResponse.query.usercontribs.length - movelog[i] - protectlog[i];
          if (ucResponse["query-continue"]) {
            next = '&uccontinue='+ucResponse["query-continue"].usercontribs.uccontinue;
          } else {
            next = 'stop';
          };
        }
      });
    };
  };
  
  for (var i = 0; i < namespaces.length; i++) {
      if (edits[i] > 0) {
          table += namespaces[i]+' !! ';
      };
  }
  table += 'Total\n|-\n| ';
  
  for (var i = 0; i < namespaces.length; i++) {
      if (edits[i] > 0) {
          table += brace+brace+'subst:formatnum:'+edits[i]+'}} || ';
      };
  }

  // Get full edit count, as tracked by MW, add it to table
  $.ajax({
    url: '/api.php?action=query&meta=userinfo&uiprop=editcount&format=json',
    dataType: 'json',
    async: false,
    success: function(uiResponse) {
      table += brace+brace+'subst:formatnum:'+uiResponse.query.userinfo.editcount+'}}\n|}';
    }
  });

  table += '<span style="font-size: x-small">Last updated: '+brace+brace+'subst:#time:F j, Y}}. Generated with '+tableTop+'</span>\n</div>';

  // Get edit token and check if we'll be creating a new page (in the case of non-autoconfirmed users)
  $.ajax({
    url: '/api.php?action=query&prop=info|revisions&intoken=edit&format=json&titles=User:'+mw.config.get('wgUserName')+'/'+editPage,
    dataType: 'json',
    async: false,
    success: function(propResponse) {
      for (var page in propResponse.query.pages) {
        edittoken = propResponse.query.pages[page].edittoken.replace(/\+\\$/g,'%2B%5C');
        if (propResponse.query.pages[page]["revisions"]) {
          oldpage = true;
        };
      };
    }
  });

  // If the user is not autoconfirmed and we're creating a new page, kick out of the script
  if (!skipcaptcha && !oldpage) {
    alert("Sorry, you're not autoconfirmed yet, so captcha is required to make new pages. Go create the page at: User:"+mw.config.get('wgUserName')+"/"+editPage+", then try again.");
    $(this).html('Error!');
    return;
  };

  // Edit the target page with the table
  $.ajax({
    url: '/api.php?action=edit&title=User:'+mw.config.get('wgUserName')+'/'+editPage+'&summary='+editSummary+'&minor=1&recreate=1&bot=1&text='+escape(table)+'&token='+edittoken,
    type: 'POST',
    async: false,
    success: function() { succeeded = true; }
  });

  // change edit count link to reflect the status of the page save
  if (succeeded) {
    $(this).html('Done!');
  } else {
    $(this).html('Error!');
  };

  });
});