Exemple #1
0
        /// <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);
        }
Exemple #7
0
        /// <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)} &nbsp;|&nbsp; {HttpUtility.HtmlEncode(resource.Grade.GradeName)} &nbsp;|&nbsp; {HttpUtility.HtmlEncode(resourceModuleMapping.Count())} items</p>",
                };

                composeExtensionResult.Attachments.Add(new Attachment
                {
                    ContentType = AdaptiveCard.ContentType,
                    Content     = adaptiveCard,
                }.ToMessagingExtensionAttachment(previewCard.ToAttachment()));
            }

            return(composeExtensionResult);
        }
Exemple #9
0
        /// <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);
        }
Exemple #11
0
        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);
        }
Exemple #12
0
        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);
        }
Exemple #16
0
        /// <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);
        }
Exemple #18
0
        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));
        }
Exemple #22
0
        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));
        }
Exemple #23
0
        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,
            });
        }
Exemple #29
0
        /// <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);
        }