// ==UserScript== // @id iitc-plugin-portals-list@teo96 // @name IITC plugin: show list of portals // @category Info // @version 0.2.1.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ // @description [@@BUILDNAME@@-@@BUILDDATE@@] Display a sortable list of all visible portals with full details about the team, resonators, links, etc. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* // @match http://*.ingress.com/intel* // @include https://*.ingress.com/mission/* // @include http://*.ingress.com/mission/* // @match https://*.ingress.com/mission/* // @match http://*.ingress.com/mission/* // @grant none // ==/UserScript== @@PLUGINSTART@@ // PLUGIN START //////////////////////////////////////////////////////// // use own namespace for plugin window.plugin.portalslist = function() {}; window.plugin.portalslist.listPortals = []; window.plugin.portalslist.sortBy = 1; // second column: level window.plugin.portalslist.sortOrder = -1; window.plugin.portalslist.enlP = 0; window.plugin.portalslist.resP = 0; window.plugin.portalslist.neuP = 0; window.plugin.portalslist.filter = 0; /* * plugins may add fields by appending their specifiation to the following list. The following members are supported: * title: String * Name of the column. Required. * value: function(portal) * The raw value of this field. Can by anything. Required, but can be dummy implementation if sortValue and format * are implemented. * sortValue: function(value, portal) * The value to sort by. Optional, uses value if omitted. The raw value is passed as first argument. * sort: function(valueA, valueB, portalA, portalB) * Custom sorting function. See Array.sort() for details on return value. Both the raw values and the portal objects * are passed as arguments. Optional. Set to null to disable sorting * format: function(cell, portal, value) * Used to fill and format the cell, which is given as a DOM node. If omitted, the raw value is put in the cell. * defaultOrder: -1|1 * Which order should by default be used for this column. -1 means descending. Default: 1 */ window.plugin.portalslist.fields = [ { title: "Portal Name", value: function(portal) { return portal.options.data.title; }, sortValue: function(value, portal) { return value.toLowerCase(); }, format: function(cell, portal, value) { $(cell) .append(plugin.portalslist.getPortalLink(portal)) .addClass("portalTitle"); } }, { title: "Level", value: function(portal) { return portal.options.data.level; }, format: function(cell, portal, value) { $(cell) .css('background-color', COLORS_LVL[value]) .text('L' + value); }, defaultOrder: -1, }, { title: "Team", value: function(portal) { return portal.options.team; }, format: function(cell, portal, value) { $(cell).text(['NEU', 'RES', 'ENL'][value]); } }, { title: "Health", value: function(portal) { return portal.options.data.health; }, sortValue: function(value, portal) { return portal.options.team===TEAM_NONE ? -1 : value; }, format: function(cell, portal, value) { $(cell) .addClass("alignR") .text(portal.options.team===TEAM_NONE ? '-' : value+'%'); }, defaultOrder: -1, }, { title: "Res", value: function(portal) { return portal.options.data.resCount; }, format: function(cell, portal, value) { $(cell) .addClass("alignR") .text(value); }, defaultOrder: -1, }, { title: "Links", value: function(portal) { return window.getPortalLinks(portal.options.guid); }, sortValue: function(value, portal) { return value.in.length + value.out.length; }, format: function(cell, portal, value) { $(cell) .addClass("alignR") .addClass('help') .attr('title', 'In:\t' + value.in.length + '\nOut:\t' + value.out.length) .text(value.in.length+value.out.length); }, defaultOrder: -1, }, { title: "Fields", value: function(portal) { return getPortalFieldsCount(portal.options.guid) }, format: function(cell, portal, value) { $(cell) .addClass("alignR") .text(value); }, defaultOrder: -1, }, { title: "AP", value: function(portal) { var links = window.getPortalLinks(portal.options.guid); var fields = getPortalFieldsCount(portal.options.guid); return portalApGainMaths(portal.options.data.resCount, links.in.length+links.out.length, fields); }, sortValue: function(value, portal) { return value.enemyAp; }, format: function(cell, portal, value) { var title = ''; if (teamStringToId(PLAYER.team) == portal.options.team) { title += 'Friendly AP:\t'+value.friendlyAp+'\n' + '- deploy '+(8-portal.options.data.resCount)+' resonator(s)\n' + '- upgrades/mods unknown\n'; } title += 'Enemy AP:\t'+value.enemyAp+'\n' + '- Destroy AP:\t'+value.destroyAp+'\n' + '- Capture AP:\t'+value.captureAp; $(cell) .addClass("alignR") .addClass('help') .prop('title', title) .html(digits(value.enemyAp)); }, defaultOrder: -1, }, ]; //fill the listPortals array with portals avaliable on the map (level filtered portals will not appear in the table) window.plugin.portalslist.getPortals = function() { //filter : 0 = All, 1 = Neutral, 2 = Res, 3 = Enl, -x = all but x var retval=false; var displayBounds = map.getBounds(); window.plugin.portalslist.listPortals = []; $.each(window.portals, function(i, portal) { // eliminate offscreen portals (selected, and in padding) if(!displayBounds.contains(portal.getLatLng())) return true; retval=true; switch (portal.options.team) { case TEAM_RES: window.plugin.portalslist.resP++; break; case TEAM_ENL: window.plugin.portalslist.enlP++; break; default: window.plugin.portalslist.neuP++; } // cache values and DOM nodes var obj = { portal: portal, values: [], sortValues: [] }; var row = document.createElement('tr'); row.className = TEAM_TO_CSS[portal.options.team]; obj.row = row; var cell = row.insertCell(-1); cell.className = 'alignR'; window.plugin.portalslist.fields.forEach(function(field, i) { cell = row.insertCell(-1); var value = field.value(portal); obj.values.push(value); obj.sortValues.push(field.sortValue ? field.sortValue(value, portal) : value); if(field.format) { field.format(cell, portal, value); } else { cell.textContent = value; } }); window.plugin.portalslist.listPortals.push(obj); }); return retval; } window.plugin.portalslist.displayPL = function() { var list; // plugins (e.g. bookmarks) can insert fields before the standard ones - so we need to search for the 'level' column window.plugin.portalslist.sortBy = window.plugin.portalslist.fields.map(function(f){return f.title;}).indexOf('Level'); window.plugin.portalslist.sortOrder = -1; window.plugin.portalslist.enlP = 0; window.plugin.portalslist.resP = 0; window.plugin.portalslist.neuP = 0; window.plugin.portalslist.filter = 0; if (window.plugin.portalslist.getPortals()) { list = window.plugin.portalslist.portalTable(window.plugin.portalslist.sortBy, window.plugin.portalslist.sortOrder,window.plugin.portalslist.filter); } else { list = $('
Nothing to show! |