User:Poke/GuildWarsWikiTools/ContributionCount.js

From Guild Wars Wiki
Jump to navigationJump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
 /*<nowiki>*/
/**** class ContributionCount.js
 * (c) 2008-2009 by Patrick Westerhoff [poke]
 */
function ContributionCount ( userName )
{
  var i, doc, ul;
  var xmlHttp, baseUrl, url;
  var resultTable, resultHeader, resultStatus;
  var namespaces = new Object( {
      '0' : { name : 'Main',                 contribs : 0 },
      '1' : { name : 'Talk',                 contribs : 0 },
      '2' : { name : 'User',                 contribs : 0 },
      '3' : { name : 'User talk',            contribs : 0 },
      '4' : { name : 'Guild Wars Wiki',      contribs : 0 },
      '5' : { name : 'Guild Wars Wiki talk', contribs : 0 },
      '6' : { name : 'Image',                contribs : 0 },
      '7' : { name : 'Image talk',           contribs : 0 },
      '8' : { name : 'MediaWiki',            contribs : 0 },
      '9' : { name : 'MediaWiki talk',       contribs : 0 },
     '10' : { name : 'Template',             contribs : 0 },
     '11' : { name : 'Template talk',        contribs : 0 },
     '12' : { name : 'Help',                 contribs : 0 },
     '13' : { name : 'Help talk',            contribs : 0 },
     '14' : { name : 'Category',             contribs : 0 },
     '15' : { name : 'Category talk',        contribs : 0 },
    '100' : { name : 'Guild',                contribs : 0 },
    '101' : { name : 'Guild talk',           contribs : 0 },
    '102' : { name : 'Game link',            contribs : 0 },
    '103' : { name : 'Game link talk',       contribs : 0 },
    '200' : { name : 'ArenaNet',             contribs : 0 },
    '201' : { name : 'ArenaNet talk',        contribs : 0 },
    '202' : { name : 'Feedback',             contribs : 0 },
    '203' : { name : 'Feedback talk',        contribs : 0 },
     '-2' : { name : 'Media',                contribs : 0 },
     '-1' : { name : 'Special',              contribs : 0 } } );
  
  if ( userName == null )
    userName = window.prompt( 'Enter username:', wgUserName ) || wgUserName || '';
    
    try
    {
      xmlHttp = new XMLHttpRequest();
    }
    catch ( e )
    {
      return;
    }
    
    // initialization
  baseUrl    = '/api.php?format=xml&action=query&list=usercontribs&ucprop=title';
  baseUrl   += '&uclimit=' + ( wgUserGroups && ( wgUserGroups.indexOf( 'sysop' ) > -1 || wgUserGroups.indexOf( 'bot' ) > -1 ) ? '5000' : '500' );
  baseUrl   += '&ucuser=' + userName.replace( ' ', '_' );
  url        = baseUrl;
  
  initOutput();
  window.setTimeout( getContributions, 500 );
  
  /** private void initOutput () **/
  function initOutput ()
  {
    var contentSub = document.getElementById( 'contentSub' );
    resultTable    = document.createElement( 'table' );
    resultHeader   = document.createElement( 'th' );
    resultStatus   = document.createElement( 'td' );
    
    resultTable.style.width       = '350px';
    resultTable.style.margin      = '0.5em auto';
    resultTable.style.border      = '1px solid silver';
    resultTable.style.fontSize    = '85%';
    resultTable.cellPadding       = '2px';
    resultTable.cellSpacing       = '2px';
    resultHeader.colSpan          = '2';
    resultHeader.style.background = '#EEE';
    resultHeader.appendChild( document.createTextNode( 'Contribution counter for User:' + userName ) );
    resultStatus.colSpan          = '2'
    resultStatus.style.fontStyle  = 'italic';
    resultStatus.style.textAlign  = 'center';
    resultStatus.appendChild( document.createTextNode( 'Loading...' ) );
    
    resultTable.appendChild( document.createElement( 'tr' ) );
    resultTable.lastChild.appendChild( resultHeader );
    resultTable.appendChild( document.createElement( 'tr' ) );
    resultTable.lastChild.appendChild( resultStatus );
    
    contentSub.parentNode.insertBefore( resultTable, contentSub.nextSibling );
  }
  
  /** private void showContributions () **/
  function showContributions ()
  {
    var ulLeft  = document.createElement( 'ul' );
    var ulRight = document.createElement( 'ul' );
    var sum     = 0;
    
    for ( i in namespaces )
    {
      ul = ( i % 2 == 0 ) ? ulLeft : ulRight;
      ul.appendChild( document.createElement( 'li' ) );
      ul.lastChild.appendChild( document.createTextNode( namespaces[i].name + ': ' ) );
      ul.lastChild.appendChild( document.createElement( 'tt' ) );
      ul.lastChild.lastChild.appendChild( document.createTextNode( namespaces[i].contribs ) );
      sum += namespaces[i].contribs;
    }
    
    resultTable.appendChild( document.createElement( 'tr' ) );
    resultTable.lastChild.style.verticalAlign        = 'top';
    resultTable.lastChild.appendChild( document.createElement( 'td' ) );
    resultTable.lastChild.lastChild.appendChild( ulLeft );
    resultTable.lastChild.appendChild( document.createElement( 'td' ) );
    resultTable.lastChild.lastChild.appendChild( ulRight );
    resultTable.appendChild( document.createElement( 'tr' ) );
    resultTable.lastChild.appendChild( document.createElement( 'td' ) );
    
    resultStatus.innerHTML = sum + ' contributions total.';
  }
  
  /** private void actualizeContributions () **/
  function actualizeContributions ()
  {
    if ( xmlHttp.readyState != 4 )
      return;
    
    doc = xmlHttp.responseXML;
    
    for ( i in namespaces )
    {
      namespaces[i].contribs += doc.evaluate( 'count( /api/query/usercontribs/item[ @ns = ' + i + ' ] )',
        doc, null, XPathResult.NUMBER_TYPE, null ).numberValue;
    }
    
    if ( doc.getElementsByTagName( 'query-continue' ).length > 0 )
    {
      url  = baseUrl + '&ucstart=' + doc.evaluate( '/api/query-continue/usercontribs/@ucstart',
        doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue.nodeValue;
      window.setTimeout( getContributions, 500 );
      resultStatus.innerHTML += '..';
    }
    else
      showContributions();
  }
  
  /** private void getContributions **/
  function getContributions ()
  {
    if ( url != null )
    {
      xmlHttp = new XMLHttpRequest();
      xmlHttp.onreadystatechange = actualizeContributions;
      xmlHttp.open( 'GET', url, true );
      xmlHttp.send( null );
      url = null;
    }
  }
}

/* start */
new ContributionCount();
/*</nowiki>*/