diff --git a/DiscordChatExporter/Services/ExportService.cs b/DiscordChatExporter/Services/ExportService.cs index 20e22e04..331b7fe6 100644 --- a/DiscordChatExporter/Services/ExportService.cs +++ b/DiscordChatExporter/Services/ExportService.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Reflection; using System.Resources; using System.Text.RegularExpressions; +using System.Threading.Tasks; using DiscordChatExporter.Models; using HtmlAgilityPack; using Tyrrrz.Extensions; @@ -18,104 +19,109 @@ namespace DiscordChatExporter.Services _settingsService = settingsService; } - public void Export(string filePath, ChannelChatLog log, Theme theme) + public Task ExportAsync(string filePath, ChannelChatLog log, Theme theme) { - var doc = GetTemplate(); - var style = GetStyle(theme); - var dateFormat = _settingsService.DateFormat; - - // Set theme - var themeHtml = doc.GetElementbyId("theme"); - themeHtml.InnerHtml = style; - - // Title - var titleHtml = doc.DocumentNode.Element("html").Element("head").Element("title"); - titleHtml.InnerHtml = $"{log.Guild.Name} - {log.Channel.Name}"; - - // Info - var infoHtml = doc.GetElementbyId("info"); - var infoLeftHtml = infoHtml.AppendChild(HtmlNode.CreateNode("
")); - infoLeftHtml.AppendChild(HtmlNode.CreateNode( - $"")); - var infoRightHtml = infoHtml.AppendChild(HtmlNode.CreateNode("
")); - infoRightHtml.AppendChild(HtmlNode.CreateNode( - $"
{log.Guild.Name}
")); - infoRightHtml.AppendChild(HtmlNode.CreateNode( - $"
{log.Channel.Name}
")); - infoRightHtml.AppendChild(HtmlNode.CreateNode( - $"
{log.MessageGroups.SelectMany(g => g.Messages).Count():N0} messages
")); - - // Log - var logHtml = doc.GetElementbyId("log"); - foreach (var messageGroup in log.MessageGroups) + return Task.Run(() => { - // Container - var messageHtml = logHtml.AppendChild(HtmlNode.CreateNode("
")); + var doc = GetTemplate(); + var style = GetStyle(theme); + var dateFormat = _settingsService.DateFormat; - // Left - var messageLeftHtml = messageHtml.AppendChild(HtmlNode.CreateNode("
")); + // Set theme + var themeHtml = doc.GetElementbyId("theme"); + themeHtml.InnerHtml = style; - // Avatar - messageLeftHtml.AppendChild( - HtmlNode.CreateNode($"")); + // Title + var titleHtml = doc.DocumentNode.Element("html").Element("head").Element("title"); + titleHtml.InnerHtml = $"{log.Guild.Name} - {log.Channel.Name}"; - // Right - var messageRightHtml = messageHtml.AppendChild(HtmlNode.CreateNode("
")); + // Info + var infoHtml = doc.GetElementbyId("info"); + var infoLeftHtml = infoHtml.AppendChild(HtmlNode.CreateNode("
")); + infoLeftHtml.AppendChild(HtmlNode.CreateNode( + $"")); + var infoRightHtml = infoHtml.AppendChild(HtmlNode.CreateNode("
")); + infoRightHtml.AppendChild(HtmlNode.CreateNode( + $"
{log.Guild.Name}
")); + infoRightHtml.AppendChild(HtmlNode.CreateNode( + $"
{log.Channel.Name}
")); + infoRightHtml.AppendChild(HtmlNode.CreateNode( + $"
{log.MessageGroups.SelectMany(g => g.Messages).Count():N0} messages
")); - // Author - var authorName = HtmlDocument.HtmlEncode(messageGroup.Author.Name); - messageRightHtml.AppendChild(HtmlNode.CreateNode($"{authorName}")); - - // Date - var timeStamp = HtmlDocument.HtmlEncode(messageGroup.TimeStamp.ToString(dateFormat)); - messageRightHtml.AppendChild(HtmlNode.CreateNode($"{timeStamp}")); - - // Individual messages - foreach (var message in messageGroup.Messages) + // Log + var logHtml = doc.GetElementbyId("log"); + foreach (var messageGroup in log.MessageGroups) { - // Content - if (message.Content.IsNotBlank()) - { - var content = FormatMessageContent(message.Content); - var contentHtml = - messageRightHtml.AppendChild( - HtmlNode.CreateNode($"
{content}
")); + // Container + var messageHtml = logHtml.AppendChild(HtmlNode.CreateNode("
")); - // Edited timestamp - if (message.EditedTimeStamp != null) - { - contentHtml.AppendChild( - HtmlNode.CreateNode( - $"(edited)")); - } - } + // Left + var messageLeftHtml = + messageHtml.AppendChild(HtmlNode.CreateNode("
")); - // Attachments - foreach (var attachment in message.Attachments) + // Avatar + messageLeftHtml.AppendChild( + HtmlNode.CreateNode($"")); + + // Right + var messageRightHtml = + messageHtml.AppendChild(HtmlNode.CreateNode("
")); + + // Author + var authorName = HtmlDocument.HtmlEncode(messageGroup.Author.Name); + messageRightHtml.AppendChild(HtmlNode.CreateNode($"{authorName}")); + + // Date + var timeStamp = HtmlDocument.HtmlEncode(messageGroup.TimeStamp.ToString(dateFormat)); + messageRightHtml.AppendChild(HtmlNode.CreateNode($"{timeStamp}")); + + // Individual messages + foreach (var message in messageGroup.Messages) { - if (attachment.Type == AttachmentType.Image) + // Content + if (message.Content.IsNotBlank()) { - messageRightHtml.AppendChild( - HtmlNode.CreateNode("
" + - $"" + - $"" + - "" + - "
")); + var content = FormatMessageContent(message.Content); + var contentHtml = + messageRightHtml.AppendChild( + HtmlNode.CreateNode($"
{content}
")); + + // Edited timestamp + if (message.EditedTimeStamp != null) + { + contentHtml.AppendChild( + HtmlNode.CreateNode( + $"(edited)")); + } } - else + + // Attachments + foreach (var attachment in message.Attachments) { - messageRightHtml.AppendChild( - HtmlNode.CreateNode("
" + - $"" + - $"Attachment: {attachment.FileName} ({NormalizeFileSize(attachment.FileSize)})" + - "" + - "
")); + if (attachment.Type == AttachmentType.Image) + { + messageRightHtml.AppendChild( + HtmlNode.CreateNode("
" + + $"" + + $"" + + "" + + "
")); + } + else + { + messageRightHtml.AppendChild( + HtmlNode.CreateNode("
" + + $"" + + $"Attachment: {attachment.FileName} ({NormalizeFileSize(attachment.FileSize)})" + + "" + + "
")); + } } } } - } - doc.Save(filePath); + doc.Save(filePath); + }); } } diff --git a/DiscordChatExporter/Services/IExportService.cs b/DiscordChatExporter/Services/IExportService.cs index a0cc54b6..c92ee65d 100644 --- a/DiscordChatExporter/Services/IExportService.cs +++ b/DiscordChatExporter/Services/IExportService.cs @@ -1,9 +1,10 @@ -using DiscordChatExporter.Models; +using System.Threading.Tasks; +using DiscordChatExporter.Models; namespace DiscordChatExporter.Services { public interface IExportService { - void Export(string filePath, ChannelChatLog log, Theme theme); + Task ExportAsync(string filePath, ChannelChatLog log, Theme theme); } } \ No newline at end of file diff --git a/DiscordChatExporter/ViewModels/MainViewModel.cs b/DiscordChatExporter/ViewModels/MainViewModel.cs index 178b9098..57dd254c 100644 --- a/DiscordChatExporter/ViewModels/MainViewModel.cs +++ b/DiscordChatExporter/ViewModels/MainViewModel.cs @@ -176,7 +176,7 @@ namespace DiscordChatExporter.ViewModels var chatLog = new ChannelChatLog(SelectedGuild, channel, messageGroups); // Export - _exportService.Export(sfd.FileName, chatLog, _settingsService.Theme); + await _exportService.ExportAsync(sfd.FileName, chatLog, _settingsService.Theme); // Show dialog MessengerInstance.Send(new ShowExportDoneMessage(sfd.FileName));