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..04ca1fd7 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; + } }); + return !interupted; } 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;