Skip to content

Instantly share code, notes, and snippets.

@Terrance
Last active August 21, 2023 14:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Terrance/d45c0a36b7c04b50d2ff to your computer and use it in GitHub Desktop.
Save Terrance/d45c0a36b7c04b50d2ff to your computer and use it in GitHub Desktop.
An IITC plugin for generating CSV lists of portals (either all visible, or just enemy ones).
// ==UserScript==
// @id iitc-plugin-listexport@OllieTerrance
// @name IITC plugin: Portal List Exporter
// @category Info
// @version 0.0.0.1
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @description Exports a CSV list of all or enemy portals.
// @include https://www.ingress.com/intel*
// @include http://www.ingress.com/intel*
// @match https://www.ingress.com/intel*
// @match http://www.ingress.com/intel*
// @grant none
// ==/UserScript==
function wrapper() {
// in case IITC is not available yet, define the base plugin object
if (typeof window.plugin !== "function") {
window.plugin = function() {};
}
// base context for plugin
window.plugin.listexport = function() {};
var self = window.plugin.listexport;
// check all portals in range, show result dialog
self.gen = function gen(hit) {
var o = ["Portal,Latitude,Longitude,Team,Level,Health,Resos,Links,Fields,Destroy AP,Deploy AP"];
for (var x in window.portals) {
var p = window.portals[x];
var a = window.getPortalApGain(x);
if (hit && ((PLAYER.team === "RESISTANCE" && p.options.team === TEAM_RES) || (PLAYER.team === "ENLIGHTENED" && p.options.team === TEAM_ENL))) continue;
var l = window.getPortalLinks(x);
if (!p.options || !p.options.data) continue;
o.push([
(p.options.data.title ? "\"" + p.options.data.title.replace(/\"/g, "\"\"") + "\"" : "\"?\""),
p._latlng.lat,
p._latlng.lng,
["NEU", "RES", "ENL"][p.options.team],
p.options.data.level,
p.options.data.health,
p.options.data.resCount,
l.in.length + l.out.length,
window.getPortalFieldsCount(x),
a.destroyAp + a.destroyResoAp,
a.captureAp
].join(","));
}
var dialog = window.dialog({
title: (hit ? "Hit" : "Portal") + " List: CSV export",
// body must be wrapped in an outer tag (e.g. <div>content</div>)
html: '<textarea id="listCSVExport" rows="30" style="width: 100%;"></textarea>'
}).parent();
$(".ui-dialog-buttonpane", dialog).remove();
dialog.css("width", "800px")
.css("top", ($(window).height() - dialog.height()) / 2)
.css("left", ($(window).width() - dialog.width()) / 2);
$("#listCSVExport").val(o.join("\n"));
return dialog;
}
// setup function called by IITC
self.setup = function init() {
// add controls to toolbox
$("#toolbox").append("<a onclick=\"window.plugin.listexport.gen(false);\" title=\"Generate a CSV list of all portals.\">Export All</a>");
$("#toolbox").append("<a onclick=\"window.plugin.listexport.gen(true);\" title=\"Generate a CSV list of enemy portals.\">Hit List</a>");
// delete setup to ensure init can't be run again
delete self.setup;
}
// IITC plugin setup
if (window.iitcLoaded && typeof self.setup === "function") {
self.setup();
} else if (window.bootPlugins) {
window.bootPlugins.push(self.setup);
} else {
window.bootPlugins = [self.setup];
}
}
// inject plugin into page
var script = document.createElement("script");
script.appendChild(document.createTextNode("(" + wrapper + ")();"));
(document.body || document.head || document.documentElement).appendChild(script);
@rquadling
Copy link

I'm getting "?"s, and NaNs for a LOT of portals with this plugin.

Portal,Latitude,Longitude,Team,Level,Health,Resos,Links,Fields,Destroy AP,Deploy AP
"?",50.706423,-3.556621,ENL,,,,8,7,NaN,1750
"?",50.707832,-3.553557,ENL,,,,7,7,NaN,1750
"?",50.70455,-3.538783,ENL,,,,3,2,NaN,1750
...

If I put the lat/lng in the URL and reload, and then export the list, all is OK ... for that view. But then others are not shown, even though they previously did.

@Terrance
Copy link
Author

You'll get ? if the portal data hasn't loaded yet; usually this means either you've tried the export whilst the map is still loading, or it's including portals out of the current bounds. Ornaments will likely cause the latter as they're loaded in addition to in-bounds portals -- perhaps it's including lots of scout controller portals?

Failing that, this is a seven year old plugin and things may have changed in the meantime...

@rquadling
Copy link

Yes. I think time is the issue on this. I found a newer / maintained plugin that achieves exactly what I need in terms of portal name and lat/lng in a CSV file format. Thank you though!

@Nox13last
Copy link

Yes. I think time is the issue on this. I found a newer / maintained plugin that achieves exactly what I need in terms of portal name and lat/lng in a CSV file format. Thank you though!

Hey, friend. Feel like sharing?

@rquadling
Copy link

https://gist.github.com/Terrance/8547503

I modified this to include some additional info to allow me to build UMM import files for calculated missions.

o.push([p.options.data.title, p._latlng.lat, p._latlng.lng, p.options.guid, p.options.data.image].join('\t'));

As I'm using \t separation, no need to escape anything either. CSV => TSV.

With the additional data, all the local portals are then imported into a DB and I've got (at the moment) shortest line of sight routes. It's not the most efficient as some clusters have an edge closer to another cluster and so the automation "wanders" off on the route. As soon as I can code the clustering element, then all portals in the cluster are in the route before moving off.

But as it stands, it is useful for finding the shortest distance of a big banner in a city. It's all a bit "suck it and see" at the moment though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment