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); }