Clean up ordering of internal handlers. (#285)

This commit is contained in:
Chris Rhodes 2016-11-12 11:50:06 -08:00 committed by GitHub
parent c5a94de19c
commit c352d7016c
3 changed files with 29 additions and 13 deletions

View file

@ -207,6 +207,8 @@ func (s *Session) handle(event interface{}) {
handlerParameters := []reflect.Value{reflect.ValueOf(s), reflect.ValueOf(event)}
s.onInterface(event)
if handlers, ok := s.handlers[nil]; ok {
for _, handler := range handlers {
go handler.Call(handlerParameters)
@ -226,24 +228,32 @@ func (s *Session) initialize() {
s.log(LogInformational, "called")
s.handlersMu.Lock()
defer s.handlersMu.Unlock()
if s.handlers != nil {
s.handlersMu.Unlock()
return
}
s.handlers = map[interface{}][]reflect.Value{}
s.handlersMu.Unlock()
}
s.AddHandler(s.onReady)
s.AddHandler(s.onResumed)
s.AddHandler(s.onVoiceServerUpdate)
s.AddHandler(s.onVoiceStateUpdate)
s.AddHandler(s.State.onReady)
s.AddHandler(s.State.onInterface)
// onInterface handles all internal events and routes them to the appropriate internal handler.
func (s *Session) onInterface(i interface{}) {
switch t := i.(type) {
case *Ready:
s.onReady(t)
case *Resumed:
s.onResumed(t)
case *VoiceServerUpdate:
go s.onVoiceServerUpdate(t)
case *VoiceStateUpdate:
go s.onVoiceStateUpdate(t)
}
s.State.onInterface(s, i)
}
// onReady handles the ready event.
func (s *Session) onReady(se *Session, r *Ready) {
func (s *Session) onReady(r *Ready) {
// Store the SessionID within the Session struct.
s.sessionID = r.SessionID
@ -253,7 +263,7 @@ func (s *Session) onReady(se *Session, r *Ready) {
}
// onResumed handles the resumed event.
func (s *Session) onResumed(se *Session, r *Resumed) {
func (s *Session) onResumed(r *Resumed) {
// Start the heartbeat to keep the connection alive.
go s.heartbeat(s.wsConn, s.listening, r.HeartbeatInterval)

View file

@ -639,6 +639,12 @@ func (s *State) onInterface(se *Session, i interface{}) (err error) {
if s == nil {
return ErrNilState
}
r, ok := i.(*Ready)
if ok {
return s.onReady(se, r)
}
if !se.StateEnabled {
return nil
}

View file

@ -509,7 +509,7 @@ func (s *Session) ChannelVoiceJoin(gID, cID string, mute, deaf bool) (voice *Voi
}
// onVoiceStateUpdate handles Voice State Update events on the data websocket.
func (s *Session) onVoiceStateUpdate(se *Session, st *VoiceStateUpdate) {
func (s *Session) onVoiceStateUpdate(st *VoiceStateUpdate) {
// If we don't have a connection for the channel, don't bother
if st.ChannelID == "" {
@ -523,7 +523,7 @@ func (s *Session) onVoiceStateUpdate(se *Session, st *VoiceStateUpdate) {
}
// We only care about events that are about us.
if se.State.User.ID != st.UserID {
if s.State.User.ID != st.UserID {
return
}
@ -537,7 +537,7 @@ func (s *Session) onVoiceStateUpdate(se *Session, st *VoiceStateUpdate) {
// This is also fired if the Guild's voice region changes while connected
// to a voice channel. In that case, need to re-establish connection to
// the new region endpoint.
func (s *Session) onVoiceServerUpdate(se *Session, st *VoiceServerUpdate) {
func (s *Session) onVoiceServerUpdate(st *VoiceServerUpdate) {
s.log(LogInformational, "called")