diff --git a/code/hooks.js b/code/hooks.js index 2fd824775..9cdd428d9 100644 --- a/code/hooks.js +++ b/code/hooks.js @@ -18,6 +18,7 @@ // portalSelected: called when portal on map is selected/unselected. // Provide guid of selected and unselected portal. // mapDataRefreshStart: called when we start refreshing map data +// mapDataEntityInject: called just as we start to render data. has callback to inject cached entities into the map render // mapDataRefreshEnd: called when we complete the map data load // portalAdded: called when a portal has been received and is about to // be added to its layer group. Note that this does NOT @@ -55,7 +56,7 @@ window._hooks = {} window.VALID_HOOKS = [ 'portalSelected', 'portalDetailsUpdated', - 'mapDataRefreshStart', 'mapDataRefreshEnd', + 'mapDataRefreshStart', 'mapDataEntityInject', 'mapDataRefreshEnd', 'portalAdded', 'linkAdded', 'fieldAdded', 'publicChatDataAvailable', 'factionChatDataAvailable', 'requestFinished', 'nicknameClicked', diff --git a/code/map_data_request.js b/code/map_data_request.js index 29b445328..514eabd84 100644 --- a/code/map_data_request.js +++ b/code/map_data_request.js @@ -239,6 +239,9 @@ window.MapDataRequest.prototype.refresh = function() { this.render.startRenderPass(tileParams.level, dataBounds); + var _render = this.render; + window.runHooks ('mapDataEntityInject', {callback: function(ents) { _render.processGameEntities(ents);}}); + this.render.processGameEntities(artifact.getArtifactEntities()); diff --git a/code/portal_detail_display.js b/code/portal_detail_display.js index 7d1851bce..f863d7cad 100644 --- a/code/portal_detail_display.js +++ b/code/portal_detail_display.js @@ -41,46 +41,13 @@ window.renderPortalDetails = function(guid) { var img = fixPortalImageUrl(details ? details.image : data.image); - var title = data.title; + var title = (details && details.title) || (data && data.title) || '(untitled)'; var lat = data.latE6/1E6; var lng = data.lngE6/1E6; - var imgTitle = details ? getPortalDescriptionFromDetails(details) : data.title; - imgTitle += '\n\nClick to show full image.'; - var portalDetailObj = details ? window.getPortalDescriptionFromDetailsExtended(details) : undefined; + var imgTitle = title+'\n\nClick to show full image.'; - var portalDetailedDescription = ''; - - if(portalDetailObj) { - portalDetailedDescription = ''; - - // TODO (once the data supports it) - portals can have multiple photos. display all, with navigation between them - // (at this time the data isn't returned from the server - although a count of images IS returned!) - - if(portalDetailObj.submitter.name.length > 0) { - if(portalDetailObj.submitter.team) { - submitterSpan = ''; - } else { - submitterSpan = ''; - } - portalDetailedDescription += ''; - } - if(portalDetailObj.submitter.link.length > 0) { - portalDetailedDescription += ''; - } - - if(portalDetailObj.description) { - portalDetailedDescription += ''; - } -// if(d.descriptiveText.map.ADDRESS) { -// portalDetailedDescription += ''; -// } - - portalDetailedDescription += '
Photo by:' + submitterSpan - + escapeHtmlSpecialChars(portalDetailObj.submitter.name) + ''+(portalDetailObj.submitter.voteCount !== undefined ? ' (' + portalDetailObj.submitter.voteCount + ' votes)' : '')+'
Photo from:' + escapeHtmlSpecialChars(portalDetailObj.submitter.link) + '
Description:' + escapeHtmlSpecialChars(portalDetailObj.description) + '
Address:' + escapeHtmlSpecialChars(d.descriptiveText.map.ADDRESS) + '
'; - } // portal level. start with basic data - then extend with fractional info in tooltip if available var levelInt = (teamStringToId(data.team) == TEAM_NONE) ? 0 : data.level; @@ -127,7 +94,7 @@ window.renderPortalDetails = function(guid) { .html('') //to ensure it's clear .attr('class', TEAM_TO_CSS[teamStringToId(data.team)]) .append( - $('

').attr({class:'title'}).text(data.title), + $('

').attr({class:'title'}).text(title), $('').attr({ class: 'close', @@ -141,7 +108,6 @@ window.renderPortalDetails = function(guid) { .attr({class:'imgpreview', title:imgTitle, style:"background-image: url('"+img+"')"}) .append( $('').attr({id:'level', title: levelDetails}).text(levelInt), - $('
').attr({class:'portalDetails'}).html(portalDetailedDescription), $('').attr({class:'hide', src:img}) ), diff --git a/code/portal_detail_display_tools.js b/code/portal_detail_display_tools.js index 10daac5a4..3df146c82 100644 --- a/code/portal_detail_display_tools.js +++ b/code/portal_detail_display_tools.js @@ -23,59 +23,6 @@ window.getRangeText = function(d) { title]; } -// generates description text from details for portal -window.getPortalDescriptionFromDetails = function(details) { - return details.title || '(untitled)'; - -// var descObj = details.descriptiveText.map; -// // FIXME: also get real description? -// var desc = descObj.TITLE; -// if(descObj.ADDRESS) -// desc += '\n' + descObj.ADDRESS; -//// if(descObj.ATTRIBUTION) -//// desc += '\nby '+descObj.ATTRIBUTION+' ('+descObj.ATTRIBUTION_LINK+')'; -// return desc; -} - -// Grabs more info, including the submitter name for the current main -// portal image -window.getPortalDescriptionFromDetailsExtended = function(details) { - var descObj = details.title; - var photoStreamObj = details.photoStreamInfo; - - var submitterObj = new Object(); - submitterObj.type = ""; - submitterObj.name = ""; - submitterObj.team = ""; - submitterObj.link = ""; - submitterObj.voteCount = undefined; - - if(photoStreamObj && photoStreamObj.hasOwnProperty("coverPhoto") && photoStreamObj.coverPhoto.hasOwnProperty("attributionMarkup")) { - submitterObj.name = "Unknown"; - - var attribution = photoStreamObj.coverPhoto.attributionMarkup; - submitterObj.type = attribution[0]; - if(attribution[1].hasOwnProperty("plain")) - submitterObj.name = attribution[1].plain; - if(attribution[1].hasOwnProperty("team")) - submitterObj.team = attribution[1].team; - if(attribution[1].hasOwnProperty("attributionLink")) - submitterObj.link = attribution[1].attributionLink; - if(photoStreamObj.coverPhoto.hasOwnProperty("voteCount")) - submitterObj.voteCount = photoStreamObj.coverPhoto.voteCount; - } - - - var portalDetails = { - title: descObj.TITLE, - description: descObj.DESCRIPTION, - address: descObj.ADDRESS, - submitter: submitterObj - }; - - return portalDetails; -} - // given portal details, returns html code to display mod details. window.getModDetails = function(d) { diff --git a/plugins/cache-details-on-map.user.js b/plugins/cache-details-on-map.user.js new file mode 100644 index 000000000..63a831112 --- /dev/null +++ b/plugins/cache-details-on-map.user.js @@ -0,0 +1,62 @@ +// ==UserScript== +// @id iitc-plugin-cache-details-on-map@jonatkins +// @name IITC plugin: Cache viewed portal details and always show them on the map +// @category Cache +// @version 0.1.0.@@DATETIMEVERSION@@ +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL @@UPDATEURL@@ +// @downloadURL @@DOWNLOADURL@@ +// @description [@@BUILDNAME@@-@@BUILDDATE@@] Cache the details of recently viewed portals and use this to populate the map when possible +// @include https://www.ingress.com/intel* +// @include http://www.ingress.com/intel* +// @match https://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// @include https://www.ingress.com/mission/* +// @include http://www.ingress.com/mission/* +// @match https://www.ingress.com/mission/* +// @match http://www.ingress.com/mission/* +// @grant none +// ==/UserScript== + +@@PLUGINSTART@@ + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.cachePortalDetailsOnMap = function() {}; + +window.plugin.cachePortalDetailsOnMap.MAX_AGE = 12*60*60; //12 hours max age for cached data + +window.plugin.cachePortalDetailsOnMap.portalDetailLoaded = function(data) { + window.plugin.cachePortalDetailsOnMap.cache[data.guid] = { loadtime: Date.now(), ent: data.ent }; +}; + +window.plugin.cachePortalDetailsOnMap.entityInject = function(data) { + var maxAge = Date.now() - window.plugin.cachePortalDetailsOnMap.MAX_AGE*1000; + + var ents = []; + for (var guid in window.plugin.cachePortalDetailsOnMap.cache) { + if (window.plugin.cachePortalDetailsOnMap.cache[guid].loadtime < maxAge) { + window.plugin.cachePortalDetailsOnMap.cache.delete(guid); + } else { + ents.push(window.plugin.cachePortalDetailsOnMap.cache[guid].ent); + } + } + data.callback(ents); +}; + + +window.plugin.cachePortalDetailsOnMap.setup = function() { + + window.plugin.cachePortalDetailsOnMap.cache = {}; + + addHook('portalDetailLoaded', window.plugin.cachePortalDetailsOnMap.portalDetailLoaded); + addHook('mapDataEntityInject', window.plugin.cachePortalDetailsOnMap.entityInject); +}; + +var setup = window.plugin.cachePortalDetailsOnMap.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + +@@PLUGINEND@@