// Play a sound func PlaySound(s *discordgo.Session, play *Play, vc *discordgo.VoiceConnection) (err error) { log.WithFields(log.Fields{ "play": play, }).Info("Playing sound") if vc == nil { vc, err = s.ChannelVoiceJoin(play.GuildID, play.ChannelID, false, false) // vc.Receive = false if err != nil { log.WithFields(log.Fields{ "error": err, }).Error("Failed to play sound") delete(queues, play.GuildID) return err } } // If we need to change channels, do that now if vc.ChannelID != play.ChannelID { vc.ChangeChannel(play.ChannelID, false, false) time.Sleep(time.Millisecond * 125) } // // Track stats for this play in redis // go rdTrackSoundStats(play) // Sleep for a specified amount of time before playing the sound time.Sleep(time.Millisecond * 32) // Play the sound play.Sound.Play(vc) // If this is chained, play the chained sound if play.Next != nil { PlaySound(s, play.Next, vc) } // If there is another song in the queue, recurse and play that if len(queues[play.GuildID]) > 0 { play := <-queues[play.GuildID] PlaySound(s, play, vc) return nil } // If the queue is empty, delete it time.Sleep(time.Millisecond * time.Duration(play.Sound.PartDelay)) delete(queues, play.GuildID) vc.Disconnect() return nil }