1
0
forked from MTSR/mapserver
mapserver/web/areas.go
2023-12-29 16:00:11 +01:00

58 lines
944 B
Go

package web
import (
"encoding/json"
"mapserver/app"
"net/http"
"os"
"sync"
"time"
"github.com/minetest-go/areasparser"
)
type AreasHandler struct {
ctx *app.App
cache []*areasparser.Area
lasttime int64
}
var mutex = &sync.Mutex{}
const AREAS_FILENAME = "areas.dat"
func (h *AreasHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
info, err := os.Stat(AREAS_FILENAME)
if info == nil || err != nil {
// no areas file
resp.Header().Add("content-type", "application/json")
resp.Write([]byte("[]"))
return
}
now := time.Now().Unix()
diff := now - h.lasttime
if diff > 5 {
mutex.Lock()
h.lasttime = now
areas, err := areasparser.ParseFile(AREAS_FILENAME)
if err != nil {
resp.WriteHeader(500)
resp.Write([]byte(err.Error()))
return
}
h.cache = areas
mutex.Unlock()
}
resp.Header().Add("content-type", "application/json")
json.NewEncoder(resp).Encode(h.cache)
}