Jump to content

User:Technical 13/Scripts/Edit counter.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Technical 13 (talk | contribs) at 13:54, 25 June 2013 (+1 was correct... I get it now... Finalizing that patch and Working on overall offset check...). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/********************************************************************************************/
/* Edit counter script based on strategywiki.org/wiki/User:Najzere/edit_counter.js          */
/*   author:        User:Technical_13                                                       */
/*   source:        http://en.wikipedia.org/wiki/User:Technical_13/edit_counter.js          */
/*   documentation: http://en.wikipedia.org/wiki/User:Technical_13/edit_counter  (redlink)  */
/*   contact:       http://en.wikipedia.org/wiki/User_talk:Technical_13                     */
/*   license:       CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/)           */
/********************************************************************************************/
 
// Only add edit count button on user pages
if (mw.config.get('wgTitle') == mw.config.get('wgUserName') && mw.config.get('wgNamespaceNumber') == 2) {
$(document).ready(function() {
 
// Add a new link after "User contributions" in the toolbox
  if ($('#t-contributions').length === 0) {
    alert('Missing "User contributions" link in the side menu! Contact script creator for assistance.');
    return;
  }
  var $editCountLink = $('<a>Edit counter</a>').attr( { id: 't-editcounter', href: '#', title: 'Run edit counter script' } );
  $('#t-contributions').after($('<li></li>').html($editCountLink));
 
// start process
  $('#t-editcounter').click( function() {
 
// Set up variables
  $(this).html('Initializing<br />variables...');
  if (document.location.href == 'http://en.wikipedia.org') {
    var editSummary = 'Edited with [[User:Technical_13/Scripts/Edit_counter.js|edit counter.js]]';
    var tableTop = '[[User:Technical_13/Scripts/Edit_counter.js|Edit count]]';
  } else {
    var editSummary = 'Edited with [[W:User:Technical_13/Scripts/Edit_counter.js|edit counter.js]]';
    var tableTop = '[[W:User:Technical_13/Scripts/Edit_counter.js|Edit count]]';
  }
  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 editcount;
  var nsnums = [];
  var nsnums2 = [];
  var namespaces = [];
  var movelog = [];
  var protectlog = [];
  var next;
  var edittoken;
  var succeeded = false;
  var brace = '{';
  var table;
  var tableTop = '{| class="wikitable '+tableClass+'" style="'+tableStyle+'"\n!colspan="2"| '+tableTop+': '+brace+brace+'subst:formatnum:';
 
// Check if the user is autoconfirmed
  $(this).html('CAPTCHA test...');
  for (var right in wgUserGroups)
    if (wgUserGroups[right] == 'autoconfirmed') { skipcaptcha = true; }
 
// Get full edit count, as tracked by MW, add it to table
  $(this).html('Gathering total edits...');
  $.ajax({
    url: '/w/api.php?action=query&meta=userinfo&uiprop=editcount&format=json',
    dataType: 'json',
    async: false,
    success: function(uiResponse) {
      mw-editcount = uiResponse.query.userinfo.editcount;
      tableTop += mw-editcount;
    }
  });
 
// Initialize namespace, move log and patrol log arrays
  $(this).html('Gathering<br />namespaces');
  $.ajax({
    url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&meta=siteinfo&siprop=namespaces&format=json',
    dataType: 'json',
    async: false,
    success: function(siResponse) {
      var i = 1;
      for (var ns in siResponse.query.namespaces) {
        if (siResponse.query.namespaces[ns].id > -1) {
          if (siResponse.query.namespaces[ns].id === 0) {
            namespaces[i] = 'Main';
          }
          else if (siResponse.query.namespaces[ns].id == 4) {
            namespaces[i] = mw.config.get('wgSiteName');
          }
          else if (siResponse.query.namespaces[ns].id == 5) {
            namespaces[i] = mw.config.get('wgSiteName') + ' talk';
          }
          else {
            namespaces[i] = siResponse.query.namespaces[ns].canonical;
          }
          nsnums[siResponse.query.namespaces[ns].id] = i;
          nsnums2[i] = siResponse.query.namespaces[ns].id;
          movelog[i] = 0;
          protectlog[i] = 0;    
          i++;
        }
      }
    }
  });
 
// Fill move log array
  $(this).html('Counting page<br />move logs');
  next = '';
  while (next != 'stop') {
    $.ajax({
      url: '/w/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[nsnums[moveResponse.query.logevents[event].ns]] += 1;
        }
        if (moveResponse["query-continue"]) {
          next = '&lestart='+moveResponse["query-continue"].logevents.lestart;
        } else {
          next = 'stop';
        }
      }
    });
  }
 
// Fill protect log array
  $(this).html('Counting page<br />protection logs');
  next = '';
  while (next != 'stop') {
    $.ajax({
      url: '/w/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[nsnums[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
  $(this).html('Pulling all<br />edits from<br />the API...');
  for (var i = 0; i < namespaces.length; i++) {
    next = '';
    edits = 0;
    while (next != 'stop') {
      $.ajax({
        url: '/w/api.php?action=query&list=usercontribs&ucuser='+mw.config.get('wgUserName')+'&uclimit=max&ucdir=newer&format=json&ucnamespace='+nsnums2[i]+next,
        dataType: 'json',
        async: false,
        success: function(ucResponse) {
          edits += ucResponse.query.usercontribs.length;
          if (ucResponse["query-continue"]) {
            next = '&ucstart='+ucResponse["query-continue"].usercontribs.ucstart;
          } else {
            next = 'stop';
          }
        }
      });
    }
    edits = edits - movelog[i] - protectlog[i];
    editcount += edits;
    if (edits > 0) {
      table += '\n|-\n| '+namespaces[i]+' || '+brace+brace+'subst:formatnum:'+edits+'}}';
    }
  $(this).html('Calculating<br />edits in<br />'+namespaces[i+1]);
  }
  tableTop += editcount / mw-editcount +'}}';
  table += '\n|-\n|colspan="2" align="center"| <small>Last run: '+brace+brace+'subst:#time:F j, Y}}</small>\n|}';
  table = tableTop+table;
 
// Get edit token and check if we'll be creating a new page (in the case of non-autoconfirmed users)
  $.ajax({
    url: '/w/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('<span class="text-weight: bold; text-align: center; font-color: #FF3333; text-decoration: blink;">Error!</span>');
    return;
  }
 
// Edit the target page with the table
  $.ajax({
    url: '/w/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!');
  }
  });
});
}