diff --git a/code/boot.js b/code/boot.js index 5cab4e63..130f9265 100644 --- a/code/boot.js +++ b/code/boot.js @@ -1,4 +1,3 @@ - // SETUP ///////////////////////////////////////////////////////////// // these functions set up specific areas after the boot function // created a basic framework. All of these functions should only ever @@ -103,15 +102,35 @@ window.setupStyles = function() { window.setupMap = function() { $('#map').text(''); - var osmOpt = {attribution: 'Map data © OpenStreetMap contributors', maxZoom: 18, detectRetina: true}; - var osm = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', osmOpt); + //OpenStreetMap attribution - required by several of the layers + osmAttribution = 'Map data © OpenStreetMap contributors'; - var cmOpt = {attribution: 'Map data © OpenStreetMap contributors, Imagery © CloudMade', maxZoom: 18, detectRetina: true}; - var cmMin = new L.TileLayer('http://{s}.tile.cloudmade.com/654cef5fd49a432ab81267e200ecc502/22677/256/{z}/{x}/{y}.png', cmOpt); - var cmMid = new L.TileLayer('http://{s}.tile.cloudmade.com/654cef5fd49a432ab81267e200ecc502/999/256/{z}/{x}/{y}.png', cmOpt); + //OpenStreetMap tiles - we shouldn't use these by default, or even an option - https://wiki.openstreetmap.org/wiki/Tile_usage_policy + // "Heavy use (e.g. distributing an app that uses tiles from openstreetmap.org) is forbidden without prior permission from the System Administrators" + //var osmOpt = {attribution: osmAttribution, maxZoom: 18, detectRetina: true}; + //var osm = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', osmOpt); - var views = [cmMid, cmMin, osm, new L.Google('INGRESS'), new L.Google('ROADMAP'), - new L.Google('SATELLITE'), new L.Google('HYBRID')]; + //CloudMade layers - only 500,000 tiles/month in their free plan. nowhere near enough for IITC + var cmOpt = {attribution: osmAttribution+', Imagery © CloudMade', maxZoom: 18, detectRetina: true}; + //var cmMin = new L.TileLayer('http://{s}.tile.cloudmade.com/{your api key here}/22677/256/{z}/{x}/{y}.png', cmOpt); + //var cmMid = new L.TileLayer('http://{s}.tile.cloudmade.com/{your api key here}/999/256/{z}/{x}/{y}.png', cmOpt); + + //MapQuest offer tiles - http://developer.mapquest.com/web/products/open/map + //their usage policy has no limits (except required notification above 4000 tiles/sec - we're perhaps at 50 tiles/sec based on CloudMade stats) + var mqSubdomains = [ 'otile1','otile2', 'otile3', 'otile4' ]; + var mqMapOpt = {attribution: osmAttribution+', Tiles Courtesy of MapQuest', mazZoom: 18, detectRetena: true, subdomains: mqSubdomains}; + var mqMap = new L.TileLayer('http://{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.jpg',mqMapOpt); + //MapQuest satellite coverage outside of the US is rather limited - so not really worth having as we have google as an option + //var mqSatOpt = {attribution: 'Portions Courtesy NASA/JPL-Caltech and U.S. Depart. of Agriculture, Farm Service Agency', mazZoom: 18, detectRetena: true, subdomains: mqSubdomains}; + //var mqSat = new L.TileLayer('http://{s}.mqcdn.com/tiles/1.0.0/sat/{z}/{x}/{y}.jpg',mqSatOpt); + + var views = [ + /*0*/ mqMap, + /*1*/ new L.Google('INGRESS'), + /*2*/ new L.Google('ROADMAP'), + /*3*/ new L.Google('SATELLITE'), + /*4*/ new L.Google('HYBRID') + ]; window.map = new L.Map('map', $.extend(getPosition(), @@ -137,13 +156,11 @@ window.setupMap = function() { addLayers['Links'] = linksLayer; window.layerChooser = new L.Control.Layers({ - 'OSM Midnight': views[0], - 'OSM Minimal': views[1], - 'OSM Mapnik': views[2], - 'Default Ingress Map': views[3], - 'Google Roads': views[4], - 'Google Satellite': views[5], - 'Google Hybrid': views[6] + 'MapQuest OSM': views[0], + 'Default Ingress Map': views[1], + 'Google Roads': views[2], + 'Google Satellite': views[3], + 'Google Hybrid': views[4] }, addLayers); map.addControl(window.layerChooser); @@ -291,12 +308,13 @@ window.setupDialogs = function() { autoOpen: false, modal: true, buttons: [ - { text: 'OK', click: function() { $(this).dialog('close'); } } + { text: 'OK', click: function() { if($(this).data("closeCallback")) {$(this).data("closeCallback")();} $(this).dialog('close'); } } ] }); - window.alert = function(text, isHTML) { + window.alert = function(text, isHTML, closeCallback) { var h = isHTML ? text : window.convertTextToTableMagic(text); + $('#dialog').data("closeCallback", closeCallback); $('#dialog').html(h).dialog('open'); } } diff --git a/code/chat.js b/code/chat.js index 73d11862..919ce854 100644 --- a/code/chat.js +++ b/code/chat.js @@ -241,6 +241,14 @@ window.chat.renderFull = function(oldMsgsWereAdded) { // common // +window.chat.nicknameClicked = function(event, nickname) { + var hookData = { event: event, nickname: nickname }; + + if (window.runHooks('nicknameClicked', hookData)) { + window.chat.addNickname('@' + nickname); + } +} + window.chat.writeDataToHash = function(newData, storageHash, isPublicChannel) { $.each(newData.result, function(ind, json) { // avoid duplicates @@ -283,9 +291,10 @@ window.chat.writeDataToHash = function(newData, storageHash, isPublicChannel) { case 'AT_PLAYER': var thisToPlayer = (markup[1].plain == ('@'+window.PLAYER.nickname)); var spanClass = thisToPlayer ? "pl_nudge_me" : (markup[1].team + " pl_nudge_player"); + var atPlayerName = markup[1].plain.replace(/^@/, ""); msg += $('
').html($('') .attr('class', spanClass) - .attr('onclick',"window.chat.addNickname('"+markup[1].plain+"')") + .attr('onclick',"window.chat.nicknameClicked(event, '"+atPlayerName+"')") .text(markup[1].plain)).html(); msgToPlayer = msgToPlayer || thisToPlayer; break; @@ -401,7 +410,7 @@ window.chat.renderMsg = function(msg, nick, time, team, msgToPlayer, systemNarro var s = 'style="cursor:pointer; color:'+color+'"'; var title = nick.length >= 8 ? 'title="'+nick+'" class="help"' : ''; var i = ['<', '>']; - return ''+t+''+i[0]+''+ nick+''+i[1]+''+msg+''; + return ''+t+''+i[0]+''+ nick+''+i[1]+''+msg+''; } window.chat.addNickname= function(nick){ diff --git a/code/geosearch.js b/code/geosearch.js index 4e5df1b7..0f8f5776 100644 --- a/code/geosearch.js +++ b/code/geosearch.js @@ -4,7 +4,14 @@ window.setupGeosearch = function() { $('#geosearch').keypress(function(e) { if((e.keyCode ? e.keyCode : e.which) != 13) return; - $.getJSON(NOMINATIM + encodeURIComponent($(this).val()), function(data) { + + var search = $(this).val(); + + if (!runHooks('geoSearch', search)) { + return; + } + + $.getJSON(NOMINATIM + encodeURIComponent(search), function(data) { if(!data || !data[0]) return; var b = data[0].boundingbox; if(!b) return; diff --git a/code/hooks.js b/code/hooks.js index 435792db..f0c4b66f 100644 --- a/code/hooks.js +++ b/code/hooks.js @@ -59,15 +59,21 @@ window._hooks = {} window.VALID_HOOKS = ['portalAdded', 'portalDetailsUpdated', 'publicChatDataAvailable', 'factionChatDataAvailable', 'portalDataLoaded', - 'beforePortalReRender', 'checkRenderLimit', 'requestFinished']; + 'beforePortalReRender', 'checkRenderLimit', 'requestFinished', 'nicknameClicked', + 'geoSearch']; window.runHooks = function(event, data) { if(VALID_HOOKS.indexOf(event) === -1) throw('Unknown event type: ' + event); - if(!_hooks[event]) return; + if(!_hooks[event]) return true; + var interupted = false; $.each(_hooks[event], function(ind, callback) { - callback(data); + if (callback(data) === false) { + interupted = true; + return false; //break from $.each + } }); + return !interupted; } diff --git a/code/location.js b/code/location.js index 2860a9a5..efa85586 100644 --- a/code/location.js +++ b/code/location.js @@ -21,11 +21,18 @@ window.storeMapPosition = function() { // returns a map that shows the whole world. window.getPosition = function() { if(getURLParam('latE6') && getURLParam('lngE6')) { - console.log("mappos: reading URL params"); + console.log("mappos: reading email URL params"); var lat = parseInt(getURLParam('latE6'))/1E6 || 0.0; var lng = parseInt(getURLParam('lngE6'))/1E6 || 0.0; - // google seems to zoom in far more than leaflet - var z = parseInt(getURLParam('z'))+1 || 17; + var z = parseInt(getURLParam('z')) || 17; + return {center: new L.LatLng(lat, lng), zoom: z > 18 ? 18 : z}; + } + + if(getURLParam('ll')) { + console.log("mappos: reading stock Intel URL params"); + var lat = parseFloat(getURLParam('ll').split(",")[0]) || 0.0; + var lng = parseFloat(getURLParam('ll').split(",")[1]) || 0.0; + var z = parseInt(getURLParam('z')) || 17; return {center: new L.LatLng(lat, lng), zoom: z > 18 ? 18 : z}; } diff --git a/code/utils_misc.js b/code/utils_misc.js index f97ffdf6..16aceeb7 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -1,7 +1,30 @@ - - // UTILS + MISC /////////////////////////////////////////////////////// +window.aboutIITC = function(){ + var v = '@@BUILDNAME@@-@@BUILDDATE@@' + var a = '' + + '
About IITC
' + + '
Ingress Intel Total Conversion
' + + '
' + + '
' + + ' IITC Homepage
' + + ' On the script’s homepage you can:' + + '
    ' + + '
  • Find Updates
  • ' + + '
  • Get Plugins
  • ' + + '
  • Report Bugs
  • ' + + '
  • Contribute!
  • ' + + '
