mirror of
https://github.com/Tyrrrz/DiscordChatExporter.git
synced 2026-02-14 07:43:31 -07:00
ExportService is pseudo async now
This commit is contained in:
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;
|
||||||
|
|
||||||
// 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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in a new issue