private async Task InternalQueue(CoreMusicPlayer mp, MusicInfo songInfo, bool silent, bool queueFirst = false)
        {
            if (songInfo == null)
            {
                if (!silent)
                {
                    await mp.TextChannel.SendMessageAsync("Song was not found").ConfigureAwait(false);
                }
                return;
            }

            int index;

            try
            {
                index = queueFirst
                    ? mp.EnqueueNext(songInfo)
                    : mp.Enqueue(songInfo);
            }
            catch (QueueFullException)
            {
                await mp.TextChannel.SendMessageAsync("Queue is currently full").ConfigureAwait(false);

                throw;
            }
            if (index != -1)
            {
                if (!silent)
                {
                    try
                    {
                        var embed = new DiscordEmbedBuilder()
                                    .WithDescription($"{songInfo.FormattedName}")
                                    .WithFooter(songInfo.FormattedProvider);

                        if (Uri.IsWellFormedUriString(songInfo.Thumbnail, UriKind.Absolute))
                        {
                            embed.WithThumbnailUrl(songInfo.Thumbnail);
                        }
                        int toDisplay = mp.QueueArray().Songs.Length > 10 ? 10 : mp.QueueArray().Songs.Length;
                        for (int i = mp.Current.Index; i < toDisplay; i++)
                        {
                            embed.AddField(i.ToString(), mp.QueueArray().Songs[i].FormattedName);
                        }
                        var queuedMessage = await mp.TextChannel.SendMessageAsync(embed : embed);

                        if (mp.Stopped)
                        {
                            await mp.TextChannel.SendMessageAsync($"Queue Stopped - Use play to add a song to queue").ConfigureAwait(false);
                        }
                        //await queuedMessage?.DeleteAsync();
                    }
                    catch
                    {
                        // ignored
                    }
                }
            }
        }
        public async Task <CoreMusicPlayer> GetOrCreatePlayer(ulong guild, DiscordChannel textChan, DiscordChannel voiceChan)
        {
            if (voiceChan == null || voiceChan.Guild != textChan.Guild)
            {
                if (textChan != null)
                {
                    await textChan.SendMessageAsync("Not in voice").ConfigureAwait(false);
                }
                throw new NotInVoiceChannelException();
            }
            return(MusicPlayers.GetOrAdd((long)guild, _ =>
            {
                float vol = 1.0f;
                var mp = new CoreMusicPlayer(voiceChan, textChan, _google, vol, this);

                DiscordMessage playingMessage = null;
                DiscordMessage lastFinishedMessage = null;
                //add implementation for event trigger
                mp.OnCompleted += async(s, song) =>
                {
                    try
                    {
                        await lastFinishedMessage?.DeleteAsync();
                        try
                        {
                            lastFinishedMessage = await mp.TextChannel.SendMessageAsync(embed: new DiscordEmbedBuilder()
                                                                                        .WithColor(DiscordColor.Blue)
                                                                                        .WithAuthor("Finished Song", song.FormattedFullName)
                                                                                        .WithDescription(song.FormattedName)
                                                                                        .WithFooter(song.FormattedInfo))
                                                  .ConfigureAwait(false);
                        }
                        catch
                        {
                            var cur = mp.Current;
                            if (cur.Current == null &&
                                !mp.RepeatCurrentSong &&
                                !mp.RepeatPlaylist)
                            {
                                await DestroyPlayer((long)guild).ConfigureAwait(false);
                            }
                        }
                    }
                    catch
                    {
                    }
                };

                mp.OnStarted += async(player, song) =>
                {
                    var sender = player;
                    if (sender == null)
                    {
                        return;
                    }
                    try
                    {
                        await playingMessage?.DeleteAsync();

                        playingMessage = await mp.TextChannel.SendMessageAsync(embed: new DiscordEmbedBuilder().WithColor(DiscordColor.Blue)
                                                                               .WithAuthor($"Playing - {song.Index + 1}", song.Song.SongUrl)
                                                                               .WithDescription(song.Song.FormattedName)
                                                                               .WithFooter($"{mp.Volume} | {song.Song.FormattedInfo}"))
                                         .ConfigureAwait(false);
                    }
                    catch
                    {
                        // ignored
                    }
                };
                mp.OnPauseChanged += async(player, paused) =>
                {
                    try
                    {
                        DiscordMessage msg;
                        if (paused)
                        {
                            msg = await mp.TextChannel.SendMessageAsync("paused").ConfigureAwait(false);
                        }
                        else
                        {
                            msg = await mp.TextChannel.SendMessageAsync("resumed").ConfigureAwait(false);
                        }
                        msg?.DeleteAsync();
                    }
                    catch
                    {
                        // ignored
                    }
                };
                _log.Info("Done creating");
                return mp;
            }));
        }