// ==UserScript==
// @name TempZee
// @namespace none
// @version 2019.12.19.1223
// @description Give a warning when you have undeployed temporary virtual Munzees, so they don't expire before deployed
// @supportURL https://discord.me/TheShoeStore
// @author technical13
// @match https://www.munzee.com/*
// @exclude https://www.munzee.com/print/
// @grant none
// ==/UserScript==
// jshint esversion: 6
const ver = '2019.12.19.1223';
var isDebug = false;
var intVerbosity = 0;
const scriptName = 'TempZee v' + ver;
function toBoolean( val ) {
const arrTrue = [ undefined, null, '', true, 'true', 1, '1', 'on', 'yes' ];
val = ( typeof( val ) === 'string' ? val.toLowerCase() : val );
log( 4, 'log', 'toBoolean() is returning: %o', ( arrTrue.indexOf( val ) !== -1 ? true : false ) );
return ( arrTrue.indexOf( val ) !== -1 ? true : false );
}
function log( intV, strConsole, strLog, ...arrArgs ) {
if ( strConsole === undefined ) { strConsole = 'log'; }
if ( strLog === undefined ) { strLog = '%o'; }
if ( intVerbosity >= intV && ( strConsole === 'groupEnd' ) ) { console[ strConsole ](); }
if ( intV === 0 || ( isDebug && intVerbosity >= intV ) ) { console[ strConsole ]( '[%i]: %s: ' + strLog, intV, scriptName, ...arrArgs ); }
}
var address = document.URL.replace( /https?:\/\/www\.munzee\.com\/?/i, '' ).split( '/' );
var isUserPage = false;
if ( address[ 0 ] === 'm' ) {
isUserPage = true;
address = address.slice( 1 );
}
const pageUserName = ( address[ 0 ] || undefined );
const subPage = ( address[ 1 ] || undefined );
const subSubPage = ( address[ 2 ] || undefined );
log( 0, 'info', 'pageUserName = %s\tsubPage = %s\tsubSubPage = %s', pageUserName, subPage, subSubPage );
const intParamsStart = ( document.URL.indexOf( '?' ) + 1 );
const strParams = document.URL.substr( intParamsStart );
const arrParamSets = strParams.split( '&' );
var objParams = { unknownParams: [] };
arrParamSets.forEach( function( strParam ) {
let arrParam = strParam.split( '=' );
let strParamName = ( arrParam[ 0 ].toLowerCase() || '' );
if ( strParamName === 'verbosity' ) {
isDebug = true;
intVerbosity = ( arrParam[ 1 ] ? ( parseInt( arrParam[ 1 ] ) < 0 ? 0 : ( parseInt( arrParam[ 1 ] ) > 9 ? 9 : parseInt( arrParam[ 1 ] ) ) ) : 9 );
} else if ( strParamName === 'debug' ) {
isDebug = toBoolean( arrParam[ 1 ] );
intVerbosity = 1;
} else if ( strParamName === 'report' ) {
objParams.report = decodeURIComponent( arrParam[ 1 ] );
}
} );
log( 1, 'warn', 'Debug mode is on with verbosity level: %o', intVerbosity );
log( 1, 'groupCollapsed', 'Verbosity options: (click to expand)' );
log( 1, 'log', '1) Summary\n2) Parameters retrieved from URL\n3) Variables set to objParams\n4) Function returns\n9) ALL debugging info and this notice.' );
log( 1, 'groupEnd' );
const bypassCORsURL = 'https://cors-anywhere.herokuapp.com/';
function createLoader( intTemporaries ) {
$( 'head' ).append( '<style type="text/css">' +
'@keyframes animate {' +
' 0% { box-shadow: 0 0 0 0 rgba( 109, 255, 74, .7 ), 0 0 0 0 rgba( 255, 109, 74, .7 ); }' +
' 40% { box-shadow: 0 0 0 0 rgba( 109, 255, 74, .7 ), 0 0 0 25px rgba( 255, 109, 74, 0 ); }' +
' 80% { box-shadow: 0 0 0 30px rgba( 109, 255, 74, 0 ), 0 0 0 25px rgba( 255, 109, 74, 0 ); }' +
' 100% { box-shadow: 0 0 0 30px rgba( 109, 255, 74, 0 ), 0 0 0 0 rgba( 255, 109, 74, 0 ); }' +
'}' +
'div#loader {' +// 'border: 1px solid #00F;' +
' margin: 1em auto;' +
' width: 50px;' +
' height: 50px;' +
' background-color: transparent;' +
'}' +
'div#pulse {' +// 'border: 1px solid #0F0;' +
' width: 50px;' +
' height: 50px;' +
' background-color: transparent;' +// ' background-color: #FF0000;' +
//' border-radius: 50%' +
' text-align: center;' +
' line-height: 25px;' +
' animation: animate 2s linear infinite;' +
'}' +
'</style>' );
var objLoading = document.createElement( 'div' );
objLoading.setAttribute( 'id', 'loader' );
var objPulse = document.createElement( 'div' );
objPulse.setAttribute( 'id', 'pulse' );
var objImage = document.createElement( 'img' );
objImage.setAttribute( 'src', 'http://munzee.global.ssl.fastly.net/images/pins/eventindicator.png' );
objImage.setAttribute( 'style', 'width: 50px; height: 50px;' );
objPulse.append( objImage );
objLoading.append( objPulse );
$( 'ul.pager:last()' ).after( objLoading );
}
( function() {
'use strict';
log( 0, 'info', 'Script loaded.' );
var username = '',
isPremium = false,
isLoggedIn = false;
try { isLoggedIn = ( user_id ? true : false ); } catch ( isNotLoggedIn ) { isLoggedIn = false; }
try {
if ( pageUserName === 'flows' && objParams.report ) {
$( 'textarea#message' ).val( objParams.report );
} else if ( isLoggedIn ) {
username = $( 'li.user > ul.user-menu > li > a' )[ 0 ].href.split( '/' )[ 4 ];
isPremium = ( $( 'div.premium' )[0].outerText === 'Become Premium' ? false : true );
if ( isPremium ) {
var undeployedTemporariesURL = 'https://www.munzee.com/m/' + username + '/undeploys/0/type/1245';
$.ajax( { url: undeployedTemporariesURL, success: function( data ) {
var intTemporaries = $( data ).find( '#munzee-holder' ).children().length;console.log('createLoader( %i );',intTemporaries);createLoader( intTemporaries );
if ( intTemporaries > 0 && document.URL !== undeployedTemporariesURL ) {
$( 'div.navbar-fixed-top' ).after( '<div id="tempNotice" class="alert alert-warning" style="position: ' +
( navigator.vendor.startsWith( 'Apple' ) ? '-webkit-sticky' : 'sticky' ) +
'; top: 68px; left: 7.5%; width: 85%; z-index: 49; text-align: center;" role="alert">' +
'<div style="float: right; cursor: url(\'http://icons.iconarchive.com/icons/custom-icon-design/mono-general-4/32/trash-icon.png\'), auto;" onclick="document.getElementById(\'tempNotice\').style.display=\'none\'">✖</div>' +
'I found ' + intTemporaries + ' undeployed temporary virtuals! <wbr>' +
'<a href="' + undeployedTemporariesURL + '" target="_blank">' +
'Open your undeployed temporary virtual list in a new tab.</a></div>' );
}
else if ( intTemporaries > 0 && document.URL === undeployedTemporariesURL ) {
console.log('createLoader( %i );',intTemporaries);createLoader( intTemporaries );
var arrCurrEvents = [];
var objCurrEvents = {};
$.ajax( { url: bypassCORsURL + 'https://calendar.munzee.com/', success: function( events ) {
var domHTML = $( events )[ 42 ].innerHTML;
var intStart = ( domHTML.indexOf( 'events: ' ) + 8 );
var objFullCal = domHTML.substr( intStart, ( domHTML.indexOf( 'eventRender:' ) - intStart ) )
.replace( /,\s+\],\s+$/, ']' ).replace( /([\n\r\t]|\s{2,})/g, '' ).replace( /''/g, '""' )
.replace( /([^\\])'/g, '$1"' ).replace( /\\'/g, "'" ).replace( /id:/, '"id":' )
.replace( /([,\{] ?)(id|title|start|end|url|className|location|time|attendants):/g, '$1"$2":' );
var objEvents = JSON.parse( objFullCal );
arrCurrEvents = objEvents.filter( event => {
let intStartIn = ( new Date( event.start ) ).valueOf() - Date.now();
let intEndIn = ( new Date( event.end ) ).valueOf() - Date.now();
if ( intStartIn >= 0 && intStartIn <= 2592000000 ) { return event; }
} );
arrCurrEvents = arrCurrEvents.sort( ( a, b ) => { return ( ( parseInt( a.attendants ) < parseInt( b.attendants ) ) ? 1 : -1 ); } );
var strCurrEventTable = '<table class="table" style="text-align: center;"><tr><th style="min-width: 125px; text-align: center;">Date</th><th style="text-align: center;">Title</th><th style="text-align: center;">Location</th><th style="text-align: center;">Attendants</th></tr>';
arrCurrEvents.forEach( event => {
let id = parseInt( event.id );
let start = ( new Date( event.start ) );
let end = ( new Date( event.end ) );
let attendants = parseInt( event.attendants );
let eventURL = 'https://calendar.munzee.com' + event.url;
objCurrEvents[ id ] = { id: id, start: start, time: event.time, end: end, title: event.title, location: event.location, url: eventURL, className: event.className, attendants: attendants };
strCurrEventTable += '<tr>' +
'<td>' + start.toLocaleDateString( 'en-US', { year: 'numeric', month: 'short', day: 'numeric' } ) + '</td>' +
'<td><a href="' + eventURL + '" title="Calendar event listing">' + event.title + '</a></td>' +
'<td id="location' + event.id + '">' + event.location + '</td>' +
'<td>' + attendants + '</td>' +
'</tr>';
} );
strCurrEventTable += '</table>';
$( 'div#loader' ).replaceWith( strCurrEventTable ).change();
} } ).then( () => {
arrCurrEvents.forEach( event => {
let objEvent = objCurrEvents[ event.id ];
$.ajax( { url: bypassCORsURL + objEvent.url, success: function( eventPage ) {
let intStartEventIndicator = $( eventPage )[ 42 ].innerHTML.indexOf( 'https://www.munzee.com/m/EventIndicator/' );
if ( intStartEventIndicator >= 0 ) {
intStartEventIndicator += 40;
let intEndEventIndicator = $( eventPage )[ 42 ].innerHTML.indexOf( '/', intStartEventIndicator );
let strEventIndicatorURL = 'https://www.munzee.com/m/EventIndicator/' + $( eventPage )[ 42 ].innerHTML.substring( intStartEventIndicator, intEndEventIndicator ) + '/';
$( '#location' + objEvent.id ).html( '<a href="' + strEventIndicatorURL + '" title="' + strEventIndicatorURL + '">' + objEvent.location + '</a>' );
objEvent.eventIndicatorURL = strEventIndicatorURL;
} else {
$( '#location' + objEvent.id ).html( '<span title="No event indicator pin is available yet.">' + objEvent.location + '</span>' );
objEvent.eventIndicatorURL = undefined;
}
} } );
} )
} ).then( () => {
console.log( 'objCurrEvents: %o', objCurrEvents );
} ).fail( errGetEvents => {
var divFailed = document.createElement( 'div' );
divFailed.classList.add( ...[ 'alert', 'alert-danger' ] );
divFailed.append( document.createTextNode( 'Error attempting to get event listing.' ) );
$( 'div#loader' ).replaceWith( divFailed );
console.error( 'Failed to get event listing: %o', errGetEvents );
} );//*/
/* window.setTimeout( () => {
var divFailed = document.createElement( 'div' );
divFailed.classList.add( ...[ 'alert', 'alert-danger' ] );
divFailed.append( document.createTextNode( 'Error attempting to get event listing.' ) );
$( 'div.loader' ).replaceWith( divFailed );
}, 5000 );//*/
}
} } );
}
}
} catch ( errScript ) {
log( 0, 'error', 'Encountered an error: %o', errScript );
var notifyAuthor = confirm( scriptName + '\n\tERROR!\t\t(details in console)\n\tPlease press [Cancel] and update the script\n\t\tbefore pressing [OK] to notify the author\n\t\tas there may already be a fix!\n\n\t\t\t\tThanks!' );
if ( notifyAuthor ) {
window.location.href = 'https://www.munzee.com/flows/?username=technical13&report=' + encodeURIComponent( scriptName + ': ' + window.location.href + '\n' + errScript );
}
}
} )();