/// <summary> /// Get projects result for Messaging Extension. /// </summary> /// <param name="events">List of user search result.</param> /// <param name="applicationBasePath">Application base URL.</param> /// <param name="localizer">The localizer for localizing content</param> /// <param name="localDateTime">Indicates local date and time of end user.</param> /// <returns>If event details provided, then returns reminder card. Else returns empty card.</returns> public static MessagingExtensionResult GetCard(IEnumerable <EventEntity> events, string applicationBasePath, IStringLocalizer <Strings> localizer, DateTimeOffset?localDateTime) { events = events ?? throw new ArgumentNullException(nameof(events), "Event list cannot be null"); MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = AttachmentLayoutTypes.List, Attachments = new List <MessagingExtensionAttachment>(), }; foreach (var eventDetails in events) { var card = GetEventDetailsAdaptiveCard(eventDetails, localizer, applicationBasePath); var previewCard = GetThumbnailCard(eventDetails, localDateTime, localizer); composeExtensionResult.Attachments.Add(new Attachment { ContentType = AdaptiveCard.ContentType, Content = card, }.ToMessagingExtensionAttachment(previewCard.ToAttachment())); } return(composeExtensionResult); }
/// <inheritdoc/> protected override Task <MessagingExtensionResponse> OnTeamsMessagingExtensionConfigurationQuerySettingUrlAsync( ITurnContext <IInvokeActivity> turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken) { var openSettingAction = new CardAction { Type = ActionTypes.OpenUrl, Value = $"{this.appSettings.BaseUrl}/mesettings", }; // ME Result. var result = new MessagingExtensionResult { Type = "config", SuggestedActions = new MessagingExtensionSuggestedAction { Actions = new List <CardAction> { openSettingAction }, }, }; // ME response. var response = new MessagingExtensionResponse() { ComposeExtension = result, }; return(Task.FromResult(response)); }
/// <summary> /// Prepares a message extension response with sign-in action as compose extension. /// </summary> /// <param name="signInUrl">Sign-in url.</param> /// <returns>Messaging extension response.</returns> private MessagingExtensionResponse GetSignInResponse(string signInUrl) { // Sign-in action. var signInAction = new CardAction { Type = ActionTypes.OpenUrl, Value = signInUrl, Title = "Sign in", }; // ME Result. var result = new MessagingExtensionResult { Type = "auth", SuggestedActions = new MessagingExtensionSuggestedAction { Actions = new List <CardAction> { signInAction }, }, }; // ME response. var response = new MessagingExtensionResponse() { ComposeExtension = result, }; return(response); }
/// <summary> /// Get the results from Azure Search service and populate the result (card + preview). /// </summary> /// <param name="query">Query which the user had typed in Messaging Extension search field.</param> /// <param name="commandId">Command id to determine which tab in Messaging Extension has been invoked.</param> /// <param name="count">Number of search results to return.</param> /// <param name="skip">Number of search results to skip.</param> /// <param name="userObjectId">AAd object id of the user.</param> /// <param name="localizer">The current cultures' string localizer.</param> /// <returns><see cref="Task"/>Returns Messaging Extension result object, which will be used for providing the card.</returns> public async Task <MessagingExtensionResult> GetSearchResultAsync( string query, string commandId, int?count, int?skip, string userObjectId, IStringLocalizer <Strings> localizer) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = AttachmentLayoutTypes.List, Attachments = new List <MessagingExtensionAttachment>(), }; // commandId should be equal to Id mentioned in Manifest file under composeExtensions section. switch (commandId) { case Constants.YourResponseCommandId: var userSearchServiceResults = await this.userResponseSearchService.SearchUserResponseAsync(query, userObjectId, count, skip); composeExtensionResult = this.GetUserResponsesResult(userSearchServiceResults, localizer: localizer); break; case Constants.CompanyResponseCommandId: var companySearchServiceResults = await this.companyResponseSearchService.GetSearchCompanyResponseAsync(query, count, skip); composeExtensionResult = this.GetCompanyResponsesResult(companySearchServiceResults, localizer: localizer); break; } return(composeExtensionResult); }
public void MessagingExtensionResultInitsWithNoArgs() { var msgExtResult = new MessagingExtensionResult(); Assert.NotNull(msgExtResult); Assert.IsType <MessagingExtensionResult>(msgExtResult); }
public void MessagingExtensionResultInits() { var attachmentLayout = "list"; var type = "message"; var attachments = new List <MessagingExtensionAttachment>() { new MessagingExtensionAttachment() }; var suggestedActions = new MessagingExtensionSuggestedAction( new List <CardAction>() { new CardAction("showImage"), new CardAction("openUrl"), }); var text = "my cup runneth over"; var activityPreview = new Activity(); var msgExtResult = new MessagingExtensionResult(attachmentLayout, type, attachments, suggestedActions, text, activityPreview); Assert.NotNull(msgExtResult); Assert.IsType <MessagingExtensionResult>(msgExtResult); Assert.Equal(attachmentLayout, msgExtResult.AttachmentLayout); Assert.Equal(type, msgExtResult.Type); Assert.Equal(attachments, msgExtResult.Attachments); Assert.Equal(suggestedActions, msgExtResult.SuggestedActions); Assert.Equal(text, msgExtResult.Text); Assert.Equal(activityPreview, msgExtResult.ActivityPreview); }
/// <summary> /// Get populated result to in messaging extension tab. /// </summary> /// <param name="commandId">Command id to determine which tab in message extension has been invoked.</param> /// <param name="localTimestamp">Local timestamp of the user activity.</param> /// <param name="searchServiceResults">List of tickets from Azure search service.</param> /// <returns><see cref="Task"/> Returns MessagingExtensionResult which will be shown in messaging extension tab.</returns> public static MessagingExtensionResult GetMessagingExtensionResult( string commandId, DateTimeOffset?localTimestamp, IList <TicketEntity> searchServiceResults) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = AttachmentLayoutTypes.List, Attachments = new List <MessagingExtensionAttachment>(), }; foreach (var ticket in searchServiceResults) { ThumbnailCard previewCard = new ThumbnailCard { Title = ticket.Title, Text = GetPreviewCardText(ticket, commandId, localTimestamp), }; var selectedTicketAdaptiveCard = new MessagingExtensionTicketsCard(ticket); composeExtensionResult.Attachments.Add(selectedTicketAdaptiveCard.ToAttachment(localTimestamp).ToMessagingExtensionAttachment(previewCard.ToAttachment())); } return(composeExtensionResult); }
/// <summary> /// Get team posts result for Messaging Extension. /// </summary> /// <param name="resourceList">List of user search result.</param> /// <returns><see cref="Task"/>Returns Messaging Extension result object, which will be used for providing the card.</returns> private async Task <MessagingExtensionResult> GetLearningModuleResultAsync(IEnumerable <LearningModule> resourceList) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = AttachmentLayoutTypes.List, Attachments = new List <MessagingExtensionAttachment>(), }; if (resourceList == null) { return(composeExtensionResult); } foreach (var resource in resourceList) { var resourceModuleMapping = await this.unitOfWork.ResourceModuleRepository.FindAsync(resourceModule => resourceModule.LearningModuleId == resource.Id); var learningModuleDetails = new LearningModuleCardViewModel { ImageUrl = resource.ImageUrl, Title = resource.Title, Description = resource.Description.Trim().Length > Constants.LearningModuleCardDescriptionLength ? $"{resource.Description.Trim().Substring(0, Constants.ResourceCardDescriptionLength)}..." : resource.Description.Trim(), GradeLabel = this.localizer.GetString("grade"), GradeName = resource.Grade.GradeName, SubjectLabel = this.localizer.GetString("subject"), SubjectName = resource.Subject.SubjectName, Id = resource.Id, ViewDetailLabel = this.localizer.GetString("viewDetail"), TaskModuleData = new AdaptiveSubmitActionData { AdaptiveActionType = BotCommandConstants.ViewLearningModule, Id = resource.Id.ToString() }, ResourceCount = resourceModuleMapping.Count(), }; var cardPayload = this.GetCardPayload(CacheKeysConstants.LearningModuleCardJSONTemplate, "LearningModuleCard.json"); var template = new AdaptiveCardTemplate(cardPayload); var card = template.Expand(learningModuleDetails); AdaptiveCard adaptiveCard = AdaptiveCard.FromJson(card).Card; ThumbnailCard previewCard = new ThumbnailCard { Images = new List <CardImage> { new CardImage(resource.ImageUrl), }, Title = $"<p style='font-weight: 600;font-size: 14px;'>{HttpUtility.HtmlEncode(resource.Title)}</p>", Text = $"<p style='font-size: 14px;'>{HttpUtility.HtmlEncode(resource.Subject.SubjectName)} | {HttpUtility.HtmlEncode(resource.Grade.GradeName)} | {HttpUtility.HtmlEncode(resourceModuleMapping.Count())} items</p>", }; composeExtensionResult.Attachments.Add(new Attachment { ContentType = AdaptiveCard.ContentType, Content = adaptiveCard, }.ToMessagingExtensionAttachment(previewCard.ToAttachment())); } return(composeExtensionResult); }
/// <summary> /// Gets the search result from wikipedia. /// </summary> /// <param name="messagingExtensionActivityAction">The messaging extension activity action.</param> /// <returns>Messaging extension result.</returns> public async Task <MessagingExtensionResult> GetSearchResultAsync(MessagingExtensionActivityAction messagingExtensionActivityAction) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = "list", Attachments = new List <MessagingExtensionAttachment>(), }; IList <WikipediaResult> searchResults = new List <WikipediaResult>(); // Search Wikipedia string apiUrl = GenerateSearchApiUrl(messagingExtensionActivityAction.MessagingExtensionQuery); WikipediaQueryResult queryResult = await this.InvokeWikipediaApiAsync(apiUrl).ConfigureAwait(false); searchResults = queryResult.Query.Results; // Grab pageIds so that we can batch query to fetch image urls of the pages IList <string> pageIds = new List <string>(); foreach (WikipediaResult searchResult in searchResults) { pageIds.Add(searchResult.Pageid); } IDictionary <string, string> imageResults = await this.GetImageUrlAsync(pageIds).ConfigureAwait(false); // Genereate results foreach (WikipediaResult searchResult in searchResults) { string imageUrl = DefaultImageUrl; // Always set a default image url in case of failure, or image doesn't exist if (imageResults.ContainsKey(searchResult.Pageid)) { imageUrl = imageResults[searchResult.Pageid]; } ThumbnailCard previewCard = new ThumbnailCard { Title = HttpUtility.HtmlEncode(searchResult.Title), Text = searchResult.Snippet, }; previewCard.Images = new CardImage[] { new CardImage(imageUrl, searchResult.Title) }; // Generate cards with links in the titles - preview cards don't have links ThumbnailCard card = new ThumbnailCard { Title = "<a href='" + HttpUtility.HtmlAttributeEncode("https://en.wikipedia.org/wiki/" + Uri.EscapeDataString(searchResult.Title)) + "' target='_blank'>" + HttpUtility.HtmlEncode(searchResult.Title) + "</a>", Text = searchResult.Snippet, Images = previewCard.Images, }; composeExtensionResult.Attachments.Add(card.ToAttachment().ToMessagingExtensionAttachment(previewCard.ToAttachment())); } return(composeExtensionResult); }
public MessagingExtensionResult GetMessageResponseResult(string message) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult(); composeExtensionResult.Type = "message"; composeExtensionResult.Text = message; return(composeExtensionResult); }
public void CheckEpicIcon() { string query = TestContext.Parameters["epicId"]; ADOSSearchHandler se = new ADOSSearchHandler(_client); MessagingExtensionResult me = se.GetSearchResultAsync(query).Result; Assert.AreEqual("image/jpeg;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNDQ4Ij48cGF0aCBkPSJNNDQ4IDk2YzAgMTcuNjcyLTE0LjMyNiAzMi0zMiAzMnYyODhIMzJWMTI4Yy0xNy42NzQgMC0zMi0xNC4zMjgtMzItMzIgMC0xNy42NzQgMTQuMzI2LTMyIDMyLTMyczMyIDE0LjMyNiAzMiAzMmMwIDExLjE5MS02LjA5NCAyMC41NjQtMTQuNzk3IDI2LjI4M0wxMzYuNzI3IDI1NiAyMTYuNzkgOTQuNTQzQzIwMi42OTkgOTEuMTkxIDE5MiA3OS4xMTMgMTkyIDY0YzAtMTcuNjc0IDE0LjMyNi0zMiAzMi0zMnMzMiAxNC4zMjYgMzIgMzJjMCAxNS4xMTMtMTAuNjk5IDI3LjE5MS0yNC43ODkgMzAuNTQzTDMxMS4yNzMgMjU2bDg3LjUyMy0xMzMuNzE3QzM5MC4wOTQgMTE2LjU2NCAzODQgMTA3LjE5MSAzODQgOTZjMC0xNy42NzQgMTQuMzI2LTMyIDMyLTMyczMyIDE0LjMyNiAzMiAzMnoiIGZpbGw9IiNmZjdiMDAiIC8+PC9zdmc+", ((ThumbnailCard)me.Attachments[0].Content).Images[0].Url); }
public void CheckBaseSearch() { string query = TestContext.Parameters["basicQuery"]; ADOSSearchHandler se = new ADOSSearchHandler(_client); MessagingExtensionResult me = se.GetSearchResultAsync(query).Result; Assert.Pass(); }
/// <summary> /// Get the results from Azure search service and populate the result (card + preview). /// </summary> /// <param name="languageCode">Current expert team's applicable language code.</param> /// <param name="query">Query which the user had typed in message extension search.</param> /// <param name="commandId">Command id to determine which tab in message extension has been invoked.</param> /// <param name="count">Count for pagination.</param> /// <param name="skip">Skip for pagination.</param> /// <param name="localTimestamp">Local timestamp of the user activity.</param> /// <param name="searchService">Search service.</param> /// <param name="knowledgeBaseSearchService">Knowledgebase search service.</param> /// <param name="activityStorageProvider">Activity storage provider.</param> /// <param name="appBaseUri">Application base uri.</param> /// <returns><see cref="Task"/> Returns MessagingExtensionResult which will be used for providing the card.</returns> public static async Task <MessagingExtensionResult> GetSearchResultAsync( string languageCode, string query, string commandId, int?count, int?skip, DateTimeOffset?localTimestamp, ISearchService searchService, IKnowledgeBaseSearchService knowledgeBaseSearchService, IActivityStorageProvider activityStorageProvider, string appBaseUri) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = AttachmentLayoutTypes.List, Attachments = new List <MessagingExtensionAttachment>(), }; IList <TicketEntity> searchServiceResults = new List <TicketEntity>(); // commandId should be equal to Id mentioned in Manifest file under composeExtensions section. switch (commandId) { case RecentCommandId: searchServiceResults = await searchService.SearchTicketsAsync(TicketSearchScope.RecentTickets, languageCode, query, count, skip).ConfigureAwait(false); composeExtensionResult = GetMessagingExtensionResult(commandId, localTimestamp, searchServiceResults, appBaseUri); break; case OpenCommandId: searchServiceResults = await searchService.SearchTicketsAsync(TicketSearchScope.UnAnsweredTickets, languageCode, query, count, skip).ConfigureAwait(false); composeExtensionResult = GetMessagingExtensionResult(commandId, localTimestamp, searchServiceResults, appBaseUri); break; case AssignedCommandId: searchServiceResults = await searchService.SearchTicketsAsync(TicketSearchScope.AnsweredTickets, languageCode, query, count, skip).ConfigureAwait(false); composeExtensionResult = GetMessagingExtensionResult(commandId, localTimestamp, searchServiceResults, appBaseUri); break; case KnowledgebaseQuestionCommandId: var azureSearchEntities = await knowledgeBaseSearchService.GetAzureSearchEntitiesAsync(query).ConfigureAwait(false); if (azureSearchEntities.Any()) { var activitiesData = await activityStorageProvider.GetActivityEntitiesAsync().ConfigureAwait(false); composeExtensionResult.Attachments = MessagingExtensionQnaCard.GetAllKbQuestionsCard(azureSearchEntities, activitiesData); } break; } return(composeExtensionResult); }
/// <summary> /// Get the results from Azure Search service and populate the result (card + preview). /// </summary> /// <param name="query">Query which the user had typed in Messaging Extension search field.</param> /// <param name="commandId">Command id to determine which tab in Messaging Extension has been invoked.</param> /// <param name="userObjectId">Azure Active Directory id of the user.</param> /// <param name="count">Number of search results to return.</param> /// <param name="localDateTime">Indicates local date and time of end user.</param> /// <returns><see cref="Task"/>Returns Messaging Extension result object, which will be used for providing the card.</returns> public async Task <MessagingExtensionResult> GetPostsAsync( string query, string commandId, string userObjectId, int count, DateTimeOffset?localDateTime) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = AttachmentLayoutTypes.List, Attachments = new List <MessagingExtensionAttachment>(), }; IEnumerable <EventEntity> trainingResults; SearchParametersDto searchParamsDto; // commandId should be equal to Id mentioned in Manifest file under composeExtensions section. switch (commandId?.ToUpperInvariant()) { case BotCommands.RecentTrainingsCommandId: searchParamsDto = new SearchParametersDto { SearchString = query, SearchResultsCount = count, SearchScope = EventSearchType.AllPublicPrivateEventsForUser, UserObjectId = userObjectId, }; trainingResults = await this.userEventSearchService.GetEventsAsync(searchParamsDto); await this.BindCategoryDetails(trainingResults); composeExtensionResult = MessagingExtensionCard.GetCard(trainingResults, this.applicationBasePath, this.localizer, localDateTime); break; case BotCommands.PopularTrainingsCommandId: searchParamsDto = new SearchParametersDto { SearchString = query, SearchResultsCount = count, SearchScope = EventSearchType.AllPublicPrivateEventsForUser, UserObjectId = userObjectId, SortByFilter = (int)SortBy.PopularityByRegisteredUsers, }; trainingResults = await this.userEventSearchService.GetEventsAsync(searchParamsDto); await this.BindCategoryDetails(trainingResults); composeExtensionResult = MessagingExtensionCard.GetCard(trainingResults, this.applicationBasePath, this.localizer, localDateTime); break; default: break; } return(composeExtensionResult); }
/// <summary> /// Get the results from Azure Search service and populate the result (card + preview). /// </summary> /// <param name="query">Query which the user had typed in Messaging Extension search field.</param> /// <param name="commandId">Command id to determine which tab in Messaging Extension has been invoked.</param> /// <param name="userObjectId">Azure Active Directory id of the user.</param> /// <param name="count">Number of search results to return.</param> /// <param name="skip">Number of search results to skip.</param> /// <returns><see cref="Task"/>Returns Messaging Extension result object, which will be used for providing the card.</returns> public async Task <MessagingExtensionResult> GetProjectSearchResultAsync( string query, string commandId, string userObjectId, int?count, int?skip) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = AttachmentLayoutTypes.List, Attachments = new List <MessagingExtensionAttachment>(), }; IEnumerable <ProjectEntity> projectResults; // commandId should be equal to Id mentioned in Manifest file under composeExtensions section. switch (commandId) { case Constants.AllProjectsCommandId: projectResults = await this.projectSearchService.GetProjectsAsync( ProjectSearchScope.AllProjects, query, userObjectId, count, skip); composeExtensionResult = this.GetProjectResult(projectResults); break; case Constants.JoinedProjectsCommandId: projectResults = await this.projectSearchService.GetProjectsAsync( ProjectSearchScope.JoinedProjects, userObjectId, userObjectId, count, skip); var filteredProjects = this.projectHelper.GetFilteredProjectsJoinedByUser(projectResults, userObjectId); composeExtensionResult = this.GetProjectResult(filteredProjects); break; case Constants.CreatedProjectsCommandId: projectResults = await this.projectSearchService.GetProjectsAsync( ProjectSearchScope.CreatedProjectsByUser, query, userObjectId, count, skip); composeExtensionResult = this.GetProjectResult(projectResults); break; } return(composeExtensionResult); }
/// <summary> /// Get the results from Azure search service and populate the result (card + preview). /// </summary> /// <param name="query">Query which the user had typed in message extension search.</param> /// <param name="commandId">Command id to determine which tab in message extension has been invoked.</param> /// <param name="count">Count for pagination.</param> /// <param name="skip">Skip for pagination.</param> /// <param name="searchService">Search service.</param> /// <param name="localizer">The current cultures' string localizer.</param> /// <param name="requestorId">Requester id of the user to get specific tickets.</param> /// <param name="onCallSMEUsers">OncallSMEUsers to give support from group-chat or on-call.</param> /// <returns><see cref="Task"/> Returns MessagingExtensionResult which will be used for providing the card.</returns> public static async Task <MessagingExtensionResult> GetSearchResultAsync( string query, string commandId, int?count, int?skip, ITicketSearchService searchService, IStringLocalizer <Strings> localizer, string requestorId = "", string onCallSMEUsers = "") { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = AttachmentLayoutTypes.List, Attachments = new List <MessagingExtensionAttachment>(), }; IList <TicketDetail> searchServiceResults; // commandId should be equal to Id mentioned in Manifest file under composeExtensions section. switch (commandId) { case Constants.UrgentCommandId: searchServiceResults = await searchService?.SearchTicketsAsync(TicketSearchScope.Acil, query, count, skip); composeExtensionResult = GetMessagingExtensionResult(searchServiceResults, localizer, commandId); break; case Constants.AssignedCommandId: searchServiceResults = await searchService?.SearchTicketsAsync(TicketSearchScope.Atanan, query, count, skip); composeExtensionResult = GetMessagingExtensionResult(searchServiceResults, localizer, commandId); break; case Constants.UnassignedCommandId: searchServiceResults = await searchService?.SearchTicketsAsync(TicketSearchScope.Atanmayan, query, count, skip); composeExtensionResult = GetMessagingExtensionResult(searchServiceResults, localizer, commandId); break; case Constants.ActiveCommandId: searchServiceResults = await searchService?.SearchTicketsAsync(TicketSearchScope.Aktif, query, count, skip, requestorId); composeExtensionResult = GetMessagingExtensionResult(searchServiceResults, localizer, commandId, onCallSMEUsers); break; case Constants.ClosedCommandId: searchServiceResults = await searchService?.SearchTicketsAsync(TicketSearchScope.Kapatılmış, query, count, skip, requestorId); composeExtensionResult = GetMessagingExtensionResult(searchServiceResults, localizer, commandId); break; } return(composeExtensionResult); }
public MessagingExtensionResponse GetComposeExtensionQueryResult(List <MessagingExtensionAttachment> composeExtensionAttachments) { MessagingExtensionResponse composeExtensionResponse = new MessagingExtensionResponse(); MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult(); composeExtensionResult.Type = "result"; composeExtensionResult.Attachments = composeExtensionAttachments; composeExtensionResult.AttachmentLayout = "list"; composeExtensionResponse.ComposeExtension = composeExtensionResult; return(composeExtensionResponse); }
protected async override Task <MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext <IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken) { var state = query.State; // Check the state value var tokenResponse = await GetTokenResponse(turnContext, state, cancellationToken); if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.Token)) { // There is no token, so the user has not signed in yet. // Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions var userTokenClient = turnContext.TurnState.Get <UserTokenClient>(); var resource = await userTokenClient.GetSignInResourceAsync(_connectionName, turnContext.Activity as Activity, null, cancellationToken).ConfigureAwait(false); var signInLink = resource.SignInLink; return(new MessagingExtensionResponse { ComposeExtension = new MessagingExtensionResult { Type = "auth", SuggestedActions = new MessagingExtensionSuggestedAction { Actions = new List <CardAction> { new CardAction { Type = ActionTypes.OpenUrl, Value = signInLink, Title = "Bot Service OAuth", }, }, }, }, }); } var client = new SimpleGraphClient(tokenResponse.Token); var profile = await client.GetMyProfile(); var heroCard = new ThumbnailCard { Title = "Thumbnail Card", Text = $"Hello, {profile.DisplayName}", Images = new List <CardImage> { new CardImage("https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png") }, }; var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard); var result = new MessagingExtensionResult("list", "result", new[] { attachments }); return(new MessagingExtensionResponse(result)); }
//protected override Task<MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext<IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken) //{ // var heroCard = new ThumbnailCard // { // Title = "Thumbnail Card", // Text = query.Url, // Images = new List<CardImage> { new CardImage("https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png") }, // }; // var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard); // var result = new MessagingExtensionResult("list", "result", new[] { attachments }); // return Task.FromResult(new MessagingExtensionResponse(result)); //} protected override Task <MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext <IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken) { var heroCard = new ThumbnailCard { Title = "Thumbnail Card", Text = query.Url, Images = new List <CardImage> { new CardImage("https://www.leaders-in-law.com/wp-content/uploads/2020/03/COVID-19.png") }, }; var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard); var result = new MessagingExtensionResult("list", "result", new[] { attachments }); return(Task.FromResult(new MessagingExtensionResponse(result))); }
public void MessagingExtensionResponseInits() { var composeExtension = new MessagingExtensionResult("list", "message", null, null, "happy dance"); var cacheInfo = new CacheInfo(); var msgExtResponse = new MessagingExtensionResponse(composeExtension) { CacheInfo = cacheInfo }; Assert.NotNull(msgExtResponse); Assert.IsType <MessagingExtensionResponse>(msgExtResponse); Assert.Equal(composeExtension, msgExtResponse.ComposeExtension); Assert.Equal(cacheInfo, msgExtResponse.CacheInfo); }
protected async override Task <MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext <IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken) { var tokenResponse = await GetTokenResponse(turnContext, query.State, cancellationToken); if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.Token)) { // There is no token, so the user has not signed in yet. // Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions var signInLink = await(turnContext.Adapter as IUserTokenProvider).GetOauthSignInLinkAsync(turnContext, _connectionName, cancellationToken); return(new MessagingExtensionResponse { ComposeExtension = new MessagingExtensionResult { Type = "auth", SuggestedActions = new MessagingExtensionSuggestedAction { Actions = new List <CardAction> { new CardAction { Type = ActionTypes.OpenUrl, Value = signInLink, Title = "Bot Service OAuth", }, }, }, }, }); } var client = new SimpleGraphClient(tokenResponse.Token); var profile = await client.GetMyProfile(); var imagelink = await client.GetPhotoAsync(); var heroCard = new ThumbnailCard { Title = "Thumbnail Card", Text = $"Hello {profile.DisplayName}", Images = new List <CardImage> { new CardImage(imagelink) } }; var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard); var result = new MessagingExtensionResult("list", "result", new[] { attachments }); return(new MessagingExtensionResponse(result)); }
protected override async Task <MessagingExtensionResponse> OnTeamsAppBasedLinkQueryAsync(ITurnContext <IInvokeActivity> turnContext, AppBasedLinkQuery query, CancellationToken cancellationToken) { var heroCard = new ThumbnailCard { Title = "Thumbnail Card", Text = query.Url, Images = new List <CardImage> { new CardImage("https://raw.githubusercontent.com/microsoft/botframework-sdk/master/icon.png") }, }; var attachments = new MessagingExtensionAttachment(HeroCard.ContentType, null, heroCard); var result = new MessagingExtensionResult(AttachmentLayoutTypes.List, "result", new[] { attachments }, null, "test unfurl"); return(new MessagingExtensionResponse(result)); }
protected override Activity CreateOAuthInvokeResponseActivity(DialogContext dc, CardAction cardAction) { var result = new MessagingExtensionResult { Type = MEResultResponseType.auth.ToString(), SuggestedActions = new MessagingExtensionSuggestedAction { Actions = new List <CardAction> { cardAction, }, }, }; return(CreateMessagingExtensionInvokeResponseActivity(dc, result)); }
/// <summary> /// Get the results from Azure search service and populate the result (card + preview). /// </summary> /// <param name="query">query which the user had typed in message extension search.</param> /// <param name="commandId">commandId to determine which tab in message extension has been invoked.</param> /// <param name="count">count for pagination.</param> /// <param name="skip">skip for pagination.</param> /// <param name="localTimestamp">Local timestamp of the user activity.</param> /// <returns><see cref="Task"/> returns MessagingExtensionResult which will be used for providing the card.</returns> public async Task <MessagingExtensionResult> GetSearchResultAsync(string query, string commandId, int?count, int?skip, DateTimeOffset?localTimestamp) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = "list", Attachments = new List <MessagingExtensionAttachment>(), }; IList <TicketEntity> searchServiceResults = new List <TicketEntity>(); // Enable prefix matches query = (query ?? string.Empty) + "*"; // commandId should be equal to Id mentioned in Manifest file under composeExtensions section switch (commandId) { case RecentCommandId: searchServiceResults = await this.searchService.SearchTicketsAsync(TicketSearchScope.RecentTickets, query, count, skip); break; case OpenCommandId: searchServiceResults = await this.searchService.SearchTicketsAsync(TicketSearchScope.OpenTickets, query, count, skip); break; case AssignedCommandId: searchServiceResults = await this.searchService.SearchTicketsAsync(TicketSearchScope.AssignedTickets, query, count, skip); break; } foreach (var ticket in searchServiceResults) { ThumbnailCard previewCard = new ThumbnailCard { Title = ticket.Title, Text = this.GetPreviewCardText(ticket, commandId, localTimestamp), }; var selectedTicketAdaptiveCard = new MessagingExtensionTicketsCard(ticket); composeExtensionResult.Attachments.Add(selectedTicketAdaptiveCard.ToAttachment(localTimestamp).ToMessagingExtensionAttachment(previewCard.ToAttachment())); } return(composeExtensionResult); }
public void MessagingExtensionActionResponseInits() { var task = new TaskModuleResponseBase("message"); var composeExtension = new MessagingExtensionResult("list", "message", null, null, "with a personality like sunshine"); var cacheInfo = new CacheInfo(); var msgExtActionResponse = new MessagingExtensionActionResponse(task, composeExtension) { CacheInfo = cacheInfo }; Assert.NotNull(msgExtActionResponse); Assert.IsType <MessagingExtensionActionResponse>(msgExtActionResponse); Assert.Equal(task, msgExtActionResponse.Task); Assert.Equal(composeExtension, msgExtActionResponse.ComposeExtension); Assert.Equal(cacheInfo, msgExtActionResponse.CacheInfo); }
/// <summary> /// Get messaging extension search result based on user search query and command. /// </summary> /// <param name="teamId">Team Id where bot is installed.</param> /// <param name="searchQuery">User search query text.</param> /// <param name="commandId">Messaging extension command id e.g. recentActivities or allActivities.</param> /// <param name="count">Count for pagination in Messaging extension.</param> /// <param name="skip">Skip for pagination in Messaging extension.</param> /// <returns>A task that represents compose extension result with activities.</returns> private async Task <MessagingExtensionResult> GetSearchResultAsync(string teamId, string searchQuery, string commandId, int count, int skip) { try { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult(); IList <GroupActivityEntity> groupActivities = await this.groupActivityStorageHelper.GetGroupActivityEntityDetailAsync(teamId); // On initial run searchQuery value is "true". if (searchQuery != "true") { this.logger.LogInformation($"search query entered by user is {searchQuery} for {teamId}"); groupActivities = groupActivities.Where(x => x.GroupActivityTitle.Contains(searchQuery, StringComparison.OrdinalIgnoreCase)).ToList(); } // If no activities found for a team. if (groupActivities.Count() <= 0) { composeExtensionResult.Type = MessagingExtensionMessageType; composeExtensionResult.Text = Strings.NoActivitiesFoundText; this.logger.LogInformation($"No activities found for {teamId}"); return(composeExtensionResult); } composeExtensionResult.Type = MessagingExtenstionResultType; composeExtensionResult.AttachmentLayout = AttachmentLayoutTypes.List; switch (commandId) { case RecentCommandId: composeExtensionResult.Attachments = MessagingExtensionCard.GetGroupActivityCard(groupActivities.OrderByDescending(groupActivity => groupActivity.Timestamp).Skip(skip).Take(count).ToList()); break; case AllCommandId: composeExtensionResult.Attachments = MessagingExtensionCard.GetGroupActivityCard(groupActivities.Skip(skip).Take(count).ToList()); break; } return(composeExtensionResult); } catch (Exception ex) { this.logger.LogError(ex, $"Error while generating result for messaging extension for {commandId} for {teamId}"); return(null); } }
private MessagingExtensionResponse GetContentCardResponse(Resource resource) { // Prepare attachments var expandedCard = this.cardFactory.GetResourceContentCard(resource); var collapsedCard = this.cardFactory.GetResourcePreviewCard(resource); var attachments = new MessagingExtensionAttachment(expandedCard.ContentType, null /*contentUrl*/, expandedCard.Content) { Preview = collapsedCard, }; // ME result. var result = new MessagingExtensionResult( AttachmentLayoutTypes.List, "result" /*type*/, new[] { attachments }); return(new MessagingExtensionResponse(result)); }
protected override async Task <MessagingExtensionActionResponse> OnTeamsMessagingExtensionBotMessagePreviewSendAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken) { // The data has been returned to the bot in the action structure. var activityPreview = action.BotActivityPreview[0]; var attachmentContent = activityPreview.Attachments[0].Content; var previewedCard = JsonConvert.DeserializeObject <AdaptiveCard>(attachmentContent.ToString(), new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); var exampleData = AdaptiveCardHelper.CreateExampleData(previewedCard); // This is a send so we are done and we will create the adaptive card editor. var adaptiveCard = AdaptiveCardHelper.CreateAdaptiveCard(exampleData); var message = MessageFactory.Attachment(new Attachment { ContentType = AdaptiveCard.ContentType, Content = adaptiveCard }); // THIS WILL WORK IF THE BOT IS INSTALLED. (GetMembers() will NOT throw if the bot is installed.) // (The application should fail gracefully.) var channelId = turnContext.Activity.TeamsGetChannelId(); var conversationParameters = new ConversationParameters { IsGroup = true, ChannelData = new TeamsChannelData { Channel = new ChannelInfo(channelId) }, Activity = (Activity)message, }; var connectorClient = turnContext.TurnState.Get <IConnectorClient>(); // This call does NOT send the outbound Activity is not being sent through the middleware stack. var conversationResourceResponse = await connectorClient.Conversations.CreateConversationAsync(conversationParameters, cancellationToken).ConfigureAwait(false); var attachments = new MessagingExtensionAttachment(AdaptiveCard.ContentType, null, adaptiveCard); var result = new MessagingExtensionResult(AttachmentLayoutTypes.List, "result", new[] { attachments }, null); return(new MessagingExtensionActionResponse() { ComposeExtension = result, }); }
/// <summary> /// Get the results from Azure Search service and populate the result (card + preview). /// </summary> /// <param name="query">Query which the user had typed in Messaging Extension search field.</param> /// <param name="commandId">Command id to determine which tab in Messaging Extension has been invoked.</param> /// <param name="userObjectId">Azure Active Directory id of the user.</param> /// <param name="count">Number of search results to return.</param> /// <param name="skip">Number of search results to skip.</param> /// <returns><see cref="Task"/>Returns Messaging Extension result object, which will be used for providing the card.</returns> public async Task <MessagingExtensionResult> GetTeamPostSearchResultAsync( string query, string commandId, string userObjectId, int?count, int?skip) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = AttachmentLayoutTypes.List, Attachments = new List <MessagingExtensionAttachment>(), }; IEnumerable <IdeaEntity> teamPostResults; // commandId should be equal to Id mentioned in Manifest file under composeExtensions section. switch (commandId?.ToUpperInvariant()) { case Constants.AllItemsIdeasCommandId: // Get all ideas teamPostResults = await this.teamIdeaSearchService.GetTeamIdeasAsync(IdeaSearchScope.AllItems, query, userObjectId, count, skip); composeExtensionResult = await this.GetTeamPostResultAsync(teamPostResults); break; case Constants.PendingIdeaCommandId: // Get pending ideas. teamPostResults = await this.teamIdeaSearchService.GetTeamIdeasAsync(IdeaSearchScope.Pending, query, userObjectId, count, skip); composeExtensionResult = await this.GetTeamPostResultAsync(teamPostResults); break; case Constants.ApprovedIdeaCommandId: // Get approved ideas. teamPostResults = await this.teamIdeaSearchService.GetTeamIdeasAsync(IdeaSearchScope.Approved, query, userObjectId, count, skip); composeExtensionResult = await this.GetTeamPostResultAsync(teamPostResults); break; } return(composeExtensionResult); }
public MessagingExtensionResponse GetConfig() { string configUrl = ConfigurationManager.AppSettings["BaseUri"].ToString() + "/composeExtensionSettings.html"; CardAction configExp = new CardAction(ActionTypes.OpenUrl, "Config", null, null, null, configUrl); List <CardAction> cardActions = new List <CardAction>(); cardActions.Add(configExp); MessagingExtensionResponse composeExtensionResponse = new MessagingExtensionResponse(); MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult(); MessagingExtensionSuggestedAction objSuggestedAction = new MessagingExtensionSuggestedAction(); objSuggestedAction.Actions = cardActions; composeExtensionResult.SuggestedActions = objSuggestedAction; composeExtensionResult.Type = "config"; composeExtensionResponse.ComposeExtension = composeExtensionResult; return(composeExtensionResponse); }