mirror of
https://github.com/diamondburned/arikawa.git
synced 2025-01-06 04:07:18 +00:00
Close voice connections when Close() is called
This commit is contained in:
parent
adb23eeb8e
commit
60346f23bb
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue