Пример #1
0
        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);
            }
        }
Пример #3
0
        /// <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);
        }