mirror of
https://github.com/AynaLivePlayer/AynaLivePlayer.git
synced 2025-12-06 10:22:50 +08:00
89 lines
1.7 KiB
Go
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,
|
|
})
|
|
}
|