From 1f2fa7ac84aadf1f557df07c6fbeb8fc1d4b7796 Mon Sep 17 00:00:00 2001 From: Julien Roncaglia Date: Tue, 9 Apr 2013 22:44:16 +0200 Subject: [PATCH] Add a find by name feature to player-tracker It search for an user name and if the user is found, center the map on it's last known position. The feature can be triggered by: - Entering the user nickname in the search box preceded by '@' - Ctrl+Clicking on an user name in the chat --- plugins/player-tracker.user.js | 51 ++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) 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;