mirror of https://github.com/Hilbis/Hilbish
feat: add once listeners, ability to remove listeners and remove listener on error
parent
ea2791859c
commit
e4110fa4bc
|
@ -13,10 +13,11 @@ const (
|
||||||
luaListener
|
luaListener
|
||||||
)
|
)
|
||||||
|
|
||||||
type Recoverer func(event string, handler, err interface{})
|
type Recoverer func(event string, handler *Listener, err interface{})
|
||||||
|
|
||||||
type Listener struct{
|
type Listener struct{
|
||||||
typ listenerType
|
typ listenerType
|
||||||
|
once bool
|
||||||
caller func(...interface{})
|
caller func(...interface{})
|
||||||
luaCaller *rt.Closure
|
luaCaller *rt.Closure
|
||||||
}
|
}
|
||||||
|
@ -74,6 +75,10 @@ func (b *Bait) Emit(event string, args ...interface{}) {
|
||||||
} else {
|
} else {
|
||||||
handle.caller(args...)
|
handle.caller(args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if handle.once {
|
||||||
|
b.Off(event, handle)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,6 +102,38 @@ func (b *Bait) OnLua(event string, handler *rt.Closure) *Listener {
|
||||||
return listener
|
return listener
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Bait) Off(event string, listener *Listener) {
|
||||||
|
handles := b.handlers[event]
|
||||||
|
|
||||||
|
for i, handle := range handles {
|
||||||
|
if handle == listener {
|
||||||
|
b.handlers[event] = append(handles[:i], handles[i + 1:]...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bait) Once(event string, handler func(...interface{})) *Listener {
|
||||||
|
listener := &Listener{
|
||||||
|
typ: goListener,
|
||||||
|
once: true,
|
||||||
|
caller: handler,
|
||||||
|
}
|
||||||
|
b.addListener(event, listener)
|
||||||
|
|
||||||
|
return listener
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bait) OnceLua(event string, handler *rt.Closure) *Listener {
|
||||||
|
listener := &Listener{
|
||||||
|
typ: luaListener,
|
||||||
|
once: true,
|
||||||
|
luaCaller: handler,
|
||||||
|
}
|
||||||
|
b.addListener(event, listener)
|
||||||
|
|
||||||
|
return listener
|
||||||
|
}
|
||||||
|
|
||||||
func (b *Bait) SetRecoverer(recoverer Recoverer) {
|
func (b *Bait) SetRecoverer(recoverer Recoverer) {
|
||||||
b.recoverer = recoverer
|
b.recoverer = recoverer
|
||||||
}
|
}
|
||||||
|
@ -108,7 +145,8 @@ func (b *Bait) addListener(event string, listener *Listener) {
|
||||||
|
|
||||||
b.handlers[event] = append(b.handlers[event], listener)
|
b.handlers[event] = append(b.handlers[event], listener)
|
||||||
}
|
}
|
||||||
func (b *Bait) callRecoverer(event string, handler, err interface{}) {
|
|
||||||
|
func (b *Bait) callRecoverer(event string, handler *Listener, err interface{}) {
|
||||||
if b.recoverer == nil {
|
if b.recoverer == nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -204,9 +242,7 @@ func (b *Bait) bcatchOnce(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: add once
|
// todo: add once
|
||||||
b.On(name, func(args ...interface{}) {
|
b.OnceLua(name, catcher)
|
||||||
handleHook(t, c, name, catcher, args...)
|
|
||||||
})
|
|
||||||
|
|
||||||
return c.Next(), nil
|
return c.Next(), nil
|
||||||
}
|
}
|
||||||
|
|
3
lua.go
3
lua.go
|
@ -43,8 +43,9 @@ func luaInit() {
|
||||||
lib.LoadLibs(l, cmds.Loader)
|
lib.LoadLibs(l, cmds.Loader)
|
||||||
|
|
||||||
hooks = bait.New(l)
|
hooks = bait.New(l)
|
||||||
hooks.SetRecoverer(func(event string, handler, err interface{}) {
|
hooks.SetRecoverer(func(event string, handler *bait.Listener, err interface{}) {
|
||||||
fmt.Println("Error in", event, "event:", err)
|
fmt.Println("Error in", event, "event:", err)
|
||||||
|
hooks.Off(event, handler)
|
||||||
})
|
})
|
||||||
|
|
||||||
lib.LoadLibs(l, hooks.Loader)
|
lib.LoadLibs(l, hooks.Loader)
|
||||||
|
|
Loading…
Reference in New Issue