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