Close voice connections when Close() is called

This commit is contained in:
Matthew Penner 2020-05-13 14:43:00 -06:00
parent adb23eeb8e
commit 60346f23bb
1 changed files with 63 additions and 0 deletions

View File

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