diff --git a/mapserver_mod/mapserver/bridge.lua b/mapserver_mod/mapserver/bridge.lua index fbbd40d..a66637c 100644 --- a/mapserver_mod/mapserver/bridge.lua +++ b/mapserver_mod/mapserver/bridge.lua @@ -23,7 +23,7 @@ function send_stats() local data = { time = minetest.get_timeofday() * 24000, uptime = minetest.get_server_uptime(), - max_lag = get_max_lag(), + max_lag = tonumber(get_max_lag()), players = {} } @@ -36,11 +36,11 @@ function send_stats() velocity = player:get_player_velocity() } - table.insert(data.players, player) + table.insert(data.players, info) end http.fetch({ - url = url, + url = url .. "/api/minetest", extra_headers = { "Content-Type: application/json", "Authorization: " .. key }, timeout = 1, post_data = minetest.write_json(data) diff --git a/server/Makefile b/server/Makefile index 58fd06f..1ab7b37 100644 --- a/server/Makefile +++ b/server/Makefile @@ -18,7 +18,7 @@ clean: rm -rf $(OUT_DIR) $(STATIC_VFS): - go generate + go run github.com/mjibson/esc -o vfs/static.go -prefix="static/" -pkg vfs static build: $(STATIC_VFS) $(OUT_DIR) # native diff --git a/server/main.go b/server/main.go index b222652..6b219de 100644 --- a/server/main.go +++ b/server/main.go @@ -2,16 +2,15 @@ package main import ( "fmt" - "github.com/sirupsen/logrus" "mapserver/app" "mapserver/mapobject" "mapserver/params" "mapserver/tilerendererjob" "mapserver/web" "runtime" -) -//go:generate -command go run github.com/mjibson/esc -o vfs/static.go -prefix="static/" -pkg vfs static + "github.com/sirupsen/logrus" +) func main() { //Parse command line diff --git a/server/static/index.html b/server/static/index.html index 2616f63..17e8320 100644 --- a/server/static/index.html +++ b/server/static/index.html @@ -11,15 +11,28 @@
+ + + + + + + + + + + + + diff --git a/server/static/js/WebSocketChannel.js b/server/static/js/WebSocketChannel.js index 5d49d19..d17af8c 100644 --- a/server/static/js/WebSocketChannel.js +++ b/server/static/js/WebSocketChannel.js @@ -15,6 +15,17 @@ WebSocketChannel.prototype.addListener = function(type, listener){ list.push(listener); }; +WebSocketChannel.prototype.removeListener = function(type, listener){ + var list = this.listenerMap[type]; + if (!list){ + return + } + + this.listenerMap[type] = list.filter(function(l){ + return l != listener; + }); +}; + WebSocketChannel.prototype.connect = function(){ var ws = new WebSocket(this.wsUrl); var self = this; @@ -25,7 +36,7 @@ WebSocketChannel.prototype.connect = function(){ var listeners = self.listenerMap[event.type]; if (listeners){ - self.listeners.forEach(function(listener){ + listeners.forEach(function(listener){ listener(event.data); }); } diff --git a/server/static/js/main.js b/server/static/js/main.js index 1704b4b..78d5c0f 100644 --- a/server/static/js/main.js +++ b/server/static/js/main.js @@ -5,6 +5,10 @@ api.getConfig().then(function(cfg){ var wsChannel = new WebSocketChannel(); wsChannel.connect(); + wsChannel.addListener("minetest-info", function(e){ + console.log(e); //XXX + }); + var rtTiles = new RealtimeTileLayer(wsChannel); var initialZoom = 11; @@ -18,7 +22,7 @@ api.getConfig().then(function(cfg){ crs: SimpleCRS }); - map.attributionControl.addAttribution('Mapserver'); + map.attributionControl.addAttribution('Minetest Mapserver'); var layers = {}; var overlays = {} @@ -29,6 +33,7 @@ api.getConfig().then(function(cfg){ tileLayer.addTo(map); layers["Base"] = tileLayer; + overlays["Players"] = new PlayerOverlay(wsChannel, layerMgr); overlays["Travelnet"] = new TravelnetOverlay(wsChannel, layerMgr); L.control.layers(layers, overlays).addTo(map); diff --git a/server/static/js/overlays/PlayerOverlay.js b/server/static/js/overlays/PlayerOverlay.js new file mode 100644 index 0000000..bfd8c5e --- /dev/null +++ b/server/static/js/overlays/PlayerOverlay.js @@ -0,0 +1,53 @@ +'use strict'; + +var PlayerIcon = L.icon({ + iconUrl: 'pics/sam.png', + + iconSize: [16, 32], + iconAnchor: [8, 16], + popupAnchor: [0, -16] +}); + +var PlayerOverlay = L.LayerGroup.extend({ + initialize: function(wsChannel, layerMgr) { + L.LayerGroup.prototype.initialize.call(this); + + this.layerMgr = layerMgr; + this.wsChannel = wsChannel; + + this.currentObjects = []; + + this.onLayerChange = this.onLayerChange.bind(this); + this.reDraw = this.reDraw.bind(this); + this.onMapMove = debounce(this.onMapMove.bind(this), 50); + + this.wsChannel.addListener("minetest-info", this.onMinetestUpdate.bind(this)); + }, + + onLayerChange: function(layer){ + this.reDraw(); + }, + + onMinetestUpdate: function(info){ + //TODO + }, + + reDraw: function(){ + var self = this; + + this.clearLayers(); + + var mapLayer = this.layerMgr.getCurrentLayer() + //TODO + }, + + onAdd: function(map) { + this.layerMgr.addListener(this.reDraw); + this.reDraw(true) + }, + + onRemove: function(map) { + this.clearLayers(); + this.layerMgr.removeListener(this.reDraw); + } +}); diff --git a/server/static/js/overlays/TravelnetOverlay.js b/server/static/js/overlays/TravelnetOverlay.js index d1335b6..1b3cf30 100644 --- a/server/static/js/overlays/TravelnetOverlay.js +++ b/server/static/js/overlays/TravelnetOverlay.js @@ -10,11 +10,15 @@ var TravelnetIcon = L.icon({ var TravelnetOverlay = L.LayerGroup.extend({ initialize: function(wsChannel, layerMgr) { + L.LayerGroup.prototype.initialize.call(this); + this.layerMgr = layerMgr; this.wsChannel = wsChannel; + this.currentObjects = []; + this.onLayerChange = this.onLayerChange.bind(this); - this.onMapMove = this.onMapMove.bind(this); + this.onMapMove = debounce(this.onMapMove.bind(this), 50); }, onLayerChange: function(layer){ @@ -28,29 +32,48 @@ var TravelnetOverlay = L.LayerGroup.extend({ reDraw: function(full){ var self = this; - if (full) + if (this._map.getZoom() < 10) { this.clearLayers(); + this.currentObjects = []; + return; + } + + if (full){ + this.clearLayers(); + this.currentObjects = []; + } + + var mapLayer = this.layerMgr.getCurrentLayer() + var min = this._map.getBounds().getSouthWest(); + var max = this._map.getBounds().getNorthEast(); + + var y1 = parseInt(mapLayer.from/16); + var y2 = parseInt(mapLayer.to/16); + var x1 = parseInt(min.lng); + var x2 = parseInt(max.lng); + var z1 = parseInt(min.lat); + var z2 = parseInt(max.lat); //TODO: get coords - api.getMapObjects(-10,-10,-10,10,10,10,"travelnet") + api.getMapObjects( + x1, y1, y1, + x2, y2, z2, + "travelnet") .then(function(travelnets){ //TODO: remove non-existing markers, add new ones - if (!full) - this.clearLayers(); - - console.log(travelnets); - - //TODO: attributes, coords - var marker = L.marker([travelnet.z, travelnet.x], {icon: TravelnetIcon}); + if (!full){ + self.clearLayers(); + } travelnets.forEach(function(travelnet){ - var popup = "