diff options
Diffstat (limited to 'downloader/download_manager.go')
| -rw-r--r-- | downloader/download_manager.go | 82 |
1 files changed, 47 insertions, 35 deletions
diff --git a/downloader/download_manager.go b/downloader/download_manager.go index c0ceecb..16054ae 100644 --- a/downloader/download_manager.go +++ b/downloader/download_manager.go @@ -12,6 +12,7 @@ const ( Clear DlMessage = iota Pause Play + Skip ) type playBundle struct { @@ -43,50 +44,61 @@ func NewManager(s *discordgo.Session, guildID string, voiceChanID string) *Downl } func (m *DownloadManager) playFromQueue() { - for dl := range m.dls { - conn, err := m.session.ChannelVoiceJoin(m.guildID, m.voiceID, false, false) - if err != nil { - log.Errorf("unable to connect to the voice channel: %q", err) - time.Sleep(1 * time.Second) - break - } + for { + select { + case <-m.PlayState: // ignore play state updates while not playing anything + case dl := <-m.dls: + conn, err := m.session.ChannelVoiceJoin(m.guildID, m.voiceID, false, false) + if err != nil { + log.Errorf("unable to connect to the voice channel: %q", err) + time.Sleep(1 * time.Second) + break + } - out, _ := dl.Start() + m.session.UpdateStatus(0, dl.info.Url.Host) + out := dl.Start() - playState := Play - conn.Speaking(true) + playState := Play + conn.Speaking(true) - cleanup := func() { - conn.Speaking(false) - conn.Disconnect() - } + cleanup := func() { + conn.Speaking(false) + conn.Disconnect() + m.session.UpdateStatus(0, "literally nothing") + } - inner: - for { - switch playState { - case Clear: - for { - select { - case <-m.PlayState: - default: - } - } - break inner - case Pause: - playState = <-m.PlayState - case Play: - select { // first check if we have a state update message coming in - case playState = <-m.PlayState: - case elem, ok := <-out: - if !ok { - break inner + inner: + for { + switch playState { + case Clear: + dl.Stop() + for { + select { + case dl := <-m.dls: + dl.Stop() + dl.Start() // this is a hacky way of ensuring all the wavs are closed and cleaned up + default: + } } + break inner + case Skip: + break inner + case Pause: + playState = <-m.PlayState + case Play: + select { // first check if we have a state update message coming in + case playState = <-m.PlayState: + case elem, ok := <-out: + if !ok { + break inner + } - conn.OpusSend <- elem + conn.OpusSend <- elem + } } } + cleanup() } - cleanup() } } |
