Fixed bugs, added .play command which acts as .n 1 when used without arguments or as .q command when used with serach query
This commit is contained in:
		@@ -1,9 +1,4 @@
 | 
				
			|||||||
using NadekoBot.Extensions;
 | 
					using System;
 | 
				
			||||||
using System;
 | 
					 | 
				
			||||||
using System.Collections.Generic;
 | 
					 | 
				
			||||||
using System.IO;
 | 
					 | 
				
			||||||
using System.Linq;
 | 
					 | 
				
			||||||
using System.Text;
 | 
					 | 
				
			||||||
using System.Threading;
 | 
					using System.Threading;
 | 
				
			||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -134,7 +134,7 @@ namespace NadekoBot.Modules.Administration
 | 
				
			|||||||
                await user.RemoveRolesAsync(userRoles).ConfigureAwait(false);
 | 
					                await user.RemoveRolesAsync(userRoles).ConfigureAwait(false);
 | 
				
			||||||
                await ReplyConfirmLocalized("rar", Format.Bold(user.ToString())).ConfigureAwait(false);
 | 
					                await ReplyConfirmLocalized("rar", Format.Bold(user.ToString())).ConfigureAwait(false);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            catch (Exception ex)
 | 
					            catch (Exception)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                await ReplyErrorLocalized("rar_err").ConfigureAwait(false);
 | 
					                await ReplyErrorLocalized("rar_err").ConfigureAwait(false);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,7 +84,16 @@ namespace NadekoBot.Modules.Music
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        private async Task InternalQueue(MusicPlayer mp, SongInfo songInfo, bool silent)
 | 
					        private async Task InternalQueue(MusicPlayer mp, SongInfo songInfo, bool silent)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var qData = mp.Enqueue(songInfo);
 | 
					            (bool Success, int Index) qData;
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                qData = mp.Enqueue(songInfo);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (QueueFullException)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                await ReplyErrorLocalized("queue_full", mp.MaxQueueSize).ConfigureAwait(false);
 | 
				
			||||||
 | 
					                throw;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            if (qData.Success)
 | 
					            if (qData.Success)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (!silent)
 | 
					                if (!silent)
 | 
				
			||||||
@@ -111,8 +120,16 @@ namespace NadekoBot.Modules.Music
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        //todo test play
 | 
				
			||||||
        //todo  add play command. .play = .n, .play whatever = .q whatever
 | 
					        [NadekoCommand, Usage, Description, Aliases]
 | 
				
			||||||
 | 
					        [RequireContext(ContextType.Guild)]
 | 
				
			||||||
 | 
					        public Task Play([Remainder]string query = null)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (string.IsNullOrWhiteSpace(query))
 | 
				
			||||||
 | 
					                try { return Queue(query); } catch (QueueFullException) { return Task.CompletedTask; }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                return Next();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [NadekoCommand, Usage, Description, Aliases]
 | 
					        [NadekoCommand, Usage, Description, Aliases]
 | 
				
			||||||
        [RequireContext(ContextType.Guild)]
 | 
					        [RequireContext(ContextType.Guild)]
 | 
				
			||||||
