private string MessageDetails(IMessageDetails message, bool isRoot, bool threadView = false) { var prefix = isRoot ? string.Empty : threadView ? " " : " "; var messageTextPrefix = isRoot ? string.Empty : threadView ? ">> " : ">> "; var str = new StringBuilder(); if (isRoot && !string.IsNullOrEmpty(message.Subject)) { str.AppendLine($"{prefix}Subject: {message.Subject}"); } str.AppendLine($"{messageTextPrefix}Message text: {message.Body.Content}"); str.AppendLine($"{prefix}- posted at {message.CreatedDateTime.ToInternational()}"); if (message.LastModifiedDateTime.HasValue) { str.AppendLine($"{prefix}- last modified at {message.LastModifiedDateTime.ToInternational()}"); } if (message.DeletedDateTime.HasValue) { str.AppendLine($"{prefix}- deleted at {message.DeletedDateTime.ToInternational()}"); } if (message.From.Application != null) { str.AppendLine($"{prefix}- by {message.From.Application.DisplayName}"); } if (message.From.Conversation != null) { str.AppendLine($"{prefix}- by {message.From.Conversation.DisplayName}"); } if (message.From.User != null) { str.AppendLine($"{prefix}- by {message.From.User.DisplayName}"); } if (message.From.Device != null) { str.AppendLine($"{prefix}- by {message.From.Device.DisplayName}"); } str.AppendLine($"{prefix}- priority - {message.Importance}"); if (message.Reactions != null && message.Reactions.Any()) { var groups = message.Reactions.GroupBy(c => c.ReactionType).ToList(); str.AppendLine($"{prefix}- reactions: {string.Join(", ", groups.Select(c => $"{c.Key}({c.Count()})").ToList())}"); } if (message.Attachments != null && message.Attachments.Any()) { str.AppendLine($"{prefix}- attachments:"); message.Attachments.ToList().ForEach(c => { var ctp = !string.IsNullOrEmpty(c.ContentType) ? $"ContentType: {c.ContentType}" : string.Empty; var content = !string.IsNullOrEmpty(c.Content) ? Regex.Replace($"Content: {c.Content?.Replace(Environment.NewLine, " ")} ", @"\s+", " ", RegexOptions.Multiline) : string.Empty; var url = !string.IsNullOrEmpty(c.ContentUrl) ? $"ContentUrl: {c.ContentUrl} " : string.Empty; var name = !string.IsNullOrEmpty(c.Name) ? $"Name: {c.Name} " : string.Empty; var thumbnailUrl = !string.IsNullOrEmpty(c.ThumbnailUrl) ? $"ThumbnailUrl: {c.ThumbnailUrl} " : string.Empty; str.AppendLine($"{prefix}{prefix}{url}{content}{ctp}{name}{thumbnailUrl}"); }); } return(str.ToString()); }
private async Task PrepareImageForMessage(Func <Task <string> > tokenProvider, IMessageDetails message, IBrowsingContext context) { var parser = context.GetService <IHtmlParser>(); var document = parser.ParseDocument(message.Body.Content); var images = document.QuerySelectorAll("img[src]"); var urls = new List <string>(); foreach (var img in images) { urls.Add(img.GetAttribute("src")); // fixing max-width for big images var style = (img.GetAttribute("style") ?? string.Empty) + "; max-width:100%!important;"; img.SetAttribute("style", style); } foreach (var url in urls) { var base64 = await imagesService.GetBase64Image(tokenProvider, url, graphBaseEndpoint); message.Body.Content = document.ToHtml(); message.Body.Content = message.Body.Content.Replace(url, base64); } }
/// <summary> /// Prepares the message details. /// </summary> /// <param name="message">The message.</param> /// <param name="isRoot">if set to <c>true</c> [is root].</param> /// <param name="messageTemplate">The message template.</param> /// <param name="threadView">if set to <c>true</c> [thread view].</param> /// <returns></returns> protected HtmlNode PrepareMessageDetails(IMessageDetails message, bool isRoot, string messageTemplate, bool threadView = false) { HtmlDocument messageHtml = new HtmlDocument(); messageHtml.LoadHtml(messageTemplate); // Root element of message var messageNode = messageHtml.GetElementbyId("message-ctn"); if (messageNode != null) { // type of message -> for class string messageNodeClass = string.Empty; if (isRoot && threadView) { messageNodeClass = "root-thread-message"; } else if (threadView) { messageNodeClass = "thread-message"; } else { messageNodeClass = "no-thread-message"; } messageNode.SetAttributeValue("class", messageNodeClass); messageNode.Attributes["id"].Remove(); var messageContentNode = messageHtml.GetElementbyId("message-content"); if (messageContentNode != null) { messageContentNode.SetAttributeValue("class", $"message-content-{message.Importance}"); messageContentNode.Attributes["id"].Remove(); } // Setup message author in html var authorNode = messageHtml.GetElementbyId("message-author"); if (authorNode != null) { var author = " "; if (message.From?.Application != null) { author = message.From.Application.DisplayName; } if (message.From?.Conversation != null) { author = message.From.Conversation.DisplayName; } if (message.From?.User != null) { author = message.From.User.DisplayName; } if (message.From?.Device != null) { author = message.From.Device.DisplayName; } authorNode.AppendChild(HtmlNode.CreateNode(author)); authorNode.Attributes["id"].Remove(); } // Setup message creation date in html var createdDateNode = messageHtml.GetElementbyId("message-created-time"); if (createdDateNode != null) { createdDateNode.AppendChild(HtmlNode.CreateNode(message.CreatedDateTime.ToInternational())); createdDateNode.Attributes["id"].Remove(); } var modifiedDateNode = messageHtml.GetElementbyId("message-modified-time"); if (modifiedDateNode != null) { if (message.LastModifiedDateTime.HasValue) { modifiedDateNode.AppendChild(HtmlNode.CreateNode(message.LastModifiedDateTime.ToInternational())); modifiedDateNode.Attributes["id"].Remove(); } else { modifiedDateNode.Remove(); } } var deletedDateNode = messageHtml.GetElementbyId("message-deleted-time"); if (deletedDateNode != null) { if (message.LastModifiedDateTime.HasValue) { deletedDateNode.AppendChild(HtmlNode.CreateNode(message.LastModifiedDateTime.ToInternational())); deletedDateNode.Attributes["id"].Remove(); } else { deletedDateNode.Remove(); } } var messageTextNode = messageHtml.GetElementbyId("message-text"); if (messageTextNode != null) { if (!string.IsNullOrEmpty(message.Body.Content)) { messageTextNode.AppendChild(HtmlNode.CreateNode(message.Body.Content)); messageTextNode.Attributes["id"].Remove(); } else { messageTextNode.Remove(); } } var reactionsNode = messageHtml.GetElementbyId("message-reactions"); if (reactionsNode != null) { if (message.Reactions != null && message.Reactions.Any()) { var groups = message.Reactions.GroupBy(c => c.ReactionType).ToList(); reactionsNode.AppendChild(HtmlNode.CreateNode($"Reactions: {string.Join(", ", groups.Select(c => $"{c.Key}({c.Count()})").ToList())}")); reactionsNode.Attributes["id"].Remove(); } else { reactionsNode.Remove(); } } var attacmentsNode = messageHtml.GetElementbyId("message-attachments"); if (attacmentsNode != null) { if (message.Attachments != null && message.Attachments.Any()) { message.Attachments.ToList().ForEach(c => { var attachment = HtmlNode.CreateNode($"<span class=\"attachment\"></span>"); var ctp = !string.IsNullOrEmpty(c.ContentType) ? $"ContentType: {c.ContentType}" : string.Empty; var content = !string.IsNullOrEmpty(c.Content) ? Regex.Replace($"Content: {c.Content?.Replace(Environment.NewLine, " ")} ", @"\s+", " ", RegexOptions.Multiline) : string.Empty; var url = !string.IsNullOrEmpty(c.ContentUrl) ? $"ContentUrl: {c.ContentUrl} " : string.Empty; var name = !string.IsNullOrEmpty(c.Name) ? $"Name: {c.Name} " : string.Empty; var thumbnailUrl = !string.IsNullOrEmpty(c.ThumbnailUrl) ? $"ThumbnailUrl: {c.ThumbnailUrl} " : string.Empty; attachment.AppendChild(HtmlNode.CreateNode($"{url}{content}{ctp}{name}{thumbnailUrl}")); attacmentsNode.AppendChild(attachment); }); attacmentsNode.Attributes["id"].Remove(); } else { attacmentsNode.Remove(); } } } return(messageHtml.DocumentNode); }