Files
AynaLivePlayer/event/event.go
2022-06-21 13:02:22 -07:00

89 lines
1.7 KiB
Go

package event
import (
"AynaLivePlayer/logger"
"github.com/sirupsen/logrus"
"sync"
)
type EventId string
const MODULE_HANDLER = "EventHandler"
var eventLogger = logger.Logger.WithFields(logrus.Fields{
"Module": MODULE_HANDLER,
})
type Event struct {
Id EventId
Cancelled bool
Data interface{}
}
type EventHandlerFunc func(event *Event)
type EventHandler struct {
EventId EventId
Name string
Handler EventHandlerFunc
}
type Handler struct {
handlers map[string]*EventHandler
lock sync.RWMutex
}
func NewHandler() *Handler {
return &Handler{
handlers: make(map[string]*EventHandler),
}
}
func (h *Handler) Register(handler *EventHandler) {
h.lock.Lock()
defer h.lock.Unlock()
eventLogger.Tracef("register new handler id=%s,name=%s", handler.EventId, handler.Name)
h.handlers[handler.Name] = handler
}
func (h *Handler) RegisterA(id EventId, name string, handler EventHandlerFunc) {
h.Register(&EventHandler{
EventId: id,
Name: name,
Handler: handler,
})
}
func (h *Handler) UnregisterAll() {
h.lock.Lock()
defer h.lock.Unlock()
eventLogger.Trace("clear all handler")
h.handlers = make(map[string]*EventHandler)
}
func (h *Handler) Unregister(name string) {
h.lock.Lock()
defer h.lock.Unlock()
eventLogger.Tracef("unregister handler name=%s", name)
delete(h.handlers, name)
}
func (h *Handler) Call(event *Event) {
h.lock.RLock()
defer h.lock.RUnlock()
for _, eh := range h.handlers {
if eh.EventId == event.Id {
eventLogger.Tracef("handler name=%s called by event_id = %s", event.Id, eh.Name)
// todo: @3
go eh.Handler(event)
}
}
}
func (h *Handler) CallA(id EventId, data interface{}) {
h.Call(&Event{
Id: id,
Data: data,
})
}