// PLAYER NAMES ////////////////////////////////////////////////////// // Player names are cached in sessionStorage. There is no GUI // element from within the total conversion to clean them, but you // can run sessionStorage.clean() to reset it. window.setupPlayerNameCache = function() { // IITC used to store player names in localStorage rather than sessionStorage. lets clear out any cached // names from session storage var matchPlayerGuid = new RegExp ('^[0-9a-f]{32}\\.c$'); $.each(Object.keys(localStorage), function(ind,key) { if ( matchPlayerGuid.test(key) ) { // copy from localStorage to sessionStorage if not already there if (!sessionStorage[key]) sessionStorage[key] = localStorage[key]; // then clear from localStorage localStorage.removeItem(key); } }); } // retrieves player name by GUID. If the name is not yet available, it // will be added to a global list of GUIDs that need to be resolved. // The resolve method is not called automatically. window.getPlayerName = function(guid) { if(sessionStorage[guid]) return sessionStorage[guid]; // only add to queue if it isn’t already if(playersToResolve.indexOf(guid) === -1 && playersInResolving.indexOf(guid) === -1) { playersToResolve.push(guid); } return '{'+guid.slice(0, 12)+'}'; } window._playerNameToGuidCache = {}; window.playerNameToGuid = function(playerName) { var cachedGuid = window._playerNameToGuidCache[playerName]; if (cachedGuid !== undefined) return cachedGuid; var guid = null; $.each(Object.keys(sessionStorage), function(ind,key) { if(playerName === sessionStorage[key]) { guid = key; return false; //break from $.each } }); window._playerNameToGuidCache[playerName] = guid; return guid; } // resolves all player GUIDs that have been added to the list. Reruns // renderPortalDetails when finished, so that then-unresolved names // get replaced by their correct versions. window.resolvePlayerNames = function() { if(window.playersToResolve.length === 0) return; //limit per request. stock site is never more than 13 (8 res, 4 mods, owner) //testing shows 15 works and 20 fails var MAX_RESOLVE_PLAYERS_PER_REQUEST = 15; var p = window.playersToResolve.slice(0,MAX_RESOLVE_PLAYERS_PER_REQUEST); window.playersToResolve = playersToResolve.slice(MAX_RESOLVE_PLAYERS_PER_REQUEST); var d = {guids: p}; window.playersInResolving = window.playersInResolving.concat(p); postAjax('getPlayersByGuids', d, function(dat) { if(dat.result) { $.each(dat.result, function(ind, player) { window.setPlayerName(player.guid, player.nickname); // remove from array window.playersInResolving.splice(window.playersInResolving.indexOf(player.guid), 1); }); } else { //no 'result' - a successful http request, but the returned result was an error of some kind console.warn('getplayers problem - no result in response: '+dat); //likely to be some kind of 'bad request' (e.g. too many names at once, or otherwise badly formatted data. //therefore, not a good idea to automatically retry by adding back to the playersToResolve list } //TODO: have an event triggered for this instead of hard-coded single function call if(window.selectedPortal) window.renderPortalDetails(window.selectedPortal); //if more to do, run again if(window.playersToResolve.length>0) resolvePlayerNames(); }, function() { // append failed resolves to the list again console.warn('resolving player guids failed: ' + p.join(', ')); window.playersToResolve.concat(p); }); } window.setPlayerName = function(guid, nick, uncertain) { // the 'uncertain' flag is set when we're scrolling back through chat. it's possible in this case // to come across a message from before a name change. these should be ignored if existing cache entries exist if(uncertain && guid in sessionStorage) return; if($.trim(('' + nick)).slice(0, 5) === '{"L":' && !window.alertFor37WasShown) { window.alertFor37WasShown = true; alert('You have run into bug #37. Please help me solve it!\nCopy and paste this text and post it here:\nhttps://github.com/breunigs/ingress-intel-total-conversion/issues/37\nIf copy & pasting doesn’t work, make a screenshot instead.\n\n\n' + window.debug.printStackTrace() + '\n\n\n' + JSON.stringify(nick)); } sessionStorage[guid] = nick; } window.loadPlayerNamesForPortal = function(portal_details) { if(map.getZoom() < PRECACHE_PLAYER_NAMES_ZOOM) return; var e = portal_details; if(e.captured && e.captured.capturingPlayerId) getPlayerName(e.captured.capturingPlayerId); if(!e.resonatorArray || !e.resonatorArray.resonators) return; $.each(e.resonatorArray.resonators, function(ind, reso) { if(reso) getPlayerName(reso.ownerGuid); }); } // test to see if a specific player GUID is a special system account (e.g. __JARVIS__, __ADA__) that shouldn't // be listed as a player window.isSystemPlayer = function(guid) { switch (guid) { case '00000000000000000000000000000001.c': case '00000000000000000000000000000002.c': return true; default: return false; } }