diff --git a/wsapi.go b/wsapi.go index 0199f13..342efdd 100644 --- a/wsapi.go +++ b/wsapi.go @@ -204,7 +204,7 @@ func (s *Session) event(messageType int, message []byte) (err error) { case "READY": var st *Ready if err = unmarshalEvent(e, &st); err == nil { - go s.heartbeat(st.HeartbeatInterval) + go s.heartbeat(s.wsConn, s.listening, st.HeartbeatInterval) if s.StateEnabled { s.State.OnReady(st) } @@ -554,32 +554,25 @@ type heartbeatOp struct { Data int `json:"d"` } -func (s *Session) sendHeartbeat() error { - return s.wsConn.WriteJSON(heartbeatOp{1, int(time.Now().Unix())}) +func (s *Session) sendHeartbeat(wsConn *websocket.Conn) error { + return wsConn.WriteJSON(heartbeatOp{1, int(time.Now().Unix())}) } // heartbeat sends regular heartbeats to Discord so it knows the client // is still connected. If you do not send these heartbeats Discord will // disconnect the websocket connection after a few seconds. -func (s *Session) heartbeat(i time.Duration) { - s.Lock() - - // We have been closed between the first Ready event, abort. - if s.listening == nil { - s.Unlock() +func (s *Session) heartbeat(wsConn *websocket.Conn, listening <-chan interface{}, i time.Duration) { + if listening == nil || wsConn == nil { return } - // Keep a reference, as s.listening can be nilled out. - listening := s.listening - + s.Lock() s.DataReady = true - s.Unlock() // Send first heartbeat immediately because lag could put the // first heartbeat outside the required heartbeat interval window. - err := s.sendHeartbeat() + err := s.sendHeartbeat(wsConn) if err != nil { fmt.Println("Error sending initial heartbeat:", err) return @@ -589,7 +582,7 @@ func (s *Session) heartbeat(i time.Duration) { for { select { case <-ticker.C: - err := s.sendHeartbeat() + err := s.sendHeartbeat(wsConn) if err != nil { fmt.Println("Error sending heartbeat:", err) return