From 6ec1c07300c6588e1811898930d46f2354c264e0 Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Thu, 10 Mar 2016 19:15:30 -0800 Subject: [PATCH 1/2] Clean up voice state updates, make them goroutine safe. --- state.go | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/state.go b/state.go index ab0e0c2..17033b2 100644 --- a/state.go +++ b/state.go @@ -460,40 +460,32 @@ func (s *State) MessageRemove(message *Message) error { return errors.New("Message not found.") } -func (s *State) VoiceStateUpdate(update *VoiceStateUpdate) error { - var exists bool - var guild *Guild - - for _, guild = range s.Guilds { - if guild.ID == update.GuildID { - exists = true - break - } +func (s *State) voiceStateUpdate(update *VoiceStateUpdate) error { + guild, err := s.Guild(update.GuildID) + if err != nil { + return err } - if !exists { - return nil - } + s.Lock() + defer s.Unlock() // Handle Leaving Channel if update.ChannelID == "" { for i, state := range guild.VoiceStates { if state.UserID == update.UserID { guild.VoiceStates = append(guild.VoiceStates[:i], guild.VoiceStates[i+1:]...) + return nil } } } else { - exists := false - for _, state := range guild.VoiceStates { + for i, state := range guild.VoiceStates { if state.UserID == update.UserID { - state.ChannelID = update.ChannelID - exists = true + guild.VoiceStates[i] = update.VoiceState + return nil } } - if !exists { - guild.VoiceStates = append(guild.VoiceStates, update.VoiceState) - } + guild.VoiceStates = append(guild.VoiceStates, update.VoiceState) } return nil @@ -561,7 +553,7 @@ func (s *State) onInterface(se *Session, i interface{}) (err error) { case *MessageDelete: err = s.MessageRemove(t.Message) case *VoiceStateUpdate: - err = s.VoiceStateUpdate(t) + err = s.voiceStateUpdate(t) } return From 60b801db278517790eef469df9d4d46eff780ed2 Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Thu, 10 Mar 2016 22:02:59 -0800 Subject: [PATCH 2/2] Support the new bot field on User. --- structs.go | 1 + 1 file changed, 1 insertion(+) diff --git a/structs.go b/structs.go index cee6b16..1cf2dfa 100644 --- a/structs.go +++ b/structs.go @@ -241,6 +241,7 @@ type User struct { Avatar string `json:"Avatar"` Verified bool `json:"verified"` Discriminator string `json:"discriminator"` + Bot bool `json:"bot"` } // A Settings stores data for a specific users Discord client settings.