diff --git a/server/app/app.go b/server/app/app.go index 639a428..602abdc 100644 --- a/server/app/app.go +++ b/server/app/app.go @@ -3,7 +3,6 @@ package app import ( "mapserver/colormapping" "mapserver/db" - "mapserver/event" "mapserver/mapblockaccessor" "mapserver/mapblockrenderer" "mapserver/mapobjectdb" @@ -28,5 +27,4 @@ type App struct { Colormapping *colormapping.ColorMapping Mapblockrenderer *mapblockrenderer.MapBlockRenderer Tilerenderer *tilerenderer.TileRenderer - Events event.EventConsumer } diff --git a/server/event/eventconsumer.go b/server/event/eventconsumer.go deleted file mode 100644 index ed8f30e..0000000 --- a/server/event/eventconsumer.go +++ /dev/null @@ -1,5 +0,0 @@ -package event - -type EventConsumer interface { - SendJSON(eventtype string, o interface{}) -} diff --git a/server/eventbus/eventbus.go b/server/eventbus/eventbus.go index 478d3ad..4c07f88 100644 --- a/server/eventbus/eventbus.go +++ b/server/eventbus/eventbus.go @@ -4,6 +4,11 @@ import ( "sync" ) +const ( + MAPBLOCK_RENDERED = "mapblock-rendered" + TILE_RENDERED = "rendered-tile" +) + type Listener interface { OnEvent(eventtype string, o interface{}) } diff --git a/server/mapblockaccessor/mapblockaccessor.go b/server/mapblockaccessor/mapblockaccessor.go index b0e42ab..652d664 100644 --- a/server/mapblockaccessor/mapblockaccessor.go +++ b/server/mapblockaccessor/mapblockaccessor.go @@ -4,8 +4,10 @@ import ( "fmt" "mapserver/coords" "mapserver/db" + "mapserver/eventbus" "mapserver/layer" "mapserver/mapblockparser" + "time" cache "github.com/patrickmn/go-cache" @@ -13,13 +15,9 @@ import ( ) type MapBlockAccessor struct { - accessor db.DBAccessor - c *cache.Cache - listeners []MapBlockListener -} - -type MapBlockListener interface { - OnParsedMapBlock(block *mapblockparser.MapBlock) + accessor db.DBAccessor + c *cache.Cache + Eventbus *eventbus.Eventbus } func getKey(pos coords.MapBlockCoords) string { @@ -29,13 +27,12 @@ func getKey(pos coords.MapBlockCoords) string { func NewMapBlockAccessor(accessor db.DBAccessor) *MapBlockAccessor { c := cache.New(500*time.Millisecond, 1000*time.Millisecond) - return &MapBlockAccessor{accessor: accessor, c: c} + return &MapBlockAccessor{ + accessor: accessor, + c: c, + Eventbus: eventbus.New(), + } } - -func (a *MapBlockAccessor) AddListener(l MapBlockListener) { - a.listeners = append(a.listeners, l) -} - func (a *MapBlockAccessor) Update(pos coords.MapBlockCoords, mb *mapblockparser.MapBlock) { key := getKey(pos) a.c.Set(key, mb, cache.DefaultExpiration) @@ -102,9 +99,7 @@ func (a *MapBlockAccessor) FindMapBlocksByMtime(lastmtime int64, limit int, laye return nil, err } - for _, listener := range a.listeners { - listener.OnParsedMapBlock(mapblock) - } + a.Eventbus.Emit(eventbus.MAPBLOCK_RENDERED, mapblock) a.c.Set(key, mapblock, cache.DefaultExpiration) mblist = append(mblist, mapblock) @@ -172,9 +167,7 @@ func (a *MapBlockAccessor) FindMapBlocksByPos(lastpos coords.MapBlockCoords, lim return nil, err } - for _, listener := range a.listeners { - listener.OnParsedMapBlock(mapblock) - } + a.Eventbus.Emit(eventbus.MAPBLOCK_RENDERED, mapblock) a.c.Set(key, mapblock, cache.DefaultExpiration) mblist = append(mblist, mapblock) @@ -209,9 +202,7 @@ func (a *MapBlockAccessor) GetMapBlock(pos coords.MapBlockCoords) (*mapblockpars return nil, err } - for _, listener := range a.listeners { - listener.OnParsedMapBlock(mapblock) - } + a.Eventbus.Emit(eventbus.MAPBLOCK_RENDERED, mapblock) a.c.Set(key, mapblock, cache.DefaultExpiration) diff --git a/server/mapblockrenderer/renderer.go b/server/mapblockrenderer/renderer.go index d3b6893..fb34043 100644 --- a/server/mapblockrenderer/renderer.go +++ b/server/mapblockrenderer/renderer.go @@ -20,7 +20,11 @@ type MapBlockRenderer struct { } func NewMapBlockRenderer(accessor *mapblockaccessor.MapBlockAccessor, colors *colormapping.ColorMapping) *MapBlockRenderer { - return &MapBlockRenderer{accessor: accessor, colors: colors, enableShadow: true} + return &MapBlockRenderer{ + accessor: accessor, + colors: colors, + enableShadow: true, + } } const ( diff --git a/server/mapobject/setup.go b/server/mapobject/setup.go index 694f636..3b32c7a 100644 --- a/server/mapobject/setup.go +++ b/server/mapobject/setup.go @@ -2,6 +2,7 @@ package mapobject import ( "mapserver/app" + "mapserver/eventbus" "mapserver/mapblockparser" ) @@ -9,7 +10,13 @@ type Listener struct { ctx *app.App } -func (this *Listener) OnParsedMapBlock(block *mapblockparser.MapBlock) { +func (this *Listener) OnEvent(eventtype string, o interface{}) { + if eventtype != eventbus.MAPBLOCK_RENDERED { + return + } + + block := o.(*mapblockparser.MapBlock) + err := this.ctx.Objectdb.RemoveMapData(&block.Pos) if err != nil { panic(err) @@ -23,5 +30,5 @@ func (this *Listener) OnParsedMapBlock(block *mapblockparser.MapBlock) { } func Setup(ctx *app.App) { - ctx.BlockAccessor.AddListener(&Listener{ctx: ctx}) + ctx.BlockAccessor.Eventbus.AddListener(&Listener{ctx: ctx}) } diff --git a/server/tilerenderer/renderer.go b/server/tilerenderer/renderer.go index 7673492..f6e3549 100644 --- a/server/tilerenderer/renderer.go +++ b/server/tilerenderer/renderer.go @@ -8,6 +8,7 @@ import ( "image/png" "mapserver/coords" "mapserver/db" + "mapserver/eventbus" "mapserver/layer" "mapserver/mapblockrenderer" "mapserver/mapobjectdb" @@ -22,11 +23,7 @@ type TileRenderer struct { layers []layer.Layer tdb mapobjectdb.DBAccessor dba db.DBAccessor - listeners []TileListener -} - -type TileListener interface { - OnRenderedTile(tc *coords.TileCoords) + Eventbus *eventbus.Eventbus } func NewTileRenderer(mapblockrenderer *mapblockrenderer.MapBlockRenderer, @@ -39,6 +36,7 @@ func NewTileRenderer(mapblockrenderer *mapblockrenderer.MapBlockRenderer, layers: layers, tdb: tdb, dba: dba, + Eventbus: eventbus.New(), } } @@ -46,10 +44,6 @@ const ( IMG_SIZE = 256 ) -func (tr *TileRenderer) AddListener(l TileListener) { - tr.listeners = append(tr.listeners, l) -} - func (tr *TileRenderer) Render(tc *coords.TileCoords, recursionDepth int) ([]byte, error) { //Check cache @@ -252,9 +246,7 @@ func (tr *TileRenderer) RenderImage(tc *coords.TileCoords, recursionDepth int) ( } log.WithFields(fields).Debug("Cross stitch") - for _, listener := range tr.listeners { - listener.OnRenderedTile(tc) - } + tr.Eventbus.Emit(eventbus.TILE_RENDERED, tc) return img, buf.Bytes(), nil } diff --git a/server/web/serve.go b/server/web/serve.go index 2ca1442..1495ab7 100644 --- a/server/web/serve.go +++ b/server/web/serve.go @@ -25,13 +25,9 @@ func Serve(ctx *app.App) { ws := NewWS(ctx) mux.Handle("/api/ws", ws) - ctx.Events = ws - ctx.Tilerenderer.AddListener(ws) + ctx.Tilerenderer.Eventbus.AddListener(ws) if ctx.Config.WebApi.EnableMapblock { - //websocket listener - ctx.BlockAccessor.AddListener(ws) - //mapblock endpoint mux.Handle("/api/mapblock/", &MapblockHandler{ctx: ctx}) } diff --git a/server/web/ws.go b/server/web/ws.go index 8d57b59..01c97da 100644 --- a/server/web/ws.go +++ b/server/web/ws.go @@ -4,8 +4,6 @@ import ( "bytes" "encoding/json" "mapserver/app" - "mapserver/coords" - "mapserver/mapblockparser" "math/rand" "net/http" "sync" @@ -32,15 +30,7 @@ var upgrader = websocket.Upgrader{ WriteBufferSize: 1024, } -func (t *WS) OnParsedMapBlock(block *mapblockparser.MapBlock) { - t.SendJSON("parsed-mapblock", block) -} - -func (t *WS) OnRenderedTile(tc *coords.TileCoords) { - t.SendJSON("rendered-tile", tc) -} - -func (t *WS) SendJSON(eventtype string, o interface{}) { +func (t *WS) OnEvent(eventtype string, o interface{}) { data, err := json.Marshal(o) if err != nil { panic(err)