public async Task PlayAsync([Remainder] string song = "")
        {
            Utilities utilities    = new Utilities(Context.Guild);
            var       guildAccount = GuildAccounts.GetGuildAccount(Context.Guild);
            string    avatar       = Context.Message.Author.GetAvatarUrl() ?? Context.Message.Author.GetDefaultAvatarUrl();
            int       choose       = -1;

            if (!song.Contains(".com") && song != "")
            {
                if ((Context.User as IVoiceState).VoiceChannel == null)
                {
                    await ReplyAsync(Utilities.GetAlert("PLAY_NULL_CHANNEL"));

                    return;
                }

                var          searchList   = AudioService.GetYoutubeAsync(song, Context.Guild.Id, (Context.User as IVoiceState).VoiceChannel);
                var          searchResult = searchList.Items[0];
                YoutubeVideo video        = new YoutubeVideo();
                video.SetInfoVideo(Context.Guild, searchResult.Snippet.Description, searchResult.Snippet.Thumbnails.High.Url,
                                   searchResult.Id.VideoId, searchResult.Snippet.Title);
                choose = 0;
                song   = $"https://www.youtube.com/watch?v={video.link[choose]}";

                await AudioService.PlayAsync(Context, song, choose, video);

                return;
            }

            await AudioService.PlayAsync(Context, song, 0);
        }
        public async Task YoutubeAsync([Remainder] string query = "")
        {
            Utilities utilities = new Utilities(Context.Guild);
            string    avatar    = Context.Message.Author.GetAvatarUrl() ?? Context.Message.Author.GetDefaultAvatarUrl();

            if (query == "")
            {
                await ReplyAsync(Utilities.GetAlert("PLAY_NULL_QUERY"));

                return;
            }

            var          searchList = AudioService.GetYoutubeAsync(query, Context.Guild.Id, (Context.User as IVoiceState).VoiceChannel);
            YoutubeVideo video      = new YoutubeVideo();

            video.SetMultipleVideosInfo(Context.Guild, video, searchList);

            EmbedBuilder builder = new EmbedBuilder();

            builder
            .WithAuthor(Context.Message.Author.Username, avatar)
            .WithThumbnailUrl("http://i65.tinypic.com/2uqk3yr.png")
            .WithTitle(Utilities.GetAlert("YOUTUBE_FILMEMBED"))
            .WithDescription($"{string.Join("\n", video.videosList)}")
            .WithColor(Color.Red);

            await ReplyAsync("", false, builder.Build());

            var response = await NextMessageAsync(true, true, timeout : TimeSpan.FromSeconds(30));

            string answer = response.ToString();

            string[] wholeMsg = answer.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            int      choose   = InteractiveUtil.ConvertToInt(answer);

            if (Utilities.GetAlert("answerCancel").Contains(wholeMsg[0]))
            {
                await ReplyAsync(Utilities.GetAlert("PLAY_CANCEL"));

                return;
            }
            if (choose == 0)
            {
                return;
            }

            choose = choose - 1;
            string song = $"https://www.youtube.com/watch?v={video.link[choose]}";
            await AudioService.PlayAsync(Context, song, choose, video);

            return;
        }
        // This is a TODO, i really need to improve creating the queue because it's slow and inefficient af
        public static List <string> CreateListOfSongs(ISocketMessageChannel channel, List <LavalinkTrack> queue, string username, string avatar)
        {
            YoutubeVideo video = new YoutubeVideo();
            int          count = 1;

            //int i = 0;

            foreach (var track in queue)
            {
                video.videosList.Add($"{count}. [{track.Title}]({track.Url}) `{track.Length}` \n");
                //video.link[i] = track.Url;
                //video.title[i] = track.Title;
                count++;
                //i++;
            }

            return(video.videosList);
        }
        public void SetMultipleVideosInfo(SocketGuild guild, YoutubeVideo video, Google.Apis.YouTube.v3.Data.SearchListResponse searchList)
        {
            int count = 1;
            int i     = 0;

            foreach (var searchResult in searchList.Items)
            {
                Utilities utilities = new Utilities(guild);
                video.videosList.Add($"{count}. {searchResult.Snippet.Title} \n");
                video.link[i]  = searchResult.Id.VideoId;
                video.title[i] = searchResult.Snippet.Title;
                video.desc[i]  = searchResult.Snippet.Description;
                video.image[i] = searchResult.Snippet.Thumbnails.High.Url;
                if (video.desc[i] == null || video.desc[i] == "")
                {
                    video.desc[i] = Utilities.GetAlert("PLAY_NULL_DESC");
                }
                count++;
                i++;
            }
        }
        public static async Task PlayAsync(SocketCommandContext context, string song, int choose, YoutubeVideo video = null)
        {
            // Create used objects
            SocketGuild           guild        = context.Guild;
            SocketUserMessage     message      = context.Message;
            IVoiceChannel         voiceChannel = (context.User as IVoiceState).VoiceChannel;
            ISocketMessageChannel channel      = context.Channel;
            Utilities             utilities    = new Utilities(guild);

            // Checking if voice channel is null (and sending an error message)
            // If not, creating or getting a lavalink player
            // Checking if a given string is empty (if true, and there is a song in queue that is stopped, resuming it
            if (await VoiceChannelIsNull(channel, voiceChannel, utilities) is true)
            {
                return;
            }
            LavalinkPlayer player = lavalinkManager.GetPlayer(guild.Id) ?? await lavalinkManager.JoinAsync(voiceChannel);

            var audioQueue = AudioQueues.GetAudioQueue(guild);

            if (await SongIsEmpty(channel, utilities, player, audioQueue, song) is true)
            {
                return;
            }

            LoadTracksResponse response = await lavalinkManager.GetTracksAsync(song);

            LavalinkTrack track = response.Tracks.First();

            // Maximum songs in queue is 50
            if (await QueueIsFull(channel, utilities, audioQueue.Queue.Count) is true)
            {
                return;
            }

            // Adding a track to queue
            audioQueue.Queue = AudioQueues.GetOrCreateGuildQueue(track, audioQueue);

            // A check if a song is first in the queue, or if it's been added
            string songAlert = "PLAY_ADDED_SONG";

            if (await SongIsFirst(player, audioQueue, track, video, context, songAlert, choose) is false)
            {
                return;
            }
            // If a user gives a link to a youtube video, we don't need to send song info
            if (choose != -1)
            {
                await SongInfo(channel, message, video, choose, songAlert);
            }
        }
        private static async Task SongInfo(ISocketMessageChannel channel, SocketUserMessage message, YoutubeVideo video, int choose, string playOrAdded)
        {
            string avatar = message.Author.GetAvatarUrl() ?? message.Author.GetDefaultAvatarUrl();

            EmbedBuilder builder = new EmbedBuilder();

            builder
            .WithAuthor(message.Author.Username, avatar)
            .WithThumbnailUrl(video.image[choose])
            .AddField(Utilities.GetAlert(playOrAdded), $"[{video.title[choose]}](https://www.youtube.com/watch?v={video.link[choose]})")
            .AddField(Utilities.GetAlert("PLAY_VIDEO_DESC"), video.desc[choose])
            .WithColor(Color.DarkRed);

            await channel.SendMessageAsync("", false, builder.Build());
        }
        private static async Task <bool> SongIsFirst(LavalinkPlayer player, AudioQueue audioQueue, LavalinkTrack track, YoutubeVideo video, SocketCommandContext context, string songAlert, int choose)
        {
            ISocketMessageChannel channel     = context.Channel;
            SocketUserMessage     message     = context.Message;
            LavalinkTrack         secondTrack = audioQueue.Queue.ElementAtOrDefault(1);

            if (secondTrack == null)
            {
                audioQueue.PlayingTrackIndex = 0;
                AudioQueues.SaveQueues();

                await player.PlayAsync(track);

                if (video != null)
                {
                    songAlert = "PLAY_PLAYED_SONG";
                    await SongInfo(channel, message, video, choose, songAlert);
                }

                return(true);
            }

            return(false);
        }