Prevent heartbeat from sending on nil websocket.

This commit is contained in:
Chris Rhodes 2016-01-21 11:15:44 -08:00
parent d6d6c749ea
commit ddddfa3644

View file

@ -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