Doesn't leave when finished playing. Totaly stable, tested and proven closes #62

This commit is contained in:
Master Kwoth 2016-02-25 05:57:24 +01:00
parent f9a1ca0c50
commit ec0c3c86e0
4 changed files with 28 additions and 18 deletions

View File

@ -28,21 +28,30 @@ namespace NadekoBot.Classes.Music {
public MusicControls() { public MusicControls() {
Task.Run(async () => { Task.Run(async () => {
while (!Stopped) { while (true) {
if (CurrentSong == null) { if (!Stopped) {
if (SongQueue.Count > 0) if (CurrentSong == null) {
await LoadNextSong(); if (SongQueue.Count > 0)
await LoadNextSong();
}
else if (CurrentSong.State == StreamState.Completed || NextSong) {
NextSong = false;
await LoadNextSong();
}
} }
else if (CurrentSong.State == StreamState.Completed || NextSong) { else if (VoiceClient == null)
NextSong = false; break;
await LoadNextSong();
}
await Task.Delay(500); await Task.Delay(500);
} }
}); });
} }
internal void AddSong(StreamRequest streamRequest) {
Stopped = false;
this.SongQueue.Add(streamRequest);
}
public MusicControls(Channel voiceChannel, CommandEventArgs e, float? vol) : this() { public MusicControls(Channel voiceChannel, CommandEventArgs e, float? vol) : this() {
if (voiceChannel == null) if (voiceChannel == null)
throw new ArgumentNullException(nameof(voiceChannel)); throw new ArgumentNullException(nameof(voiceChannel));
@ -60,8 +69,7 @@ namespace NadekoBot.Classes.Music {
SongQueue.RemoveAt(0); SongQueue.RemoveAt(0);
} }
else { else {
VoiceClient?.Disconnect(); Stop();
VoiceClient = null;
return; return;
} }
@ -81,16 +89,18 @@ namespace NadekoBot.Classes.Music {
} }
} }
internal void Stop() { internal void Stop(bool leave = false) {
Stopped = true; Stopped = true;
SongQueue.Clear(); SongQueue.Clear();
CurrentSong?.Stop(); CurrentSong?.Stop();
CurrentSong = null; CurrentSong = null;
VoiceClient?.Disconnect(); if (leave) {
VoiceClient = null; VoiceClient?.Disconnect();
VoiceClient = null;
MusicControls throwAwayValue; MusicControls throwAwayValue;
MusicModule.musicPlayers.TryRemove(_e.Server, out throwAwayValue); MusicModule.musicPlayers.TryRemove(_e.Server, out throwAwayValue);
}
} }
public int SetVolume(int value) { public int SetVolume(int value) {

View File

@ -49,7 +49,7 @@ namespace NadekoBot.Classes.Music {
this.Server = e.Server; this.Server = e.Server;
this.Query = query; this.Query = query;
this.RadioLink = radio; this.RadioLink = radio;
mc.SongQueue.Add(this); mc.AddSong(this);
} }
public async Task Resolve() { public async Task Resolve() {

View File

@ -16,7 +16,7 @@ namespace NadekoBot.Commands {
{"%servers%", ()=> NadekoBot.client.Servers.Count().ToString() }, {"%servers%", ()=> NadekoBot.client.Servers.Count().ToString() },
{"%users%", () => NadekoBot.client.Servers.SelectMany(s=>s.Users).Count().ToString() }, {"%users%", () => NadekoBot.client.Servers.SelectMany(s=>s.Users).Count().ToString() },
{"%playing%", () => { {"%playing%", () => {
var cnt = Modules.Music.musicPlayers.Count; var cnt = Modules.Music.musicPlayers.Where(kvp => kvp.Value.CurrentSong != null).Count();
if(cnt == 1) { if(cnt == 1) {
try { try {
var mp = Modules.Music.musicPlayers.FirstOrDefault(); var mp = Modules.Music.musicPlayers.FirstOrDefault();

View File

@ -49,7 +49,7 @@ namespace NadekoBot.Modules {
.Description("Completely stops the music, unbinds the bot from the channel, and cleans up files.") .Description("Completely stops the music, unbinds the bot from the channel, and cleans up files.")
.Do(e => { .Do(e => {
if (musicPlayers.ContainsKey(e.Server) == false) return; if (musicPlayers.ContainsKey(e.Server) == false) return;
musicPlayers[e.Server].Stop(); musicPlayers[e.Server].Stop(true);
}); });
cgb.CreateCommand("p") cgb.CreateCommand("p")