aboutsummaryrefslogtreecommitdiff
path: root/pkg/discord
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/discord')
-rw-r--r--pkg/discord/gateway.go25
1 files changed, 18 insertions, 7 deletions
diff --git a/pkg/discord/gateway.go b/pkg/discord/gateway.go
index cfabdc7..13726b7 100644
--- a/pkg/discord/gateway.go
+++ b/pkg/discord/gateway.go
@@ -31,6 +31,7 @@ type GatewayImpl struct {
logger *zerolog.Logger
conn *cancellablewebsocket.CancellableWebSocket
eventHandler EventHandler
+ lastSeq uint64
}
func NewGateway(logger *zerolog.Logger, eventHandler EventHandler) *GatewayImpl {
@@ -39,6 +40,7 @@ func NewGateway(logger *zerolog.Logger, eventHandler EventHandler) *GatewayImpl
logger: logger,
conn: nil,
eventHandler: eventHandler,
+ lastSeq: 0,
}
}
@@ -61,7 +63,7 @@ func (g *GatewayImpl) Close() error {
func (g *GatewayImpl) Hello() (GatewayHelloEvent, error) {
var msg GatewayPayload[GatewayHelloEvent]
- if err := g.receive(&msg); err != nil {
+ if err := receive(g, &msg); err != nil {
return GatewayHelloEvent{}, err
}
@@ -92,7 +94,7 @@ func (g *GatewayImpl) Identify(token string) error {
}
var res GatewayPayload[GatewayReadyEvent]
- if err := g.receive(&res); err != nil {
+ if err := receive(g, &res); err != nil {
return err
}
@@ -112,7 +114,7 @@ func (g *GatewayImpl) Identify(token string) error {
func (g *GatewayImpl) Listen() {
for {
var msg GatewayPayload[json.RawMessage]
- if err := g.receive(&msg); err != nil {
+ if err := receive(g, &msg); err != nil {
g.logger.Error().Err(err).Msgf("error reading message")
continue
}
@@ -165,10 +167,19 @@ func (g *GatewayImpl) onDispatch(eventName string, body json.RawMessage) error {
return nil
}
-func (g *GatewayImpl) receive(res interface{}) error {
- return g.conn.ReadJSON(res)
+func (g *GatewayImpl) send(payload any) error {
+ return g.conn.WriteJSON(payload)
}
-func (g *GatewayImpl) send(payload interface{}) error {
- return g.conn.WriteJSON(payload)
+func receive[D any](g *GatewayImpl, res *GatewayPayload[D]) error {
+ err := g.conn.ReadJSON(&res)
+ if err != nil {
+ return err
+ }
+
+ if res.Sequence != 0 {
+ g.lastSeq = res.Sequence
+ }
+
+ return nil
}