Clean up ordering of internal handlers. (#285)
This commit is contained in:
parent
c5a94de19c
commit
c352d7016c
3 changed files with 29 additions and 13 deletions
30
discord.go
30
discord.go
|
@ -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)
|
||||
|
|
6
state.go
6
state.go
|
@ -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
|
||||
}
|
||||
|
|
6
wsapi.go
6
wsapi.go
|
@ -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")
|
||||
|
||||
|
|
Loading…
Reference in a new issue