Year of the Dragon: Through May 28th, claim free Expansion Pack (excluding Vecna Unleashed) or a Greater Elixir of Discovery! Speak to Xatheral in the Hall of Heroes. edit

Thank you for your patience while we continue to upgrade DDOwiki to the latest MediaWiki LTS version. If you find any errors on the site, please visit the Discord chat server and let us know.

Game mechanicsNewbie guideIn developmentDDO StoreSocial Media


ChallengesClassesCollectablesCraftingEnhancementsEpic DestiniesFavorFeats

GlossaryItemsMapsMonstersPlacesQuestsRacesReincarnationSkillsSpells


Please create an account or log in to remove ads, build a reputation, and unlock more editing privileges and then visit DDO wiki's IRC Chat/Discord if you need any help!

MediaWiki:Autopromote.js

From DDO wiki
Jump to navigation Jump to search

Note: After saving, you may have to bypass your browser's cache to see the changes, you can click here or try one of the methods below..

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl+F5 or Ctrl+r ( Command+r on a Mac)
  • Google Chrome: Press Ctrl+ Shift+R ( Command+ Shift+R on a Mac)
  • Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl+F5
  • Konqueror: Click Reload or press F5
  • Opera: Clear the cache in Tools ‣ Preferences
//<nowiki>
( function ( mw, $ ) {
  // Initialize some constants
  var promotionCandidates = {};
  /* [[DDO:Ddowikivip]]: "... any user with a triple digit edit count ... is qualified..." */
  var ecVIP = 100;// ([[C:100 edit users]])
  /* [[DDO:Superuser]]: "... up to at least 250 edit users ..." */
  var ecSU = 250;// [[C:250 edit users]]
  var toVipTopic = 'Congratulations! You\'re a DDO wiki VIP!';
  var toSuTopic = 'Congratulations! You\'re a SuperUser!';
  var editsSummary =
    encodeURIComponent( 'Updated edit count with [[MediaWiki:Autopromote.js|Auto-promote]]' );
  var toVipSummary =
    encodeURIComponent( 'Promoted to DDO wiki VIP with [[MediaWiki:Autopromote.js|Auto-promote]]' );
  var toSuSummary =
    encodeURIComponent( 'Promoted to SuperUser with [[MediaWiki:Autopromote.js|Auto-promote]]' );
  var toVipTalk = '';
  var toSuTalk = '';
  var toVipEmail = '';
  var toSuEmail = '';
  
  // Function to send an email through the API
/*  function sendEmail( userName = 'Unknown user' ) {
    
  }*/

  // Get a complete list of users, edit counts, account ages, and current groups.
  var aufrom = '';// start at the beginning
  while( aufrom !== '#' ) {
    $.ajax( {//* REALLY DON'T LIKE THIS!!! *//*
      url: 'https://ddowiki.com/api.php?'
        + 'action=query'
        + '&format=json'
        + '&list=allusers'
        + '&aulimit=max'
        + '&auwitheditsonly=1'
        + '&auexcludegroup=sysop|bureaucrat|steward'
        + '&auprop=groups|blockinfo|editcount|registration'
        + '&aufrom=' + aufrom,
      dataType: 'json',
      async: false,//* REALLY DON'T LIKE THIS!!! IT WILL FAIL IN THE FUTURE!!! *//*
      success: function( successData ) {
        var resultObject = successData.query.allusers;
        $.each( resultObject, function( ) {
          var isBlocked = ( $( this )[ 0 ].blockedby !== undefined ? true : false );
          var editCount = $( this )[ 0 ].editcount;// API editcount (deleted edits not included)
          var isSU =// Is the user a superuser
            ( $.inArray( 'superuser', $( this )[ 0 ].groups ) !== -1 ? true : false );
          var isVIP =// Is the user a ddowikivip
            ( $.inArray( 'ddowikivip', $( this )[ 0 ].groups ) !== -1 ? true : false );
          // If the user is not blocked, and should be a VIP or SU but isn't, then...
          if ( !isBlocked &&
            ( ( !isVIP && editCount >= ecVIP ) || ( !isSU && editCount >= ecSU ) ) ) {
            promotionCandidates[ $( this )[ 0 ].name ] = {};// Create an object with the user name
            promotionCandidates[ $( this )[ 0 ].name ].editcount =
              editCount;// Put edit count in user's object
            var currDate = new Date();// Define a new date constructor
            var currDateInMonths =// Calculate the current number of months since Jan 2000
              currDate.getFullYear() * 12 + currDate.getMonth();
            var regSince =// Date object for registration date
              ( $( this )[ 0 ].registration === ''
                ? new Date( 1999, 11, 30 ) : new Date( $( this )[ 0 ].registration ) );
            var age =// Calculate age in months
              ( currDateInMonths - ( ( regSince.getFullYear() * 12 ) + regSince.getMonth() ) );
            promotionCandidates[ $( this )[ 0 ].name ].age = age;// account age
            promotionCandidates[ $( this )[ 0 ].name ].isSU = isSU;// superuser status
            promotionCandidates[ $( this )[ 0 ].name ].isVIP = isVIP;// ddowikivip status
          }
        } );
        if ( successData[ 'query-continue' ] !== undefined ) {
          aufrom = successData[ 'query-continue' ].allusers.aufrom;// More users to process
        } else {
          aufrom = '#';// Last page - [[User:#]] can not exist and returns "Bad title" if you try.
        }
      },
      fail: function( failureData ) {
        alert( 'Sorry, failed to retrieve information from API.\n'
          + 'Please check the console for more details if available.' );
        console.error( '%O', failureData );
      }
    } );
  }
  
  $( 'li#ca-nstab-special span a' ).attr( 'href',
    './Special:BlankPage?withJS=MediaWiki:Autopromote.js' );// Reload the script                     -- needs to be adjusted later
  $( '#firstHeading span' ).text( 'Semi-auto-promote' );// The title for the page                    -- come up with something better later
  $( '#mw-content-text' ).html( '<div class="mw-semiautopromote-intro">' +
    '<p>List of users meeting the requirements for inclusion in ddowikivip or superuser.</p>'
    + '</div>' );// Page description
  $( '.mw-semiautopromote-intro' ).after(
    '<ul id="mw-semiautopromote-canididates"></ul>' );// Create a fillable <ul>
  function userLastEdit( userName ) {
    userName = typeof userName !== 'undefined' ? userName : 'Unknown user';
    $.ajax( {//* REALLY DON'T LIKE THIS!!! *//*
      url: 'https://ddowiki.com/api.php?'
        + 'action=query'
        + '&format=json'
        + '&list=usercontribs|logevents'
        + '&lelimit=1'
        + '&leprop=timestamp'
        + '&uclimit=1'
        + '&ucprop=timestamp'
        + '&ucuser=' + encodeURIComponent( userName )
        + '&leuser=' + encodeURIComponent( userName ),
      dataType: 'json',
      success: function( userData ) {
        var currDate = new Date();// Define a new date constructor
        var currDateInMonths =// Calculate the current number of months since Jan 2000
          currDate.getFullYear() * 12 + currDate.getMonth();
        var lastEdit =// Date object for date of last edit
          ( userData.query.usercontribs[ 0 ] === undefined
            ? new Date( 1999, 11, 30 ) : new Date( userData.query.usercontribs[ 0 ].timestamp ) );
        var lastLogEvent =// Date object for date of last log
          ( userData.query.logevents[ 0 ] === undefined
            ? new Date( 1999, 11, 30 ) : new Date( userData.query.logevents[ 0 ].timestamp ) );
        var lastEditAge =// Calculate age in months
          ( currDateInMonths - ( ( lastEdit.getFullYear() * 12 ) + lastEdit.getMonth() ) );
        var lastLogAge =// Calculate age in months
          ( currDateInMonths - ( ( lastLogEvent.getFullYear() * 12 ) + lastLogEvent.getMonth() ) );
        var lastAge = ( lastEditAge > lastLogAge ? lastLogAge : lastEditAge );
        promotionCandidates[ userName ].lastEdit = lastEdit;
        promotionCandidates[ userName ].lastLogEvent = lastLogEvent;
        promotionCandidates[ userName ].lastEditAge = lastEditAge;
        promotionCandidates[ userName ].lastLogAge = lastLogAge;
        promotionCandidates[ userName ].lastAge = lastAge;
        if ( lastAge <= 12 ) {
          $( '#' + userName.replace( / /g, '_' ) + '_ula' ).html( '<b style="color: #007700;">' + lastAge + '</b>' );
        } else if ( lastAge >= 24 ) {
          $( '#' + userName.replace( / /g, '_' ) + '_ula' ).html( '<i style="color: #770000; text-decoration: line-through;">' + lastAge + '</i>' );
        } else {
          $( '#' + userName.replace( / /g, '_' ) + '_ula' ).text( lastAge );
        }
      },
      fail: function( failureData ) {
        alert( 'Sorry, failed to retrieve information from API.\n'
          + 'Please check the console for more details if available.' );
        console.error( '%O', failureData );
      }
    } );
  }
  function userAgeEdits( userName, age, editCount ) {
    userName = ( typeof userName !== 'undefined' ? userName : 'Unknown user' );
    age = ( typeof age !== 'undefined' ? age : 1 );
    editCount = ( typeof editCount !== 'undefined' ? editCount : 0 );
    var lastEdit = 'Last: <span id="' + userName.replace( / /g, '_' ) +
      '_ula"><small><i>retrieving</i></small></span> months ago';
    var editsPerMonth = Math.floor( ( editCount / age ) * 100 ) / 100;
    return '<span class="age-edits"><small>(</small> <b>' + editCount + '</b>/<i>' + age +
      '</i> <small> ' + editsPerMonth + '<sub>/mo</sub></small> ' + lastEdit +
      '<small>)</small></span> ';
  }
  function userPageLink( userName ) {
    userName = ( typeof userName !== 'undefined' ? userName : 'Unknown user' );
    return '<a id="' + userName.replace( / /g, '_' ) + '_upl" class="userPageLink" href="./User:' +
      userName.replace( / /g, '_' ) + '" title="' + userName + '">' + userName + '</a>';
  }
  function userTalkLink( userName ) {
    userName = ( typeof userName !== 'undefined' ? userName : 'Unknown user' );
    return '<a id="' + userName.replace( / /g, '_' ) +
      '_utl" class="userTalkLink" href="./User_talk:' +
      userName.replace( / /g, '_' ) + '" title="' + userName + '">talk</a>';
  }
  function contribsLink( userName ) {
    userName = ( typeof userName !== 'undefined' ? userName : 'Unknown user' );
    return '<a id="' + userName.replace( / /g, '_' ) +
      '_utl" class="contribsLink" href="./Special:Contributions/' +
      userName.replace( / /g, '_' ) + '" title="' + userName + '">contributions</a>';
  }
  function userEmailLnk( userName ) {
    userName = ( typeof userName !== 'undefined' ? userName : 'Unknown user' );
    $.ajax( {//* REALLY DON'T LIKE THIS!!! *//*
      url: 'https://ddowiki.com/api.php?'
        + 'action=query'
        + '&format=json'
        + '&list=users'
        + '&usprop=emailable'
        + '&ususers=' + encodeURIComponent( userName ),
      dataType: 'json',
      success: function( userData ) {
        promotionCandidates[ userName ].isEmailable =
          ( userData.query.users[ 0 ].emailable !== undefined ? true : false );
        if ( !promotionCandidates[ userName ].isEmailable ) {
          $( '#' + userName.replace( / /g, '_' ) + '_uel' ).remove( );
        }
      },
      fail: function( failureData ) {
        alert( 'Sorry, failed to retrieve information from API.\n'
          + 'Please check the console for more details if available.' );
        console.error( '%O', failureData );
      }
    } );
    return '<span id="' + userName.replace( / /g, '_' ) +
      '_uel"> · <a class="userEmailLnk" href="./Special:EmailUser/' +
      userName.replace( / /g, '_' ) + '" title="send ' + userName + ' an email">email</a></span>';
  }
/*  function userPageEdit( userName = 'Unknown user', editCount = 0 ) {
    // Function to update [[T:UserEditAward]] on the user's page with current count
  }*/
/*  function userToVIP( userName = 'Unknown user', editCount = 0, isEmailable = false ) {
    // Function to add to ddowikivip group, update [[T:UserEditAward]] on the user's page,
    // leave a message on their talk page congratulating them, and send an email
  }*/
/*  function userToSU( userName = 'Unknown user', editCount = 0, isEmailable = false ) {
    // Function to add to superuser group, update [[T:UserEditAward]] on the user's page,
    // leave a message on their talk page congratulating them, and send an email
  }*/
  
  $.each( promotionCandidates, function( name ) {
    $( '#mw-semiautopromote-canididates' ).append( '<li>' +
      userAgeEdits( name, $( this )[ 0 ].age, $( this )[ 0 ].editcount) + ' ' +
      userPageLink( name ) + ' ( ' +
      userTalkLink( name ) +
      userEmailLnk( name ) + ' · ' +
      contribsLink( name ) +  ' )</li>' );
    userLastEdit( name );// Retrieve and update the last edit information
  } );
console.log( '%O', promotionCandidates );// Log final object
} )( mediaWiki, jQuery );
//</nowiki>