' + + '
' + + '
' + + ' MapQuest OSM tiles Courtesy of MapQuest ' + + '
' + + '
' + + '
Version: ' + v + '
'; + alert(a); +} + + window.layerGroupLength = function(layerGroup) { var layersCount = 0; var layers = layerGroup._layers; @@ -257,7 +280,7 @@ window.setPermaLink = function(elm) { var c = map.getCenter(); var lat = Math.round(c.lat*1E6); var lng = Math.round(c.lng*1E6); - var qry = 'latE6='+lat+'&lngE6='+lng+'&z=' + (map.getZoom()-1); + var qry = 'latE6='+lat+'&lngE6='+lng+'&z=' + map.getZoom(); $(elm).attr('href', '/intel?' + qry); } diff --git a/main.js b/main.js index b403b517..22dcb1c7 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,7 @@ // ==UserScript== // @id ingress-intel-total-conversion@jonatkins // @name IITC: Ingress intel map total conversion -// @version 0.10.3.@@DATETIMEVERSION@@ +// @version 0.10.5.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ @@ -89,8 +89,8 @@ document.getElementsByTagName('body')[0].innerHTML = '' + '
' + ' ' + '
' - + ' permalink' - + ' IITC’s page
' + + ' Permalink' + + ' About IITC
' + ' ' + '' + '
' diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index c2cc350f..d3fa4d8f 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="9" + android:versionName="0.2.8" > About About IITC Mobile - + Ingress Intel Total Conversion Mobile

