// ==UserScript==
// @author BlancLapin
// @id advanced_player_tracker@BlancLapin
// @name Advanced Tracker Player
// @category Misc
// @version 0.0.1
// @namespace https://tempuri.org/iitc/advanced-player-tracker
// @description Advanced version of Player Tracker
// @updateURL https://raw.githubusercontent.com/IITC-CE/Community-plugins/master/dist/BlancLapin/advanced_player_tracker.meta.js
// @downloadURL https://raw.githubusercontent.com/IITC-CE/Community-plugins/master/dist/BlancLapin/advanced_player_tracker.user.js
// @depends player-activity-tracker@breunigs
// @include http://www.ingress.com/intel*
// @include https://www.ingress.com/intel*
// @match http://www.ingress.com/intel*
// @match https://www.ingress.com/intel*
// @grant none
// ==/UserScript==
// Wrapper function that will be stringified and injected
// into the document. Because of this, normal closure rules
// do not apply here.
function wrapper(plugin_info) {
// Make sure that window.plugin exists. IITC defines it as a no-op function,
// and other plugins assume the same.
if(typeof window.plugin !== 'function') window.plugin = function() {};
window.plugin.advancedPlayerTracker = function() {};
// Refresh interval (don't spam)
window.plugin.advancedPlayerTracker.refreshInterval = 600000; // 10min, in ms
// Local Storage Player List Key
window.plugin.advancedPlayerTracker.LSPlayerListKey = 'IITCWatchPlayerList';
// Local Storage Player Data Key
window.plugin.advancedPlayerTracker.LSPlayerDataKey = 'IITCWatchPlayerData';
// List of players to track (should be moved to Local Storage)
window.plugin.advancedPlayerTracker.playerList = [];
// List of visible players at the moment
window.plugin.advancedPlayerTracker.visiblePlayers = [];
// Store data
window.plugin.advancedPlayerTracker.playerData = [];
// Name of the IITC build for first-party plugins
plugin_info.buildName = 'AdvancedPlayerTracker';
// Datetime-derived version of the plugin
plugin_info.dateTimeVersion = '20220208103500';
// ID/name of the plugin
plugin_info.pluginId = 'AdvancedPlayerTracker';
// The entry point for this plugin.
function setup() {
}
window.plugin.advancedPlayerTracker.setupHook = function() {
// Get player list from local storage
var playerListLocalStorage = localStorage.getItem(window.plugin.advancedPlayerTracker.LSPlayerListKey);
if (playerListLocalStorage){
window.plugin.advancedPlayerTracker.playerList = JSON.parse(playerListLocalStorage)['WatchedPlayers'];
}
// Load previous data from local storage if existing
var playerDataLocalStorage = localStorage.getItem(window.plugin.advancedPlayerTracker.LSPlayerDataKey);
if (playerDataLocalStorage){
window.plugin.advancedPlayerTracker.playerData = JSON.parse(playerDataLocalStorage);
}
// Add a refresh timer to refresh map at regular interval (don't spam)
window.setInterval(window.plugin.advancedPlayerTracker.refreshMap, window.plugin.advancedPlayerTracker.refreshInterval);
}
// Refresh map
window.plugin.advancedPlayerTracker.refreshMap = function(){
window.mapDataRequest.start();
}
// Update Player List (updated via interface)
window.plugin.advancedPlayerTracker.updatePlayerList = function(updatedPlayerList){
window.plugin.advancedPlayerTracker.playerList = updatedPlayerList.split('\n');
// Save to Local Storage
localStorage.setItem(window.plugin.advancedPlayerTracker.LSPlayerListKey, JSON.stringify({WatchedPlayers: window.plugin.advancedPlayerTracker.playerList}));
}
// Hook Map Refreshed
window.plugin.advancedPlayerTracker.mapRefreshEnded = function(){
// Check visible players on the map
window.plugin.advancedPlayerTracker.visiblePlayers = [];
$.each(window.plugin.playerTracker.stored, function(pguid, playerData) {
if(!playerData || playerData.events.length === 0) {
console.warn('broken player data for pguid=' + pguid);
}else{
window.plugin.advancedPlayerTracker.visiblePlayers.push(playerData)
}
});
// Export data to csv
window.plugin.advancedPlayerTracker.exportData = function(){
var csvData = 'Player, Team, Latitude, Longitude, Portal Hit, Timestamp' + "\n";
$.each(window.plugin.advancedPlayerTracker.playerData, function(key, value){
csvData += (value.Player + ',' + value.Team + "," + value.Lat + "," + value.Long + ',' + value.PortalHit + ',' + value.timestamp + "\n");
});
var link = document.createElement("a");
link.download = 'AdvandedPlayerTracker_Export.csv';
link.href = "data:text/csv," + escape(csvData);
link.click();
}
// Check if visible player is on the watch list
$.each(window.plugin.advancedPlayerTracker.visiblePlayers, function(index, playerData){
if (window.plugin.advancedPlayerTracker.playerList.includes(playerData.nick)) {
//console.log(playerData.nick + ' is visible and on watch list');
//console.log(playerData);
// For each watched player, check events
$.each(playerData.events, function(index, event){
// If not prior events, add the first one
if (!window.plugin.advancedPlayerTracker.playerData.length){
window.plugin.advancedPlayerTracker.playerData.push({Player: playerData.nick, Team: playerData.team, Lat: event.latlngs[0][0], Long: event.latlngs[0][1], PortalHit: event.name, timestamp: event.time});
}
// Check if events are posterior to already logged data (don't add otherwise)
var filteredData = window.plugin.advancedPlayerTracker.playerData.filter(function(elem) {
return (elem.Player == playerData.nick && elem.timestamp >= event.time)
});
// If events is posterior to logged data, add it
if (!filteredData.length){
window.plugin.advancedPlayerTracker.playerData.push({Player: playerData.nick, Team: playerData.team, Lat: event.latlngs[0][0], Long: event.latlngs[0][1], PortalHit: event.name, timestamp: event.time});
}
});
}
});
// Save data to local storage
localStorage.setItem(window.plugin.advancedPlayerTracker.LSPlayerDataKey, JSON.stringify(window.plugin.advancedPlayerTracker.playerData));
}
window.plugin.advancedPlayerTracker.showDialog = function(){
var data = `
Watch List: