예제 #1
0
        /// <summary>
        /// Queues serached spotify songs to the player queue
        /// </summary>
        /// <param name="player">Instance of <see cref="LavaPlayer" /> for the guild</param>
        /// <param name="spotifyTracks"><see cref="List{T}"/> of spotifyTracks</param>
        /// <param name="requester">Requester of the song</param>
        /// <returns></returns>
        public async Task QueueSpotifyToPlayer(LavaPlayer player, List <string> spotifyTracks, IGuildUser requester = null)
        {
            _ = Task.Run(async() =>
            {
                int startIdx = 0;

                await Program.BotConfig.BotEmbedMessage.ModifyAsync(x => { x.Content = string.Format(QueueMayHaveSongs, "Loading..."); }).ConfigureAwait(false);

                if (player.PlayerState is PlayerState.Connected or PlayerState.Stopped)
                {
                    var node = await Node.SearchYouTubeAsync(spotifyTracks[0]);
                    if (node.LoadStatus != LoadStatus.NoMatches || node.LoadStatus != LoadStatus.LoadFailed)
                    {
                        await player.PlayAsync(node.Tracks[0].CreateMuseTrack(requester));
                    }
                    startIdx = 1;
                }

                if (spotifyTracks.Count - startIdx > 0)
                {
                    var lavaTracks = spotifyTracks.Skip(startIdx).OrderedParallelAsync(async e =>
                    {
                        int i          = 0;
                        int maxRetries = 3;
                        Victoria.Responses.Rest.SearchResponse node;
                        do
                        {
                            node = await Node.SearchYouTubeAsync(e);
                            i++;
                        } while (node.LoadStatus is LoadStatus.NoMatches or LoadStatus.LoadFailed && i <= maxRetries);

                        LavaTrack first = null;
                        foreach (var track in node.Tracks)
                        {
                            first = track;
                            break;
                        }

                        return(node.LoadStatus is LoadStatus.NoMatches or LoadStatus.LoadFailed ? null : first?.CreateMuseTrack(requester));
                    });

                    SpinWait.SpinUntil(() => lavaTracks.Count() == spotifyTracks.Count - startIdx);

                    foreach (var track in lavaTracks)
                    {
                        player.Queue.Enqueue(track);
                    }
                }

                var newQueue = await GetNewEmbedQueueString(player).ConfigureAwait(false);
                var embed    = await embedHelper.BuildMusicEmbed(player, Color.DarkGreen).ConfigureAwait(false);
                var content  = newQueue switch
                {
                    "" => NoSongsInQueue,
                    _ => string.Format(QueueMayHaveSongs, newQueue)
                };

                await Program.BotConfig.BotEmbedMessage.ModifyAsync(x =>
                {
                    x.Embed   = embed;
                    x.Content = content;
                }).ConfigureAwait(false);
            });
            await Task.CompletedTask;
        }