ExportService is pseudo async now

pull/17/head
Alexey Golub 7 years ago
parent b7979d6d1f
commit d8db4fca90

@ -3,6 +3,7 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using System.Resources; using System.Resources;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks;
using DiscordChatExporter.Models; using DiscordChatExporter.Models;
using HtmlAgilityPack; using HtmlAgilityPack;
using Tyrrrz.Extensions; using Tyrrrz.Extensions;
@ -18,104 +19,109 @@ namespace DiscordChatExporter.Services
_settingsService = settingsService; _settingsService = settingsService;
} }
public void Export(string filePath, ChannelChatLog log, Theme theme) public Task ExportAsync(string filePath, ChannelChatLog log, Theme theme)
{ {
var doc = GetTemplate(); return Task.Run(() =>
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("<div class=\"info-left\"></div>"));
infoLeftHtml.AppendChild(HtmlNode.CreateNode(
$"<img class=\"guild-icon\" src=\"{log.Guild.IconUrl}\" />"));
var infoRightHtml = infoHtml.AppendChild(HtmlNode.CreateNode("<div class=\"info-right\"></div>"));
infoRightHtml.AppendChild(HtmlNode.CreateNode(
$"<div class=\"guild-name\">{log.Guild.Name}</div>"));
infoRightHtml.AppendChild(HtmlNode.CreateNode(
$"<div class=\"channel-name\">{log.Channel.Name}</div>"));
infoRightHtml.AppendChild(HtmlNode.CreateNode(
$"<div class=\"misc\">{log.MessageGroups.SelectMany(g => g.Messages).Count():N0} messages</div>"));
// Log
var logHtml = doc.GetElementbyId("log");
foreach (var messageGroup in log.MessageGroups)
{ {
// Container var doc = GetTemplate();
var messageHtml = logHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg\"></div>")); 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("<div class=\"info-left\"></div>"));
infoLeftHtml.AppendChild(HtmlNode.CreateNode(
$"<img class=\"guild-icon\" src=\"{log.Guild.IconUrl}\" />"));
var infoRightHtml = infoHtml.AppendChild(HtmlNode.CreateNode("<div class=\"info-right\"></div>"));
infoRightHtml.AppendChild(HtmlNode.CreateNode(
$"<div class=\"guild-name\">{log.Guild.Name}</div>"));
infoRightHtml.AppendChild(HtmlNode.CreateNode(
$"<div class=\"channel-name\">{log.Channel.Name}</div>"));
infoRightHtml.AppendChild(HtmlNode.CreateNode(
$"<div class=\"misc\">{log.MessageGroups.SelectMany(g => g.Messages).Count():N0} messages</div>"));
// Log
var logHtml = doc.GetElementbyId("log");
foreach (var messageGroup in log.MessageGroups)
{
// Container
var messageHtml = logHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg\"></div>"));
// Left // Left
var messageLeftHtml = messageHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg-left\"></div>")); var messageLeftHtml =
messageHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg-left\"></div>"));
// Avatar // Avatar
messageLeftHtml.AppendChild( messageLeftHtml.AppendChild(
HtmlNode.CreateNode($"<img class=\"msg-avatar\" src=\"{messageGroup.Author.AvatarUrl}\" />")); HtmlNode.CreateNode($"<img class=\"msg-avatar\" src=\"{messageGroup.Author.AvatarUrl}\" />"));
// Right // Right
var messageRightHtml = messageHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg-right\"></div>")); var messageRightHtml =
messageHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg-right\"></div>"));
// Author // Author
var authorName = HtmlDocument.HtmlEncode(messageGroup.Author.Name); var authorName = HtmlDocument.HtmlEncode(messageGroup.Author.Name);
messageRightHtml.AppendChild(HtmlNode.CreateNode($"<span class=\"msg-user\">{authorName}</span>")); messageRightHtml.AppendChild(HtmlNode.CreateNode($"<span class=\"msg-user\">{authorName}</span>"));
// Date // Date
var timeStamp = HtmlDocument.HtmlEncode(messageGroup.TimeStamp.ToString(dateFormat)); var timeStamp = HtmlDocument.HtmlEncode(messageGroup.TimeStamp.ToString(dateFormat));
messageRightHtml.AppendChild(HtmlNode.CreateNode($"<span class=\"msg-date\">{timeStamp}</span>")); messageRightHtml.AppendChild(HtmlNode.CreateNode($"<span class=\"msg-date\">{timeStamp}</span>"));
// Individual messages // Individual messages
foreach (var message in messageGroup.Messages) foreach (var message in messageGroup.Messages)
{
// Content
if (message.Content.IsNotBlank())
{ {
var content = FormatMessageContent(message.Content); // Content
var contentHtml = if (message.Content.IsNotBlank())
messageRightHtml.AppendChild(
HtmlNode.CreateNode($"<div class=\"msg-content\">{content}</div>"));
// Edited timestamp
if (message.EditedTimeStamp != null)
{ {
contentHtml.AppendChild( var content = FormatMessageContent(message.Content);
HtmlNode.CreateNode( var contentHtml =
$"<span class=\"msg-edited\" title=\"{message.EditedTimeStamp.Value.ToString(dateFormat)}\">(edited)</span>")); messageRightHtml.AppendChild(
HtmlNode.CreateNode($"<div class=\"msg-content\">{content}</div>"));
// Edited timestamp
if (message.EditedTimeStamp != null)
{
contentHtml.AppendChild(
HtmlNode.CreateNode(
$"<span class=\"msg-edited\" title=\"{message.EditedTimeStamp.Value.ToString(dateFormat)}\">(edited)</span>"));
}
} }
}
// Attachments // Attachments
foreach (var attachment in message.Attachments) foreach (var attachment in message.Attachments)
{
if (attachment.Type == AttachmentType.Image)
{
messageRightHtml.AppendChild(
HtmlNode.CreateNode("<div class=\"msg-attachment\">" +
$"<a href=\"{attachment.Url}\">" +
$"<img class=\"msg-attachment\" src=\"{attachment.Url}\" />" +
"</a>" +
"</div>"));
}
else
{ {
messageRightHtml.AppendChild( if (attachment.Type == AttachmentType.Image)
HtmlNode.CreateNode("<div class=\"msg-attachment\">" + {
$"<a href=\"{attachment.Url}\">" + messageRightHtml.AppendChild(
$"Attachment: {attachment.FileName} ({NormalizeFileSize(attachment.FileSize)})" + HtmlNode.CreateNode("<div class=\"msg-attachment\">" +
"</a>" + $"<a href=\"{attachment.Url}\">" +
"</div>")); $"<img class=\"msg-attachment\" src=\"{attachment.Url}\" />" +
"</a>" +
"</div>"));
}
else
{
messageRightHtml.AppendChild(
HtmlNode.CreateNode("<div class=\"msg-attachment\">" +
$"<a href=\"{attachment.Url}\">" +
$"Attachment: {attachment.FileName} ({NormalizeFileSize(attachment.FileSize)})" +
"</a>" +
"</div>"));
}
} }
} }
} }
}
doc.Save(filePath); doc.Save(filePath);
});
} }
} }

@ -1,9 +1,10 @@
using DiscordChatExporter.Models; using System.Threading.Tasks;
using DiscordChatExporter.Models;
namespace DiscordChatExporter.Services namespace DiscordChatExporter.Services
{ {
public interface IExportService public interface IExportService
{ {
void Export(string filePath, ChannelChatLog log, Theme theme); Task ExportAsync(string filePath, ChannelChatLog log, Theme theme);
} }
} }

@ -176,7 +176,7 @@ namespace DiscordChatExporter.ViewModels
var chatLog = new ChannelChatLog(SelectedGuild, channel, messageGroups); var chatLog = new ChannelChatLog(SelectedGuild, channel, messageGroups);
// Export // Export
_exportService.Export(sfd.FileName, chatLog, _settingsService.Theme); await _exportService.ExportAsync(sfd.FileName, chatLog, _settingsService.Theme);
// Show dialog // Show dialog
MessengerInstance.Send(new ShowExportDoneMessage(sfd.FileName)); MessengerInstance.Send(new ShowExportDoneMessage(sfd.FileName));

Loading…
Cancel
Save