From b915ec065ae4b90d5a10c0f4bba15401e1c4b8d6 Mon Sep 17 00:00:00 2001 From: Mitchell Gerber Date: Tue, 4 Jul 2017 15:49:56 -0500 Subject: [PATCH] fix bug where voice stops if bot is dismissed during sound clip --- .gitignore | 2 ++ server/bothandlers/sounds.go | 26 ++++++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 59bb9b6..d995b8f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ yarn-error* vendor bot sounds +debug + diff --git a/server/bothandlers/sounds.go b/server/bothandlers/sounds.go index c45cf77..8aa26f5 100644 --- a/server/bothandlers/sounds.go +++ b/server/bothandlers/sounds.go @@ -12,6 +12,7 @@ import ( "runtime" "strconv" "strings" + "sync" "time" "layeh.com/gopus" @@ -32,11 +33,13 @@ const ( var activeConnections = make(map[string]*audioConnection) type audioConnection struct { - guild *discordgo.Guild - session *discordgo.Session - sounds map[string]*audioClip - soundQueue chan string - voiceConnection *discordgo.VoiceConnection + guild *discordgo.Guild + session *discordgo.Session + sounds map[string]*audioClip + soundQueue chan string + voiceConnection *discordgo.VoiceConnection + soundPlayingLock bool + mutex *sync.Mutex // mutex for single audio connection } type audioClip struct { @@ -72,6 +75,7 @@ func SoundsHandler(s *discordgo.Session, m *discordgo.MessageCreate) { session: s, sounds: make(map[string]*audioClip, 0), soundQueue: make(chan string, maxSoundQueue), + mutex: &sync.Mutex{}, } activeConnections[c.GuildID] = newInstance @@ -106,7 +110,7 @@ func (conn *audioConnection) handleMessage(m *discordgo.MessageCreate) { } func (conn *audioConnection) dismiss() { - if conn.voiceConnection != nil { + if conn.voiceConnection != nil && !conn.soundPlayingLock && len(conn.soundQueue) == 0 { conn.voiceConnection.Disconnect() } } @@ -268,6 +272,8 @@ func (conn *audioConnection) playSounds() (err error) { for { newSoundName := <-conn.soundQueue + conn.toggleSoundPlayingLock(true) + if !conn.voiceConnection.Ready { continue } @@ -285,6 +291,14 @@ func (conn *audioConnection) playSounds() (err error) { // Sleep for a specificed amount of time before ending. time.Sleep(50 * time.Millisecond) + + conn.toggleSoundPlayingLock(false) } } + +func (conn *audioConnection) toggleSoundPlayingLock(playing bool) { + conn.mutex.Lock() + conn.soundPlayingLock = playing + conn.mutex.Unlock() +}