_ _    _ _____  ___   __                       
 __      _(_) | _(_)___ / ( _ ) / /_   ___ ___  _ __ ___  
 \ \ /\ / / | |/ / | |_ \ / _ \| '_ \ / __/ _ \| '_ ` _ \ 
  \ V  V /| |   <| |___) | (_) | (_) | (_| (_) | | | | | |
   \_/\_/ |_|_|\_\_|____/ \___/ \___(_)___\___/|_| |_| |_|

User:DaxServer/Mark-locked.js

Today, we delve into the exciting world of User:DaxServer/Mark-locked.js, exploring all the fascinating aspects that surround it. From its origin to its impact on today's society, we will immerse ourselves in a journey of discovery and knowledge, analyzing every detail and unraveling the mysteries that surround it. User:DaxServer/Mark-locked.js has been the subject of interest and debate throughout history, and through this article, we aim to shed light on all the facets that make it so intriguing. Prepare for an in-depth exploration that will leave you with a renewed and enriching vision of User:DaxServer/Mark-locked.js.
//<nowiki>

/**
 * Largely based on https://en.wikipedia.orghttps://wiki386.com/en/MediaWiki:Gadget-markblocked.js
 * Refer to that page's history for attribution
 */

$.when(
  $.ready
).then(function () {
  let userLinks = {}

  // Callback: receive data and mark links
  function markLinks( user, locked ) {
    if (!locked) {
      return
    }

    let links = userLinks;
    for (let k = 0; links && k < links.length; k++ ) {
      $( links ).addClass( 'user-blocked-indef user-locked' );
    }
  }

  function markBlocked( container ) {
    const ipRegex = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
    const ipv6Regex = /^((?=.*::)(?!.*::.+::)(::)?({1,4}:(:|\b)|){5}|({1,4}:){6})((({1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2|1\d|)?\d|25)\.?\b){4})$/i;

    // Collect all the links in the page's content
    const contentLinks = $(container).find('a');

    // Get all aliases for user: & user_talk:
    let userNS = ;
    for (const ns in mw.config.get( 'wgNamespaceIds' ) ) {
      if ( mw.config.get( 'wgNamespaceIds' ) == 2 || mw.config.get( 'wgNamespaceIds' ) == 3 ) {
        userNS.push( mw.util.escapeRegExp(ns.replace( /_/g, ' ' )) + ':' );
      }
    }

    // Let wikis that are importing this gadget specify the local alias of Special:Contributions
    if ( window.markblocked_contributions === undefined ) {
      window.markblocked_contributions = 'Special:Contributions';
    }

    // RegExp for all titles that are  User:| User_talk: | Special:Contributions/ (for userscripts)
    const userTitleRX = new RegExp('^(' + userNS.join('|') + '|' + window.markblocked_contributions + '\\/)+(+)$', 'i');

    // RegExp for links
    // articleRX also matches external links in order to support the noping template
    const articleRX = new RegExp(mw.config.get('wgArticlePath').replace('$1', '') + '(+)');
    const scriptRX = new RegExp('^' + mw.config.get('wgScript') + '\\?title=(+)');

    let user, url, ma, pgTitle;

    // Find all "user" links and save them in userLinks : { 'users': , 'user2': , ... }
    contentLinks.each( function( i, lnk ) {

      if ( $( lnk ).hasClass("mw-changeslist-date")
        || $( lnk ).parent("span").hasClass("mw-history-undo")
        || $( lnk ).parent("span").hasClass("mw-rollback-link")
      ) {
        return;
      }

      url = $( lnk ).attr( 'href' );

      if ( !url ) {
        return;
      }

      if ( ma = articleRX.exec( url ) ) {
        pgTitle = ma;
      } else if ( ma = scriptRX.exec( url ) ) {
        pgTitle = ma;
      } else {
        return;
      }

      pgTitle = decodeURIComponent( pgTitle ).replace( /_/g, ' ' );
      user = userTitleRX.exec( pgTitle );

      if ( !user ) {
        return;
      }

      user = user;

      if ( ipv6Regex.test(user) || ipRegex.test(user) ) {
        return;
      }

      $( lnk ).addClass( 'userlink' );

      if ( ! userLinks ) {
        userLinks = ;
      }

      userLinks.push( lnk );
    } );

    // Convert users into array
    let users = ;
    for (const u in userLinks ) {
      users.push( u );
    }

    // API request

    while ( users.length > 0 ) {

      let user = users.pop()
//      let storageKey = `ds-locked-user ${user}`
//      let item = localStorage.getItem(storageKey)

//      if (item) {
//        let itemJSON = JSON.parse(item)

        // Valid
//        if (itemJSON.expiry > Date.now()) {
//          markLinks(user, itemJSON.locked)

//          continue
//        }
//      }

      $.get(
        mw.util.wikiScript( 'api' ),
        {
          format: 'json',
          formatversion: 2,
          action: 'query',
          meta: 'globaluserinfo',
          guiuser: user
        },
        (response) => {
          let locked = 'locked' in response.query.globaluserinfo

//          localStorage.setItem(storageKey, JSON.stringify({
//            locked,
//            expiry: Date.now() + ((locked ? 3 : 1) * 24 * 60 * 60 * 1000) // 3 days for locked, 1 day for non-locked
//          }))

          markLinks(user, locked)
        }
      );
    }
  }// -- end of main function

  // Start on some pages
  switch ( mw.config.get( 'wgAction' ) ) {
    case 'edit':
    case 'submit':
      return
  }

  $.when( mw.loader.using( 'mediawiki.util' ) ).then( function () {
    mw.util.addCSS('a.external.user-locked:after, a.mw-userlink.user-locked:after {content: ""; display: inline-block; background: url("//upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Symbol_oppose_vote.svg/16px-Symbol_oppose_vote.svg.png") no-repeat right; width: 16px; height: 16px;}');

    mw.hook( 'wikipage.content' ).add( function ( container ) {
      // On the first call after initial page load, container is mw.util.$content

      // Used to limit mainspace activity to just the diff definitions
      if ( mw.config.get( 'wgAction' ) === 'view' && mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
        container = container.find( '.diff-title' );
      }

      markBlocked( container );
    } );
  } );
})

//</nowiki>