Handle node removal better to ensure players aren't used if there's no node

This commit is contained in:
Tyler 2020-06-21 22:53:33 -04:00
parent 169cc4f563
commit d99e202995
4 changed files with 24 additions and 9 deletions

1
go.mod
View File

@ -1,6 +1,7 @@
module meow.tf/astra/gavalink
require (
github.com/bwmarrin/discordgo v0.20.3 // indirect
github.com/foxbot/gavalink v0.0.0-20181105223750-6252b1245300
github.com/gorilla/websocket v1.4.0
github.com/valyala/fastjson v1.4.1

4
go.sum
View File

@ -1,6 +1,10 @@
github.com/bwmarrin/discordgo v0.20.3 h1:AxjcHGbyBFSC0a3Zx5nDQwbOjU7xai5dXjRnZ0YB7nU=
github.com/bwmarrin/discordgo v0.20.3/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q=
github.com/foxbot/gavalink v0.0.0-20181105223750-6252b1245300 h1:/p4AzwhPqvi9V0Ktsd+4jpkTpkLbrns2AyCUrylJFDo=
github.com/foxbot/gavalink v0.0.0-20181105223750-6252b1245300/go.mod h1:MDlIQ50PLaU0fUW0JcHFOxec8Q17F9byrnGi8ok5vVQ=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/valyala/fastjson v1.4.1 h1:hrltpHpIpkaxll8QltMU8c3QZ5+qIiCL8yKqPFJI/yE=
github.com/valyala/fastjson v1.4.1/go.mod h1:nV6MsjxL2IMJQUoHDIrjEI7oLyeqK6aBD7EFWPsvP8o=
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16 h1:y6ce7gCWtnH+m3dCjzQ1PCuwl28DDIc3VNnvY29DlIA=
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=

View File

@ -117,12 +117,17 @@ func (l *Lavalink) removeNode(node *Node) error {
node.stop()
danglingPlayers := make([]*Player, 0)
l.playersMu.RLock()
for _, player := range l.players {
if player.node == node {
player.node = nil
n, err := l.BestNode()
if err != nil {
if err != nil || n == nil {
danglingPlayers = append(danglingPlayers, player)
continue
}
@ -131,6 +136,12 @@ func (l *Lavalink) removeNode(node *Node) error {
}
l.playersMu.RUnlock()
if len(danglingPlayers) > 0 {
for _, player := range danglingPlayers {
player.Destroy()
}
}
// temp var for easier reading
n := l.nodes
z := len(n) - 1

View File

@ -191,15 +191,14 @@ func (player *Player) ChangeNode(node *Node) error {
// Destroy will destroy this player
func (player *Player) Destroy() error {
if player.node != nil && player.node.wsConn != nil {
msg := basicMessage{
Op: opDestroy,
GuildID: player.guildID,
}
err := player.node.wsConn.WriteJSON(msg)
if err != nil {
return err
// We don't actually care if this goes through, since the node/connection may be invalid anyway.
player.node.wsConn.WriteJSON(msg)
}
player.manager.playersMu.Lock()