From 60346f23bbff9d0d393d494c3dda18c32252125f Mon Sep 17 00:00:00 2001 From: Matthew Penner Date: Wed, 13 May 2020 14:43:00 -0600 Subject: [PATCH 1/3] Close voice connections when Close() is called --- voice/voice.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/voice/voice.go b/voice/voice.go index 0eb0279..be2b82e 100644 --- a/voice/voice.go +++ b/voice/voice.go @@ -6,6 +6,7 @@ package voice import ( "log" + "strconv" "sync" "github.com/diamondburned/arikawa/discord" @@ -137,3 +138,65 @@ func (v *Voice) JoinChannel(gID, cID discord.Snowflake, muted, deafened bool) (* // Connect. return conn, conn.JoinChannel(gID, cID, muted, deafened) } + +type CloseError struct { + SessionErrors map[discord.Snowflake]error + StateErr error +} + +func (e *CloseError) HasError() bool { + if e.StateErr != nil { + return true + } + + for _, err := range e.SessionErrors { + if err == nil { + continue + } + + return true + } + + return false +} + +func (e *CloseError) Error() string { + if e.StateErr != nil { + return e.StateErr.Error() + } + + var errorCount int + for _, err := range e.SessionErrors { + if err == nil { + continue + } + + errorCount++ + } + + if errorCount < 1 { + return "" + } + + return strconv.Itoa(errorCount) + " voice sessions returned errors while attempting to disconnect" +} + +func (v *Voice) Close() error { + err := &CloseError{ + SessionErrors: make(map[discord.Snowflake]error), + } + + v.mapmutex.Lock() + defer v.mapmutex.Unlock() + + for gID, s := range v.sessions { + err.SessionErrors[gID] = s.Disconnect() + } + + err.StateErr = v.State.Close() + if err.HasError() { + return err + } + + return nil +} From 3aa92c8f059c86f31fbec72e64ac1f7f9561dcb3 Mon Sep 17 00:00:00 2001 From: Matthew Penner Date: Wed, 13 May 2020 15:38:07 -0600 Subject: [PATCH 2/3] Only add the guild to SessionErrors if the error is not nil --- voice/voice.go | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/voice/voice.go b/voice/voice.go index be2b82e..a0ec3ce 100644 --- a/voice/voice.go +++ b/voice/voice.go @@ -149,15 +149,7 @@ func (e *CloseError) HasError() bool { return true } - for _, err := range e.SessionErrors { - if err == nil { - continue - } - - return true - } - - return false + return len(e.SessionErrors) > 0 } func (e *CloseError) Error() string { @@ -165,20 +157,11 @@ func (e *CloseError) Error() string { return e.StateErr.Error() } - var errorCount int - for _, err := range e.SessionErrors { - if err == nil { - continue - } - - errorCount++ - } - - if errorCount < 1 { + if len(e.SessionErrors) < 1 { return "" } - return strconv.Itoa(errorCount) + " voice sessions returned errors while attempting to disconnect" + return strconv.Itoa(len(e.SessionErrors)) + " voice sessions returned errors while attempting to disconnect" } func (v *Voice) Close() error { @@ -190,7 +173,9 @@ func (v *Voice) Close() error { defer v.mapmutex.Unlock() for gID, s := range v.sessions { - err.SessionErrors[gID] = s.Disconnect() + if dErr := s.Disconnect(); dErr != nil { + err.SessionErrors[gID] = dErr + } } err.StateErr = v.State.Close() From 592d2f71722cca0c352ee2a0c334357c7072f4c5 Mon Sep 17 00:00:00 2001 From: Matthew Penner Date: Wed, 13 May 2020 15:51:26 -0600 Subject: [PATCH 3/3] Fix null snowflakes being formatted as 18446744073709551615 --- discord/snowflake.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/discord/snowflake.go b/discord/snowflake.go index 9616e4e..7ac8674 100644 --- a/discord/snowflake.go +++ b/discord/snowflake.go @@ -61,6 +61,10 @@ func (s Snowflake) MarshalJSON() ([]byte, error) { } func (s Snowflake) String() string { + if s == NullSnowflake { + return "" + } + return strconv.FormatUint(uint64(s), 10) }