From StrategyWiki, the video game walkthrough and strategy guide wiki
Jump to navigation Jump to search
m (subst'ing templates, formatting last run date)
m (fix namespace names)
 
(21 intermediate revisions by the same user not shown)
Line 1: Line 1:
if (wgTitle == wgUserName && wgNamespaceNumber == 2) {
/***********************************************************************************/
   addOnloadHook(makeEditCountButton);
/* 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/) */
/***********************************************************************************/


function makeEditCountButton() {
// Only add edit count button on user pages
  var newlist = document.createElement('li');
if (mw.config.get('wgTitle') == mw.config.get('wgUserName') && mw.config.get('wgNamespaceNumber') == 2) {
  newlist.id = "t-editcounter";
$(document).ready(function() {
  var newlink = document.createElement('a');
  newlink.href = 'javascript:countEdits()';
  var linkname = document.createTextNode('Edit counts');
  newlink.appendChild(linkname);
  newlist.appendChild(newlink);
  document.getElementById('nav_right').getElementsByTagName('ul')[0].insertBefore(newlist, document.getElementById('t-contributions').nextSibling);
}


function countEdits() {
// Add a new link after "User contributions" in the toolbox
   document.getElementById('t-editcounter').getElementsByTagName('a')[0].innerHTML = 'Calculating...';
  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));


   var editSummary = 'Edited with [[User:Najzere/edit counter.js]]';
   $('#t-editcounter').click( function() {
   if (tableClass != '') {
 
    tableClass = '|class='+tableClass;
  // Change edit counter link to let the user know it's thinking
   };
   $(this).html('Calculating...');
   if (tableFloat == 'left' || tableFloat == 'right') {
 
     tableFloat = '|style=float:'+tableFloat;
   // Set up variables
   if (mw.config.get('wgServer') == 'http://strategywiki.org') {
     var editSummary = 'Edited with [[User talk:Najzere/edit counter.js|edit counter.js]]';
    var tableTop = '[[User talk:Najzere/edit counter.js|Edit count]]';
   } else {
   } else {
     tableFloat = '';
     var editSummary = 'Edited with [[strategywiki:User talk:Najzere/edit counter.js|edit counter.js]]';
    var tableTop = '[[strategywiki:User talk:Najzere/edit counter.js|Edit count]]';
   };
   };
   var table = '{|{{prettytable'+tableClass+tableFloat+'}}\n!colspan="2"| [[User talk:Najzere/edit counter.js|Edit count]]: {{'+subst+'formatnum:';
   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 skipcaptcha = false;
   var oldpage = false;
   var oldpage = false;
   var edits;
   var edits;
   var namespaces = new Array();
  var nsnums = [];
   var movelog = new Array();
  var nsnums2 = [];
   var protectlog = new Array();
   var namespaces = [];
   var movelog = [];
   var protectlog = [];
   var next;
   var next;
   var edittoken;
   var edittoken;
   var subst = 'subst:';
   var succeeded = false;
  var brace = '{';
  var table = '{| class="wikitable '+tableClass+'" style="'+tableStyle+'"\n!colspan="2"| '+tableTop+': '+brace+brace+'subst:formatnum:';
 
  // Check if the user is autoconfirmed
  for (var right in wgUserGroups)
    if (wgUserGroups[right] == 'autoconfirmed') {skipcaptcha = true};


   queryApi('action=query&meta=userinfo&uiprop=editcount|rights', function(uiResponse) {
   // Get full edit count, as tracked by MW, add it to table
     for (var r in uiResponse.query.userinfo.rights) {
  $.ajax({
      if (uiResponse.query.userinfo.rights[r] == "autoconfirmed") {
    url: '/w/api.php?action=query&meta=userinfo&uiprop=editcount&format=json',
        skipcaptcha = true;
    dataType: 'json',
       };
     async: false,
    };
    success: function(uiResponse) {
    table += uiResponse.query.userinfo.editcount+'}}';
       table += uiResponse.query.userinfo.editcount+'}}';
    }
   });
   });


   queryApi('action=query&meta=siteinfo&siprop=namespaces', function(siResponse) {
   // Initialize namespace, move log and patrol log arrays
    for (var ns in siResponse.query.namespaces) {
  $.ajax({
      if (siResponse.query.namespaces[ns].id > -1) {
    url: '/w/api.php?action=query&meta=siteinfo&siprop=namespaces&format=json',
        if (siResponse.query.namespaces[ns].id == 0) {
    dataType: 'json',
           namespaces[siResponse.query.namespaces[ns].id] = 'Main';
    async: false,
        } else {
    success: function(siResponse) {
           namespaces[siResponse.query.namespaces[ns].id] = siResponse.query.namespaces[ns].canonical;
      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 {
            namespaces[i] = siResponse.query.namespaces[ns]["*"];
          };
           nsnums[siResponse.query.namespaces[ns].id] = i;
          nsnums2[i] = siResponse.query.namespaces[ns].id;
          movelog[i] = 0;
          protectlog[i] = 0;
          i++;
         };
         };
        movelog[siResponse.query.namespaces[ns].id] = 0;
        protectlog[siResponse.query.namespaces[ns].id] = 0;
       };
       };
     };
     }
   });
   });


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


  // Fill protect log array
   next = '';
   next = '';
   while (next != 'stop') {
   while (next != 'stop') {
     queryApi('action=query&list=logevents&letype=protect&leuser='+wgUserName+'&lelimit=max&leprop=title'+next, function(protectResponse) {
     $.ajax({
      for (var event in protectResponse.query.logevents) {
      url: '/w/api.php?action=query&list=logevents&letype=protect&leuser='+mw.config.get('wgUserName')+'&lelimit=max&leprop=title&format=json'+next,
        protectlog[protectResponse.query.logevents[event].ns] += 1;
      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';
        };
       }
       }
      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++) {
   for (var i = 0; i < namespaces.length; i++) {
     next = '';
     next = '';
     edits = 0;
     edits = 0;
     while (next != 'stop') {
     while (next != 'stop') {
       queryApi('action=query&list=usercontribs&ucuser='+wgUserName+'&uclimit=max&ucdir=newer&ucnamespace='+i+next, function(ucResponse) {
       $.ajax({
        edits += ucResponse.query.usercontribs.length;
        url: '/w/api.php?action=query&list=usercontribs&ucuser='+mw.config.get('wgUserName')+'&uclimit=max&ucdir=newer&format=json&ucnamespace='+nsnums2[i]+next,
        if (ucResponse["query-continue"]) {
        dataType: 'json',
          next = '&ucstart='+ucResponse["query-continue"].usercontribs.ucstart;
        async: false,
        } else {
        success: function(ucResponse) {
          next = 'stop';
          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];
     edits = edits - movelog[i] - protectlog[i];
     if (edits > 0) {
     if (edits > 0) {
       table += '\n|-\n| '+namespaces[i]+' || {{'+subst+'formatnum:'+edits+'}}';
       table += '\n|-\n| '+namespaces[i]+' || '+brace+brace+'subst:formatnum:'+edits+'}}';
     };
     };
   };
   };
  var rightnow = new Date().toLocaleDateString().replace(/^.*?, /g,'');
   table += '\n|-\n|colspan="2" align="center"| <small>Last run: '+brace+brace+'subst:#time:F j, Y}}</small>\n|}';
   table += '\n|-\n|colspan="2" align="center"| <small>Last run: {{'+subst+'#dateformat:'+rightnow+'|ymd}}</span>\n|}';


   queryApi('action=query&prop=info|revisions&intoken=edit&titles=User:'+wgUserName+'/'+editPage, function(propResponse) {
   // Get edit token and check if we'll be creating a new page (in the case of non-autoconfirmed users)
    for (var page in propResponse.query.pages) {
  $.ajax({
      edittoken = propResponse.query.pages[page].edittoken.replace(/\+\\$/g,'%2B%5C');
    url: '/w/api.php?action=query&prop=info|revisions&intoken=edit&format=json&titles=User:'+mw.config.get('wgUserName')+'/'+editPage,
      if (propResponse.query.pages[page]["revisions"]) {
    dataType: 'json',
        oldpage = true;
    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) {
   if (!skipcaptcha && !oldpage) {
     alert("Sorry, you're not autoconfirmed yet, so captcha is required to make new pages. Go create the page at: User:"+wgUserName+"/"+editPage+", then try again.");
     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.");
     return false;
    $(this).html('Error!');
     return;
   };
   };


   queryApi('action=edit&title=User:'+wgUserName+'/'+editPage+'&summary='+editSummary+'&minor&recreate&text='+table+'&token='+edittoken, function(actionResponse) {
   // Edit the target page with the table
     if (actionResponse.edit.result == "Success") {
  $.ajax({
      document.getElementById('t-editcounter').getElementsByTagName('a')[0].innerHTML = 'Done!';
    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,
     } else {
     type: 'POST',
      document.getElementById('t-editcounter').getElementsByTagName('a')[0].innerHTML = 'Error!';
     async: false,
    };
    success: function() { succeeded = true; }
   });
   });
}


function queryApi(query, callback) {
   // change edit count link to reflect the status of the page save
   try {
   if (succeeded) {
    var xmlRequest = new XMLHttpRequest();
     $(this).html('Done!');
   } catch(e) {
     try {
      var xmlRequest = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
      var xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
        throw "Could not create an XmlHttpRequest";
        }
      }
    }
 
  xmlRequest.open('POST', wgScriptPath+'/api.php', false);
  xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  xmlRequest.send(query+'&format=json');
  var xmlResponse = new Function("return "+xmlRequest.responseText)();
  if (!xmlResponse) {
    alert('Problem retrieving information');
   } else {
   } else {
     callback(xmlResponse);
     $(this).html('Error!');
   };
   };
}
 
  });
});
};

Latest revision as of 15:09, 11 April 2013

/***********************************************************************************/
/* 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/)  */
/***********************************************************************************/

// 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('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
  if (mw.config.get('wgServer') == 'http://strategywiki.org') {
    var editSummary = 'Edited with [[User talk:Najzere/edit counter.js|edit counter.js]]';
    var tableTop = '[[User talk:Najzere/edit counter.js|Edit count]]';
  } else {
    var editSummary = 'Edited with [[strategywiki:User talk:Najzere/edit counter.js|edit counter.js]]';
    var tableTop = '[[strategywiki:User talk:Najzere/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 nsnums = [];
  var nsnums2 = [];
  var namespaces = [];
  var movelog = [];
  var protectlog = [];
  var next;
  var edittoken;
  var succeeded = false;
  var brace = '{';
  var table = '{| class="wikitable '+tableClass+'" style="'+tableStyle+'"\n!colspan="2"| '+tableTop+': '+brace+brace+'subst:formatnum:';

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

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

  // Initialize namespace, move log and patrol log arrays
  $.ajax({
    url: '/w/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 {
            namespaces[i] = siResponse.query.namespaces[ns]["*"];
          };
          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
  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
  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
  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];
    if (edits > 0) {
      table += '\n|-\n| '+namespaces[i]+' || '+brace+brace+'subst:formatnum:'+edits+'}}';
    };
  };
  table += '\n|-\n|colspan="2" align="center"| <small>Last run: '+brace+brace+'subst:#time:F j, Y}}</small>\n|}';

  // 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('Error!');
    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!');
  };

  });
});
};