Exemplo n.º 1
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);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Gets the image URL asynchronously.
        /// </summary>
        /// <param name="pageIds">The page ids.</param>
        /// <returns>Image url map.</returns>
        private async Task <IDictionary <string, string> > GetImageUrlAsync(IList <string> pageIds)
        {
            string pageIdQuery = string.Join("|", pageIds);
            IDictionary <string, string> result      = new Dictionary <string, string>();
            WikipediaQueryResult         queryResult = await this.InvokeWikipediaApiAsync(ImageSearchUrl + pageIdQuery).ConfigureAwait(false);

            if (queryResult != null && queryResult.Query != null)
            {
                foreach (WikipediaPage page in queryResult.Query.Pages)
                {
                    if (page.Thumbnail != null)
                    {
                        result.Add(page.Pageid, page.Thumbnail.Source);
                    }
                }
            }

            return(result);
        }