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

View File

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

View File

@ -16,7 +16,7 @@ namespace NadekoBot.Commands {
{"%servers%", ()=> NadekoBot.client.Servers.Count().ToString() },
{"%users%", () => NadekoBot.client.Servers.SelectMany(s=>s.Users).Count().ToString() },
{"%playing%", () => {
var cnt = Modules.Music.musicPlayers.Count;
var cnt = Modules.Music.musicPlayers.Where(kvp => kvp.Value.CurrentSong != null).Count();
if(cnt == 1) {
try {
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.")
.Do(e => {
if (musicPlayers.ContainsKey(e.Server) == false) return;
musicPlayers[e.Server].Stop();
musicPlayers[e.Server].Stop(true);
});
cgb.CreateCommand("p")