Ejemplo n.º 1
0
        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        public async Task <HttpResponseMessage> Post([FromBody] Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                string currentLanguageCode = "en", region = "us";
                string userText = activity.Text;

                ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));

                // Send typing activity
                Activity typingReply = activity.CreateReply();
                typingReply.Type = ActivityTypes.Typing;
                connector.Conversations.ReplyToActivityAsync(typingReply);

                // First, detect user language
                TextAnalyticLanguageResponse languageResponse = await Utilities.Utils.GetTextLanaguage(activity.Text);

                if (languageResponse.documents != null && languageResponse.documents.Count > 0)
                {
                    currentLanguageCode = languageResponse.documents[0].detectedLanguages[0].iso6391Name;
                    Activity languageReply = activity.CreateReply("Found language: " + currentLanguageCode);
                    await connector.Conversations.ReplyToActivityAsync(languageReply);
                }

                // If detected language is different than english, then translate it
                if (currentLanguageCode != "en")
                {
                    userText = await Utilities.Utils.TranslateText(userText, currentLanguageCode, "en");

                    Activity translatedReply = activity.CreateReply("Translated text: " + userText);
                    await connector.Conversations.ReplyToActivityAsync(translatedReply);
                }

                //await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
                MultilingualBotCommon.LuisResponse dto = await Utilities.Utils.GetEntityFromLUIS(userText);

                if (dto.entities.Length > 0)
                {
                    region = dto.entities[0].entity;
                }

                Activity reply = activity.CreateReply("Ok! Checking if I have some news from '" + region + "'...");
                await connector.Conversations.ReplyToActivityAsync(reply);

                connector.Conversations.ReplyToActivityAsync(typingReply);

                NewsResponses news = await Utilities.Utils.GetNews(region, "", currentLanguageCode);

                if (news.UserMessage != "")
                {
                    // There is a message for the user, show it
                    Activity messageReply = activity.CreateReply(news.UserMessage);
                    await connector.Conversations.ReplyToActivityAsync(messageReply);
                }

                // Show the news source info that was returned
                Activity         newsSourceReply  = activity.CreateReply("");
                List <CardImage> newsSourceImages = new List <CardImage>();
                newsSourceImages.Add(new CardImage(url: news.SourceImageLink));

                List <CardAction> newsSourceCardButtons = new List <CardAction>();

                CardAction newsSourceButton = new CardAction()
                {
                    Value = news.SourceHomepageLink,
                    Type  = "openUrl",
                    Title = news.SourceName
                };

                newsSourceCardButtons.Add(newsSourceButton);

                ThumbnailCard newsSourceCard = new ThumbnailCard()
                {
                    Title    = $"Found news from {news.SourceName}",
                    Subtitle = $"{news.SourceName} Homepage",
                    Images   = newsSourceImages,
                    Buttons  = newsSourceCardButtons
                };

                Attachment newsSourceAttachment = newsSourceCard.ToAttachment();
                newsSourceReply.Attachments.Add(newsSourceAttachment);
                await connector.Conversations.ReplyToActivityAsync(newsSourceReply);

                // Now show the real news results
                Activity newsReply = activity.CreateReply("News results");
                newsReply.AttachmentLayout = "carousel";

                newsReply.Attachments = new List <Attachment>();

                foreach (NewsResponse article in news.Responses)
                {
                    List <CardImage> cardImages = new List <CardImage>();
                    cardImages.Add(new CardImage(url: article.imageLink));

                    List <CardAction> cardButtons = new List <CardAction>();

                    CardAction plButton = new CardAction()
                    {
                        Value = article.articleLink,
                        Type  = "openUrl",
                        Title = news.SourceName
                    };

                    cardButtons.Add(plButton);

                    HeroCard plCard = new HeroCard()
                    {
                        Title    = article.title,
                        Subtitle = article.description,
                        Images   = cardImages,
                        Buttons  = cardButtons
                    };

                    Attachment plAttachment = plCard.ToAttachment();
                    newsReply.Attachments.Add(plAttachment);
                }

                await connector.Conversations.ReplyToActivityAsync(newsReply);
            }
            else
            {
                HandleSystemMessage(activity);
            }

            var response = Request.CreateResponse(HttpStatusCode.OK);

            return(response);
        }
Ejemplo n.º 2
0
        public static async Task <NewsResponses> GetNews(string region, string inputLanguage, string outputLanguage)
        {
            NewsResponses responses = new NewsResponses();

            responses.SourceHomepageLink = "https://www.nytimes.com";
            responses.SourceName         = "The New York Times";
            responses.SourceImageLink    = "https://upload.wikimedia.org/wikipedia/commons/7/77/The_New_York_Times_logo.png";
            string requestUri = "http://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml";

            if (region.ToLower() == "spain")
            {
                responses.SourceName         = "EL PAÍS";
                responses.SourceHomepageLink = "https://elpais.com/";
                responses.SourceImageLink    = "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/El_Pais_logo_2007.svg/1024px-El_Pais_logo_2007.svg.png";
                requestUri = "http://ep00.epimg.net/rss/tags/ultimas_noticias.xml";
            }
            else if (region.ToLower() == "france")
            {
                responses.SourceHomepageLink = "http://www.lemonde.fr/";
                responses.SourceName         = "Le Monde.fr";
                responses.SourceImageLink    = "http://s1.dmcdn.net/CAp4m/240x240-WTD.jpg";
                requestUri = "http://www.lemonde.fr/rss/une.xml";
            }

            else if (region.ToLower() != "us")
            {
                responses.UserMessage = "Sorry, I don't know that location!  I'm still learning, but in the meantime here is the news from the New York Times.  Check back soon for your location, I get updated very often!";
            }

            using (HttpClient client = new HttpClient())
            {
                string rssContent = await client.GetStringAsync(requestUri);

                if (!String.IsNullOrEmpty(rssContent))
                {
                    List <string> translationTexts = new List <string>();

                    XNamespace media = "http://search.yahoo.com/mrss/";
                    XDocument  doc   = XDocument.Parse(rssContent);

                    List <XElement> items = doc.Descendants("item").ToList <XElement>();

                    foreach (XElement item in items)
                    {
                        string title       = item.Descendants("title").FirstOrDefault <XElement>().Value;
                        string description = item.Descendants("description").FirstOrDefault <XElement>().Value;
                        string link        = item.Descendants("link").FirstOrDefault <XElement>().Value;
                        string imageLink   = "";

                        XElement imageElem = item.Descendants(media + "content").FirstOrDefault <XElement>();

                        if (imageElem != null)
                        {
                            imageLink = imageElem.Attribute("url").Value;
                        }

                        //if (outputLanguage != "en")
                        //{
                        //    title = await TranslateText(title, "en", outputLanguage);
                        //    description = await TranslateText(description, "en", outputLanguage);
                        //}

                        // add to translation collection
                        translationTexts.Add(title);
                        translationTexts.Add(description);

                        responses.Responses.Add(new NewsResponse()
                        {
                            title       = title,
                            description = description,
                            articleLink = link,
                            imageLink   = imageLink
                        });

                        if (responses.Responses.Count == 5)
                        {
                            // jump out after 10, is enough news for one response
                            break;
                        }
                    }

                    if (inputLanguage != outputLanguage)
                    {
                        await Utilities.Utils.TranslateTexts(translationTexts, inputLanguage, outputLanguage);

                        int textCounter = 0;

                        foreach (NewsResponse response in responses.Responses)
                        {
                            response.title       = translationTexts[textCounter];
                            response.description = translationTexts[textCounter + 1];

                            textCounter = textCounter + 2;
                        }
                    }
                }
            }

            return(responses);
        }