nameZee

Simple Tool to Help Name Undeployed Munzees Quicker

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name nameZee
// @namespace Rynee
// @author hugosoft
// @author technical13
// @version 1.3
// @include http://www.munzee.com/*
// @include https://www.munzee.com/*
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @description Simple Tool to Help Name Undeployed Munzees Quicker
// ==/UserScript==
//
//
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function go() {
  var isDebugMode = false;
  
  var version = '1.3';

  var baseURL = 'https://www.munzee.com';
  var virtualImg = 'virtual';
  
  var strParams, objParams;
  var currentURL = new String( document.URL );
  if ( currentURL.lastIndexOf( '?' ) !== -1 ) {
    objParams = {};
    strParams = currentURL.split( '#' )[ 0 ].substr( currentURL.lastIndexOf( '?' ) + 1 );
    var arrParams = strParams.split( '&' );
    for ( var param = 0; param < arrParams.length; param++ ) {
      var arrPair = arrParams[ param ].split( '=' );
      objParams[ arrPair[ 0 ] ] = ( arrPair[ 1 ] || true );
    }
    if ( objParams.debug ) {
      isDebugMode = true;
    }
    currentURL = currentURL.substr( 0, currentURL.lastIndexOf( '?' ) );
  }
  var username = null;
  var logonUsername = null;


  var ignoreChars = [ '#', '(', ')', '[', ']', '{', '}' ];

/**
 * is value numeric?
 */
  function isNumeric( val ){
    return !isNaN( val );
  }

  console.log( 'nameZee Version: ' + version );


  Number.decPoint = '.';
  Number.thousand_sep = ',';


/**
 * endsWith
 */
  String.prototype.endsWith = function( suffix ) {
    return this.indexOf( suffix, this.length - suffix.length ) !== -1;
  };

/**
 * startsWith
 * */
  String.prototype.startsWith = function( prefix ) {
    return this.substring( 0, prefix.length ) === prefix;
  }

/**
 * replaceAll
 */
  String.prototype.replaceAll = function ( find, replace ) {
    var str = this;
    return str.replace( new RegExp( find, 'g' ), replace );
  };

/**
 * contains
 * */
	String.prototype.contains = function() {
    return String.prototype.indexOf.apply( this, arguments ) !== -1;
  };


/**
 * extract logonUsername from profile link
 * */
  function getLogonUsername() {
    try {
      //search menu (ul)
      var container = $( $( '.user-menu' ) );
      //first li
      container = $( container.children().first() );
      //first a
      container = $( container.children().first() );
      //attribute href
      container = container.attr( 'href' );
      if ( isDebugMode ) { console.log( 'getLogonUsername() container is: %s', container ); }
      //token with username in href
      var res = container.split( '/' );
      if ( isDebugMode ) { console.log( 'getLogonUsername() res is: %o', res ); }
      var logonUsername = res[ res.length - 2 ];
      return logonUsername;
    } catch ( errLogonUN ) {
      alert( 'Error attempting to extract logon username from profile link.\n\n\tPlease check the console for details.' );
      console.log( errLogonUN );
    }
  }


  $( document ).ready( function() {
    //checkForUpdate();
    if ( !currentURL.endsWith( '/' ) ) {
      currentURL = currentURL + '/';
    }

    username = $( '.avatar-username' ).text();
    if (username==undefined || username.length<1) {
      username = null;
    }

    logonUsername = getLogonUsername();
    if ( logonUsername == undefined || logonUsername.length < 1 ) {
      logonUsername = null;
    }

    //rename undeploys
    if ( username != null && logonUsername == username && currentURL.toLowerCase().startsWith( baseURL + '/m/' + username.toLowerCase() + '/undeploys/' ) ) {
      //new action button
      var container = $( '.page-header' );
      container = $( container ).find( '.pull-right' );
      var buttonCode = '<div class="pull-right"><a id="renumberUndeploys" class="btn green" style="margin-left:10px;margin-right:10px">renumber</a></div>';
      var optionCode = '<div class="pull-right"><select id="selBracket" class="form-control"><option value="curlyBracket">{ }</option><option value="squareBracket">[ ]</option><option value="roundBracket">( )</option><option selected value="hash">#</option><option value="blank"> </option></select></div>';
      $( container ).append( optionCode + buttonCode );
      //button event
      $( '#renumberUndeploys' ).click( function() {
        doRenumber();
      } );
    }

    //rename deploys
    /*if ( username != null && logonUsername == username && currentURL.toLowerCase().startsWith( baseURL + '/m/' + username.toLowerCase() + '/deploys/' ) ) {
        //new action button
        var container = $( '.page-header' );
        container = $( container ).find( 'h2' );
        $( container ).append( ' <div class="pull-right"><a id="renumberDeploys" class="btn green" style="margin-left:10px">renumber</a></div><div class="clearfix"></div> ');
        //button event
        $( '#renumberDeploys' ).click( function() {
            doRenumber();
        } );
    }*/
  } );

/**
 * prefix for number
 * */
  function getPrefix() {
    switch ( $( '#selBracket' ).val() ) {
      case 'curlyBracket':
        return '{';
      case 'squareBracket':
        return '[';
      case 'roundBracket':
        return '(';
      case 'hash':
        return "#";
      case 'blank':
      default:
        return '';
    }
  }

/**
 * suffix for number
 * */
  function getSuffix() {
    switch ( $( '#selBracket' ).val() ) {
      case 'curlyBracket':
        return '}';
      case 'squareBracket':
        return ']';
      case 'roundBracket':
        return ')';
      case 'hash':
      case 'blank':
      default:
        return '';
    }
  }

/**
 * rename undeploys and deploys
 * */
  function doRenumber() {
    var sections = $( 'section' ).get();
    var count = 0;

    //inspect each section
    for ( var i = 0; i < sections.length; i++ ) {
      if ( isRenumber( getFriendlyName( sections[ i ] ), getLfdNr( sections[ i ] ) ) && !isVirtual( sections[ i ] ) ) {
        parseSectionTimeoutWrapper( count++, sections[ i ] );
      } else {
        if ( isDebugMode ) { console.log( 'doRenumber() IGNRORED::' + getFriendlyName( sections[ i ] ) + ' virtual=' + isVirtual( sections[ i ] ) ); }
      }
    }
  }

/** just a wrapper for parseSection with timeout*/
  function parseSectionTimeoutWrapper( i, section ) {
    setTimeout( function() {
      parseSection( i, section );
    }, 1500 * i );
  }

/**
 * parseSection of munzees and call post-method for renumbering
 */
	function parseSection( i, section ) {
		var lfdNr = getLfdNr( section );
    var originalFriendlyName = getFriendlyName( section );
    if( isRenumber( originalFriendlyName, getLfdNr( section ) ) && !isVirtual( section ) ) {
      var adminURL = 'https://www.munzee.com/m/' + username + '/' + lfdNr + '/admin/';
      var oldFriendlyName = removeGeneratedNumber( originalFriendlyName );
      var newFriendlyName = oldFriendlyName +  " " + getPrefix() + lfdNr + getSuffix();
      if ( isDebugMode ) {
        console.log( 'parseSection() section: %o', section );
        console.log( 'parseSection(): ' + adminURL + ':: ' + originalFriendlyName + '->' + newFriendlyName );
      }
      $.post( adminURL, { friendly_name: '' + newFriendlyName, notes: '' }, function( result ) {        
        if ( isDebugMode ) {
          if ( result.match( /This munzee has been updated!/ ) !== -1 ) {
            section.getElementsByClassName( 'munzee-name' )[ 0 ].children[ 1 ].innerText = newFriendlyName;
          }
        }
      } );
    }
	}

/**
 * remove the generated Number of friendly name
 */
  function removeGeneratedNumber( friendlyName ) {
    while ( friendlyName.length > 0 && isNumeric( friendlyName[ friendlyName.length - 1 ] )) {
      friendlyName = friendlyName.substr( 0, friendlyName.length - 1 );
      if ( isDebugMode ) { console.log( 'removeGeneratedNumber() is returning: ' + friendlyName ); }
    }
    return friendlyName;
  }

/** get lfdNr of current section*/
	function getLfdNr( section ) {
		var munzeeURL = baseURL + $( section ).find( 'a' ).attr( 'href' );
		var arr = munzeeURL.split( '/' );
    if ( isDebugMode ) { console.log( 'getLfdNr() is returning: ' + arr[ 5 ] ); }
		return arr[ 5 ];
	}

/** get friendlyName of current section*/
  function getFriendlyName( section ) {
    var friendlyName = $( section ).find( 'a' )[ 1 ];
    if ( isDebugMode ) { console.log( 'getFriendlyName() is returning: ' + $( friendlyName ).text() ); }
    return $( friendlyName ).text();
  }

/** renumbering permitted? */
  function isRenumber( friendlyName, munzeeNumber ) {
  friendlyName = friendlyName.trim();
  //for ( var i = 0; i < ignoreChars.length; i++ ) {
    if ( friendlyName.contains( munzeeNumber ) ) {
      return false;
    }
  //}
    return true;
  }

  function isVirtual( section ) {
    var imgageSrc = $( section ).find( '.pin' ).attr( 'src' );
    if ( isDebugMode ) { console.log( 'getFriendlyName() is returning: ' + imgageSrc.contains( virtualImg ) ); }
    return imgageSrc.contains( virtualImg );
  }
} // end go

// jQuery workaround for Chrome
// a function that loads jQuery and calls a callback function when jQuery has finished loading
function addJQuery( callback ) {
  var script = document.createElement( 'script' );
  script.textContent = '(' + callback.toString() + ')();';
  document.body.appendChild( script );
}
// load jQuery and execute
addJQuery( go );