mirror of
https://github.com/diamondburned/arikawa.git
synced 2024-11-01 04:24:19 +00:00
17b9c73ce3
This commit refactors the whole package gateway as well as utils/ws (formerly utils/wsutil) and voice/voicegateway. The new refactor utilizes a design pattern involving a concurrent loop and an arriving event channel. An additional change was made to the way gateway events are typed. Before, pretty much any type will satisfy a gateway event type, since the actual type was just interface{}. The new refactor defines a concrete interface that events can implement: type Event interface { Op() OpCode EventType() EventType } Using this interface, the user can easily add custom gateway events independently of the library without relying on string maps. This adds a lot of type safety into the library and makes type-switching on Event types much more reasonable. Gateway error callbacks are also almost entirely removed in favor of custom gateway events. A catch-all can easily be added like this: s.AddHandler(func(err error) { log.Println("gateway error:, err") })
36 lines
918 B
Go
36 lines
918 B
Go
// Package ophandler provides an Op channel reader that redistributes the events
|
|
// into handlers.
|
|
package ophandler
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/diamondburned/arikawa/v3/utils/handler"
|
|
"github.com/diamondburned/arikawa/v3/utils/ws"
|
|
)
|
|
|
|
// Loop starts a background goroutine that starts reading from src and
|
|
// distributes received events into the given handler. It's stopped once src is
|
|
// closed. The returned channel will be closed once src is closed.
|
|
func Loop(src <-chan ws.Op, dst *handler.Handler) <-chan struct{} {
|
|
done := make(chan struct{})
|
|
go func() {
|
|
for op := range src {
|
|
dst.Call(op.Data)
|
|
}
|
|
close(done)
|
|
}()
|
|
return done
|
|
}
|
|
|
|
// WaitForDone waits for the done channel returned by Loop until the channel is
|
|
// closed or the context expires.
|
|
func WaitForDone(ctx context.Context, done <-chan struct{}) error {
|
|
select {
|
|
case <-ctx.Done():
|
|
return ctx.Err()
|
|
case <-done:
|
|
return nil
|
|
}
|
|
}
|