ExportService is pseudo async now

This commit is contained in:
Alexey Golub 2017-09-28 22:48:24 +03:00
parent b7979d6d1f
commit d8db4fca90
3 changed files with 91 additions and 84 deletions

View file

@ -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;
// Left // Set theme
var messageLeftHtml = messageHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg-left\"></div>")); var themeHtml = doc.GetElementbyId("theme");
themeHtml.InnerHtml = style;
// Avatar // Title
messageLeftHtml.AppendChild( var titleHtml = doc.DocumentNode.Element("html").Element("head").Element("title");
HtmlNode.CreateNode($"<img class=\"msg-avatar\" src=\"{messageGroup.Author.AvatarUrl}\" />")); titleHtml.InnerHtml = $"{log.Guild.Name} - {log.Channel.Name}";
// Right // Info
var messageRightHtml = messageHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg-right\"></div>")); 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>"));
// Author // Log
var authorName = HtmlDocument.HtmlEncode(messageGroup.Author.Name); var logHtml = doc.GetElementbyId("log");
messageRightHtml.AppendChild(HtmlNode.CreateNode($"<span class=\"msg-user\">{authorName}</span>")); foreach (var messageGroup in log.MessageGroups)
// Date
var timeStamp = HtmlDocument.HtmlEncode(messageGroup.TimeStamp.ToString(dateFormat));
messageRightHtml.AppendChild(HtmlNode.CreateNode($"<span class=\"msg-date\">{timeStamp}</span>"));
// Individual messages
foreach (var message in messageGroup.Messages)
{ {
// Content // Container
if (message.Content.IsNotBlank()) var messageHtml = logHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg\"></div>"));
{
var content = FormatMessageContent(message.Content);
var contentHtml =
messageRightHtml.AppendChild(
HtmlNode.CreateNode($"<div class=\"msg-content\">{content}</div>"));
// Edited timestamp // Left
if (message.EditedTimeStamp != null) var messageLeftHtml =
{ messageHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg-left\"></div>"));
contentHtml.AppendChild(
HtmlNode.CreateNode(
$"<span class=\"msg-edited\" title=\"{message.EditedTimeStamp.Value.ToString(dateFormat)}\">(edited)</span>"));
}
}
// Attachments // Avatar
foreach (var attachment in message.Attachments) messageLeftHtml.AppendChild(
HtmlNode.CreateNode($"<img class=\"msg-avatar\" src=\"{messageGroup.Author.AvatarUrl}\" />"));
// Right
var messageRightHtml =
messageHtml.AppendChild(HtmlNode.CreateNode("<div class=\"msg-right\"></div>"));
// Author
var authorName = HtmlDocument.HtmlEncode(messageGroup.Author.Name);
messageRightHtml.AppendChild(HtmlNode.CreateNode($"<span class=\"msg-user\">{authorName}</span>"));
// Date
var timeStamp = HtmlDocument.HtmlEncode(messageGroup.TimeStamp.ToString(dateFormat));
messageRightHtml.AppendChild(HtmlNode.CreateNode($"<span class=\"msg-date\">{timeStamp}</span>"));
// Individual messages
foreach (var message in messageGroup.Messages)
{ {
if (attachment.Type == AttachmentType.Image) // Content
if (message.Content.IsNotBlank())
{ {
messageRightHtml.AppendChild( var content = FormatMessageContent(message.Content);
HtmlNode.CreateNode("<div class=\"msg-attachment\">" + var contentHtml =
$"<a href=\"{attachment.Url}\">" + messageRightHtml.AppendChild(
$"<img class=\"msg-attachment\" src=\"{attachment.Url}\" />" + HtmlNode.CreateNode($"<div class=\"msg-content\">{content}</div>"));
"</a>" +
"</div>")); // Edited timestamp
if (message.EditedTimeStamp != null)
{
contentHtml.AppendChild(
HtmlNode.CreateNode(
$"<span class=\"msg-edited\" title=\"{message.EditedTimeStamp.Value.ToString(dateFormat)}\">(edited)</span>"));
}
} }
else
// Attachments
foreach (var attachment in message.Attachments)
{ {
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);
});
} }
} }

View file

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

View file

@ -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));