@@ -120,7 +137,7 @@ namespace NadekoBot.Modules.Music
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            var mp = await _music.GetOrCreatePlayer(Context);
 | 
					            var mp = await _music.GetOrCreatePlayer(Context);
 | 
				
			||||||
            var songInfo = await _music.ResolveSong(query, Context.User.ToString());
 | 
					            var songInfo = await _music.ResolveSong(query, Context.User.ToString());
 | 
				
			||||||
            await InternalQueue(mp, songInfo, false);
 | 
					            try { await InternalQueue(mp, songInfo, false); } catch (QueueFullException) { return; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if ((await Context.Guild.GetCurrentUserAsync()).GetPermissions((IGuildChannel)Context.Channel).ManageMessages)
 | 
					            if ((await Context.Guild.GetCurrentUserAsync()).GetPermissions((IGuildChannel)Context.Channel).ManageMessages)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -241,7 +258,7 @@ namespace NadekoBot.Modules.Music
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
            var mp = await _music.GetOrCreatePlayer(Context);
 | 
					            var mp = await _music.GetOrCreatePlayer(Context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            mp.Next();
 | 
					            mp.Next(skipCount);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [NadekoCommand, Usage, Description, Aliases]
 | 
					        [NadekoCommand, Usage, Description, Aliases]
 | 
				
			||||||
@@ -520,7 +537,7 @@ namespace NadekoBot.Modules.Music
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            await Context.Channel.EmbedAsync(embed).ConfigureAwait(false);
 | 
					            await Context.Channel.EmbedAsync(embed).ConfigureAwait(false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        //todo test shuffle
 | 
					
 | 
				
			||||||
        [NadekoCommand, Usage, Description, Aliases]
 | 
					        [NadekoCommand, Usage, Description, Aliases]
 | 
				
			||||||
        [RequireContext(ContextType.Guild)]
 | 
					        [RequireContext(ContextType.Guild)]
 | 
				
			||||||
        public async Task ShufflePlaylist()
 | 
					        public async Task ShufflePlaylist()
 | 
				
			||||||
@@ -747,7 +764,6 @@ namespace NadekoBot.Modules.Music
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        //}
 | 
					        //}
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        //todo test smq
 | 
					 | 
				
			||||||
        [NadekoCommand, Usage, Description, Aliases]
 | 
					        [NadekoCommand, Usage, Description, Aliases]
 | 
				
			||||||
        [RequireContext(ContextType.Guild)]
 | 
					        [RequireContext(ContextType.Guild)]
 | 
				
			||||||
        public async Task SetMaxQueue(uint size = 0)
 | 
					        public async Task SetMaxQueue(uint size = 0)
 | 
				
			||||||
@@ -756,7 +772,7 @@ namespace NadekoBot.Modules.Music
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            var mp = await _music.GetOrCreatePlayer(Context);
 | 
					            var mp = await _music.GetOrCreatePlayer(Context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            mp.SetMaxQueueSize(size);
 | 
					            mp.MaxQueueSize = size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (size == 0)
 | 
					            if (size == 0)
 | 
				
			||||||
                await ReplyConfirmLocalized("max_queue_unlimited").ConfigureAwait(false);
 | 
					                await ReplyConfirmLocalized("max_queue_unlimited").ConfigureAwait(false);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -212,8 +212,6 @@ namespace NadekoBot
 | 
				
			|||||||
                var pokemonService = new PokemonService();
 | 
					                var pokemonService = new PokemonService();
 | 
				
			||||||
                #endregion
 | 
					                #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                //initialize Services
 | 
					                //initialize Services
 | 
				
			||||||
                Services = new NServiceProvider.ServiceProviderBuilder()
 | 
					                Services = new NServiceProvider.ServiceProviderBuilder()
 | 
				
			||||||
                    .Add<ILocalization>(Localization)
 | 
					                    .Add<ILocalization>(Localization)
 | 
				
			||||||
@@ -269,7 +267,6 @@ namespace NadekoBot
 | 
				
			|||||||
                    .Add<NadekoBot>(this)
 | 
					                    .Add<NadekoBot>(this)
 | 
				
			||||||
                    .Build();
 | 
					                    .Build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
                CommandHandler.AddServices(Services);
 | 
					                CommandHandler.AddServices(Services);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                //setup typereaders
 | 
					                //setup typereaders
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1467,6 +1467,15 @@
 | 
				
			|||||||
  <data name="next_usage" xml:space="preserve">
 | 
					  <data name="next_usage" xml:space="preserve">
 | 
				
			||||||
    <value>`{0}n` or `{0}n 5`</value>
 | 
					    <value>`{0}n` or `{0}n 5`</value>
 | 
				
			||||||
  </data>
 | 
					  </data>
 | 
				
			||||||
 | 
					  <data name="play_cmd" xml:space="preserve">
 | 
				
			||||||
 | 
					    <value>play start</value>
 | 
				
			||||||
 | 
					  </data>
 | 
				
			||||||
 | 
					  <data name="play_desc" xml:space="preserve">
 | 
				
			||||||
 | 
					    <value>If no arguments are specified, acts as `{0}next 1` command. If you specify a search query, acts as a `{0}q` command</value>
 | 
				
			||||||
 | 
					  </data>
 | 
				
			||||||
 | 
					  <data name="play_usage" xml:space="preserve">
 | 
				
			||||||
 | 
					    <value>`{0}play` or `{0}play Dream Of Venice`</value>
 | 
				
			||||||
 | 
					  </data>
 | 
				
			||||||
  <data name="stop_cmd" xml:space="preserve">
 | 
					  <data name="stop_cmd" xml:space="preserve">
 | 
				
			||||||
    <value>stop s</value>
 | 
					    <value>stop s</value>
 | 
				
			||||||
  </data>
 | 
					  </data>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,12 +2,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace NadekoBot.Services.Music
 | 
					namespace NadekoBot.Services.Music
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public class PlaylistFullException : Exception
 | 
					    public class QueueFullException : Exception
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public PlaylistFullException(string message) : base(message)
 | 
					        public QueueFullException(string message) : base(message)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public PlaylistFullException() : base("Queue is full.") { }
 | 
					        public QueueFullException() : base("Queue is full.") { }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public class SongNotFoundException : Exception
 | 
					    public class SongNotFoundException : Exception
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,6 +45,11 @@ namespace NadekoBot.Services.Music
 | 
				
			|||||||
        public bool Shuffle { get; private set; }
 | 
					        public bool Shuffle { get; private set; }
 | 
				
			||||||
        public bool Autoplay { get; private set; }
 | 
					        public bool Autoplay { get; private set; }
 | 
				
			||||||
        public bool RepeatPlaylist { get; private set; } = true;
 | 
					        public bool RepeatPlaylist { get; private set; } = true;
 | 
				
			||||||
 | 
					        public uint MaxQueueSize
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get => Queue.MaxQueueSize;
 | 
				
			||||||
 | 
					            set => Queue.MaxQueueSize = value;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private IAudioClient _audioClient;
 | 
					        private IAudioClient _audioClient;
 | 
				
			||||||
        private readonly object locker = new object();
 | 
					        private readonly object locker = new object();
 | 
				
			||||||
@@ -137,7 +142,6 @@ namespace NadekoBot.Services.Music
 | 
				
			|||||||
                     }
 | 
					                     }
 | 
				
			||||||
                     finally
 | 
					                     finally
 | 
				
			||||||
                     {
 | 
					                     {
 | 
				
			||||||
                         _log.Info("Next song");
 | 
					 | 
				
			||||||
                         do
 | 
					                         do
 | 
				
			||||||
                         {
 | 
					                         {
 | 
				
			||||||
                             await Task.Delay(500);
 | 
					                             await Task.Delay(500);
 | 
				
			||||||
@@ -146,7 +150,10 @@ namespace NadekoBot.Services.Music
 | 
				
			|||||||
                         if (!RepeatCurrentSong) //if repeating current song, just ignore other settings, and play this song again (don't change the index)
 | 
					                         if (!RepeatCurrentSong) //if repeating current song, just ignore other settings, and play this song again (don't change the index)
 | 
				
			||||||
                         {
 | 
					                         {
 | 
				
			||||||
                             if (Shuffle)
 | 
					                             if (Shuffle)
 | 
				
			||||||
 | 
					                             {
 | 
				
			||||||
 | 
					                                 _log.Info("Random song");
 | 
				
			||||||
                                 Queue.Random(); //if shuffle is set, set current song index to a random number
 | 
					                                 Queue.Random(); //if shuffle is set, set current song index to a random number
 | 
				
			||||||
 | 
					                             }
 | 
				
			||||||
                             else
 | 
					                             else
 | 
				
			||||||
                             {
 | 
					                             {
 | 
				
			||||||
                                 //if last song, and autoplay is enabled, and if it's a youtube song
 | 
					                                 //if last song, and autoplay is enabled, and if it's a youtube song
 | 
				
			||||||
@@ -155,19 +162,25 @@ namespace NadekoBot.Services.Music
 | 
				
			|||||||
                                 {
 | 
					                                 {
 | 
				
			||||||
                                     try
 | 
					                                     try
 | 
				
			||||||
                                     {
 | 
					                                     {
 | 
				
			||||||
 | 
					                                         _log.Info("Loading related song");
 | 
				
			||||||
                                         //todo test autoplay
 | 
					                                         //todo test autoplay
 | 
				
			||||||
                                         await _musicService.TryQueueRelatedSongAsync(data.Song.Query, OutputTextChannel, VoiceChannel);
 | 
					                                         await _musicService.TryQueueRelatedSongAsync(data.Song.Query, OutputTextChannel, VoiceChannel);
 | 
				
			||||||
                                         Queue.Next();
 | 
					                                         Queue.Next();
 | 
				
			||||||
                                     }
 | 
					                                     }
 | 
				
			||||||
                                     catch { }
 | 
					                                     catch
 | 
				
			||||||
 | 
					                                     {
 | 
				
			||||||
 | 
					                                         _log.Info("Loading related song failed.");
 | 
				
			||||||
 | 
					                                     }
 | 
				
			||||||
                                 }
 | 
					                                 }
 | 
				
			||||||
                                 else if (Queue.Count == data.Index && !RepeatPlaylist)
 | 
					                                 else if (Queue.Count == data.Index && !RepeatPlaylist)
 | 
				
			||||||
                                 {
 | 
					                                 {
 | 
				
			||||||
                                     //todo test repeatplaylist
 | 
					                                     //todo test repeatplaylist
 | 
				
			||||||
 | 
					                                     _log.Info("Stopping because repeatplaylist is disabled");
 | 
				
			||||||
                                     Stop();
 | 
					                                     Stop();
 | 
				
			||||||
                                 }
 | 
					                                 }
 | 
				
			||||||
                                 else
 | 
					                                 else
 | 
				
			||||||
                                 {
 | 
					                                 {
 | 
				
			||||||
 | 
					                                     _log.Info("Next song");
 | 
				
			||||||
                                     Queue.Next();
 | 
					                                     Queue.Next();
 | 
				
			||||||
                                 }
 | 
					                                 }
 | 
				
			||||||
                             }
 | 
					                             }
 | 
				
			||||||
@@ -208,10 +221,11 @@ namespace NadekoBot.Services.Music
 | 
				
			|||||||
            return (true, Queue.Count);
 | 
					            return (true, Queue.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public void Next()
 | 
					        public void Next(int skipCount)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            lock (locker)
 | 
					            lock (locker)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 | 
					                Queue.Next(skipCount - 1);
 | 
				
			||||||
                Stopped = false;
 | 
					                Stopped = false;
 | 
				
			||||||
                Unpause();
 | 
					                Unpause();
 | 
				
			||||||
                CancelCurrentSong();
 | 
					                CancelCurrentSong();
 | 
				
			||||||
@@ -364,11 +378,6 @@ namespace NadekoBot.Services.Music
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public void SetMaxQueueSize(uint size)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            Queue.SetMaxQueueSize(size);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public void SetVoiceChannel(IVoiceChannel vch)
 | 
					        public void SetVoiceChannel(IVoiceChannel vch)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            VoiceChannel = vch;
 | 
					            VoiceChannel = vch;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,23 +50,37 @@ namespace NadekoBot.Services.Music
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public uint maxQueueSize { get; private set; }
 | 
					        private uint _maxQueueSize;
 | 
				
			||||||
 | 
					        public uint MaxQueueSize
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get => _maxQueueSize;
 | 
				
			||||||
 | 
					            set
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (value < 0)
 | 
				
			||||||
 | 
					                    throw new ArgumentOutOfRangeException(nameof(value));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                lock (locker)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _maxQueueSize = value;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public void Add(SongInfo song)
 | 
					        public void Add(SongInfo song)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            song.ThrowIfNull(nameof(song));
 | 
					            song.ThrowIfNull(nameof(song));
 | 
				
			||||||
            lock (locker)
 | 
					            lock (locker)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if(maxQueueSize !=0 && CurrentIndex >= maxQueueSize)
 | 
					                if(MaxQueueSize != 0 && Songs.Count >= MaxQueueSize)
 | 
				
			||||||
                    throw new PlaylistFullException();
 | 
					                    throw new QueueFullException();
 | 
				
			||||||
                Songs.AddLast(song);
 | 
					                Songs.AddLast(song);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public void Next()
 | 
					        public void Next(int skipCount = 1)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            lock(locker)
 | 
					            lock(locker)
 | 
				
			||||||
                CurrentIndex++;
 | 
					                CurrentIndex += skipCount;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public void Dispose()
 | 
					        public void Dispose()
 | 
				
			||||||
@@ -133,16 +147,5 @@ namespace NadekoBot.Services.Music
 | 
				
			|||||||
                CurrentIndex = new NadekoRandom().Next(Songs.Count);
 | 
					                CurrentIndex = new NadekoRandom().Next(Songs.Count);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        public void SetMaxQueueSize(uint size)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (size < 0)
 | 
					 | 
				
			||||||
                throw new ArgumentOutOfRangeException(nameof(size));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            lock (locker)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                maxQueueSize = size;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,6 +68,7 @@ Check the guides for your platform on how to setup ffmpeg correctly:
 | 
				
			|||||||
    Windows Guide: https://goo.gl/OjKk8F
 | 
					    Windows Guide: https://goo.gl/OjKk8F
 | 
				
			||||||
    Linux Guide:  https://goo.gl/ShjCUo");
 | 
					    Linux Guide:  https://goo.gl/ShjCUo");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                catch (OperationCanceledException) { }
 | 
				
			||||||
                catch (Exception ex)
 | 
					                catch (Exception ex)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    _log.Info(ex);
 | 
					                    _log.Info(ex);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user