by cradle

diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java b/mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java index fde24883..23d98de1 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_AboutDialogPreference.java @@ -34,7 +34,7 @@ public class IITC_AboutDialogPreference extends DialogPreference{ message.setMovementMethod(LinkMovementMethod.getInstance()); builder.setView(message) .setTitle(R.string.about) - .setIcon(R.drawable.ic_stat_about) + .setIcon(android.R.drawable.ic_dialog_info) .setNeutralButton(R.string.close, new OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index aa0e683a..700a8745 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -6,7 +6,6 @@ import com.cradle.iitc_mobile.R; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.net.NetworkInfo.State; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -85,17 +84,29 @@ public class IITC_Mobile extends Activity { protected void onStop() { ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - State mobile = conMan.getNetworkInfo(0).getState(); - State wifi = conMan.getNetworkInfo(1).getState(); + NetworkInfo mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); + NetworkInfo wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI); - if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING) { - // cancel all current requests - iitc_view.loadUrl("javascript: window.requests.abort()"); - // set idletime to maximum...no need for more - iitc_view.loadUrl("javascript: window.idleTime = 999"); - } else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) { - iitc_view.loadUrl("javascript: window.idleTime = 999"); + // check if Mobile or Wifi module is available..then handle states + // TODO: theory...we do not have to check for a Wifi module...every android device should have one + if (mobile != null) { + Log.d("iitcm", "mobile internet module detected...check states"); + if (mobile.getState() == NetworkInfo.State.CONNECTED || mobile.getState() == NetworkInfo.State.CONNECTING) { + Log.d("iitcm", "connected to mobile net...abort all running requests"); + // cancel all current requests + iitc_view.loadUrl("javascript: window.requests.abort()"); + // set idletime to maximum...no need for more + iitc_view.loadUrl("javascript: window.idleTime = 999"); + } else if (wifi.getState() == NetworkInfo.State.CONNECTED || wifi.getState() == NetworkInfo.State.CONNECTING) { + iitc_view.loadUrl("javascript: window.idleTime = 999"); + } + } else { + Log.d("iitcm", "no mobile internet module detected...check wifi state"); + if (wifi.getState() == NetworkInfo.State.CONNECTED || wifi.getState() == NetworkInfo.State.CONNECTING) { + iitc_view.loadUrl("javascript: window.idleTime = 999"); + } } + Log.d("iitcm", "stopping iitcm"); super.onStop(); } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java b/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java index b51fae9c..d92d189d 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java @@ -1,9 +1,12 @@ package com.cradle.iitc_mobile; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; +import android.net.Uri; import android.net.http.SslError; import android.preference.PreferenceManager; +import android.util.Log; import android.webkit.SslErrorHandler; import android.webkit.WebResourceResponse; import android.webkit.WebView; @@ -22,8 +25,10 @@ public class IITC_WebViewClient extends WebViewClient { private WebResourceResponse iitcjs; private String js = null; + Context context; public IITC_WebViewClient(Context c) { + this.context = c; try { loadIITC_JS(c); } catch(IOException e) { @@ -109,4 +114,17 @@ public class IITC_WebViewClient extends WebViewClient { return super.shouldInterceptRequest(view, url); } } + + // start non-ingress-intel-urls in another app... + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + if (url.contains("ingress.com")) { + return false; + } else { + Log.d("iitcm", "no ingress intel link, start external app to load url: " + url); + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + context.startActivity(intent); + return true; + } + } } diff --git a/plugins/guess-player-levels.user.js b/plugins/guess-player-levels.user.js index 95de9666..778101df 100644 --- a/plugins/guess-player-levels.user.js +++ b/plugins/guess-player-levels.user.js @@ -23,7 +23,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; window.plugin.guessPlayerLevels = function() {}; window.plugin.guessPlayerLevels.setupCallback = function() { - $('#toolbox').append('guess player levels '); + $('#toolbox').append(' Guess player levels'); addHook('portalAdded', window.plugin.guessPlayerLevels.extractPortalData); } diff --git a/plugins/ipas-link.user.js b/plugins/ipas-link.user.js index 4aaa6227..87395a10 100644 --- a/plugins/ipas-link.user.js +++ b/plugins/ipas-link.user.js @@ -23,19 +23,23 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; window.plugin.ipasLink = function() {}; window.plugin.ipasLink.setupCallback = function() { - addHook('portalDetailsUpdated', window.plugin.ipasLink.addLink); + addHook('portalDetailsUpdated', window.plugin.ipasLink.addLink); } window.plugin.ipasLink.addLink = function(d) { - $('.linkdetails').append(''); + $('.linkdetails').append(''); } window.plugin.ipasLink.getHash = function(d) { - var hashParts=[]; - $.each(d.resonatorArray.resonators, function(ind, reso) { - hashParts.push(reso.level + "," + reso.distanceToPortal + "," + reso.energyTotal); - }); - return hashParts.join(";")+"|" + "0,0,0,0"; //shields not implemented yet + var hashParts=[]; + $.each(d.resonatorArray.resonators, function(ind, reso) { + if (reso) { + hashParts.push(reso.level + "," + reso.distanceToPortal + "," + reso.energyTotal); + } else { + hashParts.push(1 + "," + 35 + "," + 0); // Dummy values, the only important one is energy=0 + } + }); + return hashParts.join(";")+"|" + "0,0,0,0"; //shields not implemented yet } var setup = function() { @@ -57,4 +61,3 @@ if(window.iitcLoaded && typeof setup === 'function') { var script = document.createElement('script'); script.appendChild(document.createTextNode('('+ wrapper +')();')); (document.body || document.head || document.documentElement).appendChild(script); - diff --git a/plugins/player-tracker.user.js b/plugins/player-tracker.user.js index 3dd37476..1ba99cd3 100644 --- a/plugins/player-tracker.user.js +++ b/plugins/player-tracker.user.js @@ -62,6 +62,8 @@ window.plugin.playerTracker.setup = function() { window.plugin.playerTracker.zoomListener(); }); window.plugin.playerTracker.zoomListener(); + + plugin.playerTracker.setupUserSearch(); } window.plugin.playerTracker.stored = {}; @@ -341,8 +343,57 @@ window.plugin.playerTracker.handleData = function(data) { plugin.playerTracker.drawData(); } +window.plugin.playerTracker.findUserPosition = function(nick) { + nick = nick.toLowerCase(); + var foundPlayerData = undefined; + $.each(plugin.playerTracker.stored, function(pguid, playerData) { + if (playerData.nick.toLowerCase() === nick) { + foundPlayerData = playerData; + return false; + } + }); + + if (!foundPlayerData) { + return false; + } + + var evtsLength = foundPlayerData.events.length; + var last = foundPlayerData.events[evtsLength-1]; + return plugin.playerTracker.getLatLngFromEvent(last); +} +window.plugin.playerTracker.centerMapOnUser = function(nick) { + var position = plugin.playerTracker.findUserPosition(nick); + + if (position === false) { + return false; + } + + map.setView(position, map.getZoom()); +} +window.plugin.playerTracker.onNicknameClicked = function(info) { + if (info.event.ctrlKey) { + plugin.playerTracker.centerMapOnUser(info.nickname); + return false; + } +} + +window.plugin.playerTracker.onGeoSearch = function(search) { + if (/^@/.test(search)) { + plugin.playerTracker.centerMapOnUser(search.replace(/^@/, '')); + return false; + } +} + +window.plugin.playerTracker.setupUserSearch = function() { + addHook('nicknameClicked', window.plugin.playerTracker.onNicknameClicked); + addHook('geoSearch', window.plugin.playerTracker.onGeoSearch); + + var geoSearch = $('#geosearch'); + var beforeEllipsis = /(.*)…/.exec(geoSearch.attr('placeholder'))[1]; + geoSearch.attr('placeholder', beforeEllipsis + ' or @player…'); +} var setup = plugin.playerTracker.setup; diff --git a/plugins/portal-counts.user.js b/plugins/portal-counts.user.js index fe8387b3..7730c29c 100644 --- a/plugins/portal-counts.user.js +++ b/plugins/portal-counts.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-portals-count@yenky // @name IITC plugin: Show total counts of portals -// @version 0.0.6.@@DATETIMEVERSION@@ +// @version 0.0.7.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ @@ -99,8 +99,7 @@ window.plugin.portalcounts.getPortals = function(){ } var setup = function() { - $('body').append(''); - $('#toolbox').append('Portalcounts'); + $('#toolbox').append(' Portal&sbsp;counts'); $('head').append('