diff --git a/code/hooks.js b/code/hooks.js index fbf5c602..c3e0aa25 100644 --- a/code/hooks.js +++ b/code/hooks.js @@ -46,14 +46,15 @@ // checkRenderLimit: callback is passed the argument of // {reached : false} to indicate that the renderlimit is reached // set reached to true. - +// requestFinished: called after each request finished. Argument is +// {success: boolean} indicated the request success or fail. window._hooks = {} window.VALID_HOOKS = ['portalAdded', 'portalDetailsUpdated', 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender', - 'checkRenderLimit']; + 'checkRenderLimit', 'requestFinished']; window.runHooks = function(event, data) { if(VALID_HOOKS.indexOf(event) === -1) throw('Unknown event type: ' + event); diff --git a/code/map_data.js b/code/map_data.js index 6dc7f0c9..3da36190 100644 --- a/code/map_data.js +++ b/code/map_data.js @@ -59,6 +59,7 @@ window.handleFailedRequest = function() { var leftOverPortals = portalRenderLimit.mergeLowLevelPortals(null); handlePortalsRender(leftOverPortals); } + runHooks('requestFinished', {success: false}); } // works on map data response and ensures entities are drawn/updated. @@ -139,6 +140,7 @@ window.handleDataResponse = function(data, textStatus, jqXHR) { resolvePlayerNames(); renderUpdateStatus(); + runHooks('requestFinished', {success: true}); } window.handlePortalsRender = function(portals) { @@ -451,6 +453,7 @@ window.isResonatorsShow = function() { window.isSameResonator = function(oldRes, newRes) { if(!oldRes && !newRes) return true; + if(!oldRes || !newRes) return false; if(typeof oldRes !== typeof newRes) return false; if(oldRes.level !== newRes.level) return false; if(oldRes.energyTotal !== newRes.energyTotal) return false; diff --git a/code/redeeming.js b/code/redeeming.js index 51a126dc..12bc5e32 100644 --- a/code/redeeming.js +++ b/code/redeeming.js @@ -12,12 +12,12 @@ window.handleRedeemResponse = function(data, textStatus, jqXHR) { } else if (data.error === 'INVALID_PASSCODE') { error = 'This passcode is invalid.'; } else { - error = 'The passcode cannot be redeemed.'; + error = 'There was a problem redeeming the passcode. Try again?'; } - alert("Error: " + data.error + "\n" + error); + alert('' + data.error + "\n" + error); } else if (data.result) { - var res_level = 0, res_count = 0; var xmp_level = 0, xmp_count = 0; + var res_level = 0, res_count = 0; var shield_rarity = '', shield_count = 0; // This assumes that each passcode gives only one type of resonator/XMP/shield. @@ -30,17 +30,17 @@ window.handleRedeemResponse = function(data, textStatus, jqXHR) { shield_count++; } } else if (acquired.resourceWithLevels) { - if (acquired.resourceWithLevels.resourceType === 'EMITTER_A') { - res_level = acquired.resourceWithLevels.level; - res_count++; - } else if (acquired.resourceWithLevels.resourceType === 'EMP_BURSTER') { + if (acquired.resourceWithLevels.resourceType === 'EMP_BURSTER') { xmp_level = acquired.resourceWithLevels.level; xmp_count++; + } else if (acquired.resourceWithLevels.resourceType === 'EMITTER_A') { + res_level = acquired.resourceWithLevels.level; + res_count++; } } } - alert("Passcode redeemed!\n" + [data.result.apAward + 'AP', data.result.xmAward + 'XM', res_count + 'xL' + res_level + ' RES', xmp_count + 'xL' + xmp_level + ' XMP', shield_count + 'x' + shield_rarity + ' SHIELD'].join('/')); + alert("Passcode accepted!\n" + [data.result.apAward + 'AP', data.result.xmAward + 'XM', xmp_count + 'xL' + xmp_level + ' XMP', res_count + 'xL' + res_level + ' RES', shield_count + 'x' + shield_rarity + ' SH'].join('/')); } } @@ -49,6 +49,19 @@ window.setupRedeem = function() { if((e.keyCode ? e.keyCode : e.which) != 13) return; var data = {passcode: $(this).val()}; window.postAjax('redeemReward', data, window.handleRedeemResponse, - function() { alert('The HTTP request failed. Either your code is invalid or their servers are down. No way to tell.'); }); + function(response) { + var extra = ''; + if (response && response.status) { + if (response.status === 429) { + extra = "You have been rate-limited by the server. Wait a bit and try again."; + } else { + extra = "The server indicated an error."; + } + extra += "\n" + 'Response: HTTP ' + jq.status + "."; + } else { + extra = "No status code was returned."; + } + alert('The HTTP request failed. ' + extra); + }); }); } diff --git a/plugins/player-tracker.user.js b/plugins/player-tracker.user.js index f52f4347..fe9c66a8 100644 --- a/plugins/player-tracker.user.js +++ b/plugins/player-tracker.user.js @@ -204,9 +204,9 @@ window.plugin.playerTracker.drawData = function() { var evtsLength = playerData.events.length; var last = playerData.events[evtsLength-1]; var ago = plugin.playerTracker.ago; - var color = playerData.team === 'ALIENS' ? '#029C02' : '#00789C'; + var cssClass = playerData.team === 'ALIENS' ? 'enl' : 'res'; var title = - '' + playerData.nick + '\n' + '' + playerData.nick + '\n' + ago(last.time, now) + ' minutes ago\n' + last.name; // show previous data in tooltip diff --git a/style.css b/style.css index f25501f9..31270562 100644 --- a/style.css +++ b/style.css @@ -679,15 +679,18 @@ aside { max-width: 300px; position: absolute; z-index: 9999; - background-color: #fff; - border: 1px solid #ccc; - color: #222; + background-color: rgba(8, 48, 78, 0.9); + border: 1px solid #20A8B1; + color: #eee; font: 13px/15px "Helvetica Neue", Arial, Helvetica, sans-serif; padding: 2px 4px; } +.ui-tooltip, .ui-dialog a { + color: #FFCE00; +} + .ui-dialog { - border: 1px solid #0F0F0F; padding: 0; border-radius: 2px; } @@ -715,23 +718,26 @@ aside { max-width: 700px !important; } -.ui-dialog a { - color: #0000ca; -} - .ui-dialog-buttonpane { - background: #F2F2F2; padding: 12px; - border-top: 1px solid #E6E6E6; + border-top: 1px solid #20A8B1; } .ui-dialog-buttonset { text-align: right; } -.ui-dialog-buttonset button { +.ui-dialog-buttonset button, +.ui-dialog-content button { padding: 2px; min-width: 80px; + color: #FFCE00; + border: 1px solid #FFCE00; + background-color: rgba(8, 48, 78, 0.9); +} + +.ui-dialog-buttonset button:hover { + text-decoration: underline; } td {