示例#1
0
        public async Task Play(
            ITurnContext turnContext,
            UserProfile userProfile,
            string query,
            CancellationToken cancellationToken,
            TokenResponse token = null)
        {
            var info = RingoBotHelper.NormalizedConversationInfo(turnContext);

            // User authorised?
            token = token ?? await _authService.Authorize(turnContext, cancellationToken);

            if (token == null)
            {
                // resume after auth
                userProfile.ResumeAfterAuthorizationWith = (PlayCommand[0], query);
                return;
            }

            // Device active?
            if (!await IsDeviceActive(
                    turnContext,
                    token.Token,
                    $"{RingoBotHelper.RingoHandleIfGroupChat(turnContext)}play {query}",
                    cancellationToken))
            {
                return;
            }

            Station station = null;

            if (string.IsNullOrEmpty(query))
            {
                // Play whatever is now playing on Spotify
                station = await PlayNowPlaying(turnContext, token.Token, cancellationToken);

                if (station == null)
                {
                    return;
                }
            }
            else
            {
                // Search for a Playlist and command Spotify to Play it

                // playlist query
                string search = null;

                //if (query.Contains('#'))
                //{
                //    search = query.Substring(0, query.IndexOf('#'));
                //    hashtag = query.Substring(query.IndexOf('#') + 1);
                //}
                //else
                //{
                //    search = query;
                //}

                search = query;

                Playlist[] playlists = await _spotifyService.FindPlaylists(
                    search,
                    token.Token,
                    cancellationToken);

                if (playlists == null || !playlists.Any())
                {
                    await turnContext.SendActivityAsync($"No playlists found!", cancellationToken : cancellationToken);

                    return;
                }

                // TODO: Carousel
                Playlist playlist = playlists[0];

                if (!await IsDeviceActive(
                        turnContext,
                        token.Token,
                        $"{RingoBotHelper.RingoHandleIfGroupChat(turnContext)}play {playlist.Uri}",
                        cancellationToken,
                        playlist: playlist))
                {
                    return;
                }

                // Command Spotify to play the Playlist
                await _spotifyService.PlayPlaylist(
                    playlist.Id,
                    token.Token,
                    cancellationToken);

                if (playlist == null)
                {
                    return;
                }

                // Playlist is playing, now create a station
                station = info.IsGroup
                    ? await _ringoService.CreateConversationStation(info, playlist : playlist)
                    : await _ringoService.CreateUserStation(info, playlist : playlist);
            }

            await turnContext.SendActivityAsync(RingoBotMessages.NowPlayingStation(info, station), cancellationToken);
        }