From 88a4fa792b6c1c7215bebd99c53691c537c64c26 Mon Sep 17 00:00:00 2001 From: Alexey Golub Date: Wed, 22 Apr 2020 21:59:10 +0300 Subject: [PATCH] Refactor more --- .../Commands/Base/ExportCommandBase.cs | 4 +- .../Base/ExportMultipleCommandBase.cs | 2 +- .../Discord/DiscordClient.Parsing.cs | 1 + .../Discord/DiscordClient.cs | 6 +- .../Discord/Models/Attachment.cs | 1 + .../Discord/Models/Channel.cs | 4 +- .../Discord/Models/{ => Common}/FileSize.cs | 2 +- .../Discord/Models/{ => Common}/IHasId.cs | 2 +- .../{ => Common}/IdBasedEqualityComparer.cs | 2 +- .../Discord/Models/Guild.cs | 1 + .../Discord/Models/Message.cs | 1 + .../Discord/Models/Role.cs | 1 + .../Discord/Models/User.cs | 1 + .../{Exporter.cs => ChannelExporter.cs} | 59 ++++++++----- .../{RenderContext.cs => ExportContext.cs} | 4 +- .../{RenderOptions.cs => ExportOptions.cs} | 4 +- ...{MessageRenderer.cs => MessageExporter.cs} | 83 +++++++++---------- .../Exporting/Writers/CsvMessageWriter.cs | 4 +- .../Exporting/Writers/HtmlMessageWriter.cs | 4 +- .../Exporting/Writers/JsonMessageWriter.cs | 4 +- .../MarkdownVisitors/HtmlMarkdownVisitor.cs | 6 +- .../PlainTextMarkdownVisitor.cs | 6 +- ...{MessageWriterBase.cs => MessageWriter.cs} | 6 +- .../Writers/PlainTextMessageWriter.cs | 4 +- .../Dialogs/ExportSetupViewModel.cs | 2 +- .../ViewModels/RootViewModel.cs | 4 +- 26 files changed, 118 insertions(+), 100 deletions(-) rename DiscordChatExporter.Domain/Discord/Models/{ => Common}/FileSize.cs (96%) rename DiscordChatExporter.Domain/Discord/Models/{ => Common}/IHasId.cs (52%) rename DiscordChatExporter.Domain/Discord/Models/{ => Common}/IdBasedEqualityComparer.cs (89%) rename DiscordChatExporter.Domain/Exporting/{Exporter.cs => ChannelExporter.cs} (68%) rename DiscordChatExporter.Domain/Exporting/{RenderContext.cs => ExportContext.cs} (95%) rename DiscordChatExporter.Domain/Exporting/{RenderOptions.cs => ExportOptions.cs} (79%) rename DiscordChatExporter.Domain/Exporting/{MessageRenderer.cs => MessageExporter.cs} (68%) rename DiscordChatExporter.Domain/Exporting/Writers/{MessageWriterBase.cs => MessageWriter.cs} (76%) diff --git a/DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs b/DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs index 3732151..45f74dd 100644 --- a/DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs +++ b/DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs @@ -29,14 +29,14 @@ namespace DiscordChatExporter.Cli.Commands.Base [CommandOption("dateformat", Description = "Date format used in output.")] public string DateFormat { get; set; } = "dd-MMM-yy hh:mm tt"; - protected Exporter GetExporter() => new Exporter(GetDiscordClient()); + protected ChannelExporter GetChannelExporter() => new ChannelExporter(GetDiscordClient()); protected async ValueTask ExportAsync(IConsole console, Guild guild, Channel channel) { console.Output.Write($"Exporting channel '{channel.Name}'... "); var progress = console.CreateProgressTicker(); - await GetExporter().ExportChatLogAsync(guild, channel, + await GetChannelExporter().ExportAsync(guild, channel, OutputPath, ExportFormat, DateFormat, PartitionLimit, After, Before, progress); diff --git a/DiscordChatExporter.Cli/Commands/Base/ExportMultipleCommandBase.cs b/DiscordChatExporter.Cli/Commands/Base/ExportMultipleCommandBase.cs index 56d6aa7..51656a9 100644 --- a/DiscordChatExporter.Cli/Commands/Base/ExportMultipleCommandBase.cs +++ b/DiscordChatExporter.Cli/Commands/Base/ExportMultipleCommandBase.cs @@ -46,7 +46,7 @@ namespace DiscordChatExporter.Cli.Commands.Base { var guild = await GetDiscordClient().GetGuildAsync(channel.GuildId); - await GetExporter().ExportChatLogAsync(guild, channel, + await GetChannelExporter().ExportAsync(guild, channel, OutputPath, ExportFormat, DateFormat, PartitionLimit, After, Before, operation); diff --git a/DiscordChatExporter.Domain/Discord/DiscordClient.Parsing.cs b/DiscordChatExporter.Domain/Discord/DiscordClient.Parsing.cs index cc0a6b9..a62846a 100644 --- a/DiscordChatExporter.Domain/Discord/DiscordClient.Parsing.cs +++ b/DiscordChatExporter.Domain/Discord/DiscordClient.Parsing.cs @@ -3,6 +3,7 @@ using System.Drawing; using System.Linq; using System.Text.Json; using DiscordChatExporter.Domain.Discord.Models; +using DiscordChatExporter.Domain.Discord.Models.Common; using DiscordChatExporter.Domain.Internal; using Tyrrrz.Extensions; diff --git a/DiscordChatExporter.Domain/Discord/DiscordClient.cs b/DiscordChatExporter.Domain/Discord/DiscordClient.cs index 8a83744..127d24a 100644 --- a/DiscordChatExporter.Domain/Discord/DiscordClient.cs +++ b/DiscordChatExporter.Domain/Discord/DiscordClient.cs @@ -23,8 +23,6 @@ namespace DiscordChatExporter.Domain.Discord _token = token; _httpClient = httpClient; - _httpClient.BaseAddress = new Uri("https://discordapp.com/api/v6"); - // Discord seems to always respond with 429 on the first request with unreasonable wait time (10+ minutes). // For that reason the policy will start respecting their retry-after header only after Nth failed response. _httpRequestPolicy = Policy @@ -53,7 +51,9 @@ namespace DiscordChatExporter.Domain.Discord { using var response = await _httpRequestPolicy.ExecuteAsync(async () => { - using var request = new HttpRequestMessage(HttpMethod.Get, url); + var uri = new Uri(new Uri("https://discordapp.com/api/v6"), url); + + using var request = new HttpRequestMessage(HttpMethod.Get, uri); request.Headers.Authorization = _token.GetAuthenticationHeader(); return await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); diff --git a/DiscordChatExporter.Domain/Discord/Models/Attachment.cs b/DiscordChatExporter.Domain/Discord/Models/Attachment.cs index 593844c..6efc3e0 100644 --- a/DiscordChatExporter.Domain/Discord/Models/Attachment.cs +++ b/DiscordChatExporter.Domain/Discord/Models/Attachment.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using DiscordChatExporter.Domain.Discord.Models.Common; namespace DiscordChatExporter.Domain.Discord.Models { diff --git a/DiscordChatExporter.Domain/Discord/Models/Channel.cs b/DiscordChatExporter.Domain/Discord/Models/Channel.cs index 99a4dc6..66a7784 100644 --- a/DiscordChatExporter.Domain/Discord/Models/Channel.cs +++ b/DiscordChatExporter.Domain/Discord/Models/Channel.cs @@ -1,4 +1,6 @@ -namespace DiscordChatExporter.Domain.Discord.Models +using DiscordChatExporter.Domain.Discord.Models.Common; + +namespace DiscordChatExporter.Domain.Discord.Models { // https://discordapp.com/developers/docs/resources/channel#channel-object-channel-types // Order of enum fields needs to match the order in the docs. diff --git a/DiscordChatExporter.Domain/Discord/Models/FileSize.cs b/DiscordChatExporter.Domain/Discord/Models/Common/FileSize.cs similarity index 96% rename from DiscordChatExporter.Domain/Discord/Models/FileSize.cs rename to DiscordChatExporter.Domain/Discord/Models/Common/FileSize.cs index de67e3c..a9d7fd3 100644 --- a/DiscordChatExporter.Domain/Discord/Models/FileSize.cs +++ b/DiscordChatExporter.Domain/Discord/Models/Common/FileSize.cs @@ -1,6 +1,6 @@ using System; -namespace DiscordChatExporter.Domain.Discord.Models +namespace DiscordChatExporter.Domain.Discord.Models.Common { // Loosely based on https://github.com/omar/ByteSize (MIT license) diff --git a/DiscordChatExporter.Domain/Discord/Models/IHasId.cs b/DiscordChatExporter.Domain/Discord/Models/Common/IHasId.cs similarity index 52% rename from DiscordChatExporter.Domain/Discord/Models/IHasId.cs rename to DiscordChatExporter.Domain/Discord/Models/Common/IHasId.cs index 3974abc..d1056f8 100644 --- a/DiscordChatExporter.Domain/Discord/Models/IHasId.cs +++ b/DiscordChatExporter.Domain/Discord/Models/Common/IHasId.cs @@ -1,4 +1,4 @@ -namespace DiscordChatExporter.Domain.Discord.Models +namespace DiscordChatExporter.Domain.Discord.Models.Common { public interface IHasId { diff --git a/DiscordChatExporter.Domain/Discord/Models/IdBasedEqualityComparer.cs b/DiscordChatExporter.Domain/Discord/Models/Common/IdBasedEqualityComparer.cs similarity index 89% rename from DiscordChatExporter.Domain/Discord/Models/IdBasedEqualityComparer.cs rename to DiscordChatExporter.Domain/Discord/Models/Common/IdBasedEqualityComparer.cs index 5c1ed33..b3a0a60 100644 --- a/DiscordChatExporter.Domain/Discord/Models/IdBasedEqualityComparer.cs +++ b/DiscordChatExporter.Domain/Discord/Models/Common/IdBasedEqualityComparer.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace DiscordChatExporter.Domain.Discord.Models +namespace DiscordChatExporter.Domain.Discord.Models.Common { public partial class IdBasedEqualityComparer : IEqualityComparer { diff --git a/DiscordChatExporter.Domain/Discord/Models/Guild.cs b/DiscordChatExporter.Domain/Discord/Models/Guild.cs index 8b7e8cb..cba8ea4 100644 --- a/DiscordChatExporter.Domain/Discord/Models/Guild.cs +++ b/DiscordChatExporter.Domain/Discord/Models/Guild.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using DiscordChatExporter.Domain.Discord.Models.Common; using DiscordChatExporter.Domain.Internal; namespace DiscordChatExporter.Domain.Discord.Models diff --git a/DiscordChatExporter.Domain/Discord/Models/Message.cs b/DiscordChatExporter.Domain/Discord/Models/Message.cs index c061657..16ad41c 100644 --- a/DiscordChatExporter.Domain/Discord/Models/Message.cs +++ b/DiscordChatExporter.Domain/Discord/Models/Message.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using DiscordChatExporter.Domain.Discord.Models.Common; namespace DiscordChatExporter.Domain.Discord.Models { diff --git a/DiscordChatExporter.Domain/Discord/Models/Role.cs b/DiscordChatExporter.Domain/Discord/Models/Role.cs index d1bcdcf..01eb920 100644 --- a/DiscordChatExporter.Domain/Discord/Models/Role.cs +++ b/DiscordChatExporter.Domain/Discord/Models/Role.cs @@ -1,4 +1,5 @@ using System.Drawing; +using DiscordChatExporter.Domain.Discord.Models.Common; namespace DiscordChatExporter.Domain.Discord.Models { diff --git a/DiscordChatExporter.Domain/Discord/Models/User.cs b/DiscordChatExporter.Domain/Discord/Models/User.cs index df1a035..0ff9355 100644 --- a/DiscordChatExporter.Domain/Discord/Models/User.cs +++ b/DiscordChatExporter.Domain/Discord/Models/User.cs @@ -1,4 +1,5 @@ using System; +using DiscordChatExporter.Domain.Discord.Models.Common; namespace DiscordChatExporter.Domain.Discord.Models { diff --git a/DiscordChatExporter.Domain/Exporting/Exporter.cs b/DiscordChatExporter.Domain/Exporting/ChannelExporter.cs similarity index 68% rename from DiscordChatExporter.Domain/Exporting/Exporter.cs rename to DiscordChatExporter.Domain/Exporting/ChannelExporter.cs index 6562740..dc0f4b5 100644 --- a/DiscordChatExporter.Domain/Exporting/Exporter.cs +++ b/DiscordChatExporter.Domain/Exporting/ChannelExporter.cs @@ -5,39 +5,47 @@ using System.Text; using System.Threading.Tasks; using DiscordChatExporter.Domain.Discord; using DiscordChatExporter.Domain.Discord.Models; +using DiscordChatExporter.Domain.Discord.Models.Common; using DiscordChatExporter.Domain.Exceptions; using Tyrrrz.Extensions; namespace DiscordChatExporter.Domain.Exporting { - public partial class Exporter + public partial class ChannelExporter { private readonly DiscordClient _discord; - public Exporter(DiscordClient discord) => _discord = discord; - - public async Task ExportChatLogAsync(Guild guild, Channel channel, - string outputPath, ExportFormat format, string dateFormat, int? partitionLimit, - DateTimeOffset? after = null, DateTimeOffset? before = null, IProgress? progress = null) + public ChannelExporter(DiscordClient discord) => _discord = discord; + + public async Task ExportAsync( + Guild guild, + Channel channel, + string outputPath, + ExportFormat format, + string dateFormat, + int? partitionLimit, + DateTimeOffset? after = null, + DateTimeOffset? before = null, + IProgress? progress = null) { // Get base file path from output path - var baseFilePath = GetFilePathFromOutputPath(outputPath, format, guild, channel, after, before); + var baseFilePath = GetFilePathFromOutputPath(guild, channel, outputPath, format, after, before); // Create options - var options = new RenderOptions(baseFilePath, format, partitionLimit); + var options = new ExportOptions(baseFilePath, format, partitionLimit); // Create context var mentionableUsers = new HashSet(IdBasedEqualityComparer.Instance); var mentionableChannels = await _discord.GetGuildChannelsAsync(guild.Id); var mentionableRoles = guild.Roles; - var context = new RenderContext( + var context = new ExportContext( guild, channel, after, before, dateFormat, mentionableUsers, mentionableChannels, mentionableRoles ); // Create renderer - await using var renderer = new MessageRenderer(options, context); + await using var renderer = new MessageExporter(options, context); // Render messages var renderedAnything = false; @@ -52,14 +60,13 @@ namespace DiscordChatExporter.Domain.Exporting foreach (User u in encounteredUsers) { - if(!guild.Members.ContainsKey(u.Id)) + if (!guild.Members.ContainsKey(u.Id)) { var member = await _discord.GetGuildMemberAsync(guild.Id, u.Id); guild.Members[u.Id] = member; } } - // Render message await renderer.RenderMessageAsync(message); renderedAnything = true; @@ -71,18 +78,21 @@ namespace DiscordChatExporter.Domain.Exporting } } - public partial class Exporter + public partial class ChannelExporter { - public static string GetDefaultExportFileName(ExportFormat format, - Guild guild, Channel channel, - DateTimeOffset? after = null, DateTimeOffset? before = null) + public static string GetDefaultExportFileName( + Guild guild, + Channel channel, + ExportFormat format, + DateTimeOffset? after = null, + DateTimeOffset? before = null) { var buffer = new StringBuilder(); - // Append guild and channel names + // Guild and channel names buffer.Append($"{guild.Name} - {channel.Name} [{channel.Id}]"); - // Append date range + // Date range if (after != null || before != null) { buffer.Append(" ("); @@ -106,7 +116,7 @@ namespace DiscordChatExporter.Domain.Exporting buffer.Append(")"); } - // Append extension + // File extension buffer.Append($".{format.GetFileExtension()}"); // Replace invalid chars @@ -116,13 +126,18 @@ namespace DiscordChatExporter.Domain.Exporting return buffer.ToString(); } - private static string GetFilePathFromOutputPath(string outputPath, ExportFormat format, Guild guild, Channel channel, - DateTimeOffset? after, DateTimeOffset? before) + private static string GetFilePathFromOutputPath( + Guild guild, + Channel channel, + string outputPath, + ExportFormat format, + DateTimeOffset? after = null, + DateTimeOffset? before = null) { // Output is a directory if (Directory.Exists(outputPath) || string.IsNullOrWhiteSpace(Path.GetExtension(outputPath))) { - var fileName = GetDefaultExportFileName(format, guild, channel, after, before); + var fileName = GetDefaultExportFileName(guild, channel, format, after, before); return Path.Combine(outputPath, fileName); } diff --git a/DiscordChatExporter.Domain/Exporting/RenderContext.cs b/DiscordChatExporter.Domain/Exporting/ExportContext.cs similarity index 95% rename from DiscordChatExporter.Domain/Exporting/RenderContext.cs rename to DiscordChatExporter.Domain/Exporting/ExportContext.cs index e4ee94f..2361346 100644 --- a/DiscordChatExporter.Domain/Exporting/RenderContext.cs +++ b/DiscordChatExporter.Domain/Exporting/ExportContext.cs @@ -4,7 +4,7 @@ using DiscordChatExporter.Domain.Discord.Models; namespace DiscordChatExporter.Domain.Exporting { - public class RenderContext + public class ExportContext { public Guild Guild { get; } @@ -22,7 +22,7 @@ namespace DiscordChatExporter.Domain.Exporting public IReadOnlyCollection MentionableRoles { get; } - public RenderContext( + public ExportContext( Guild guild, Channel channel, DateTimeOffset? after, diff --git a/DiscordChatExporter.Domain/Exporting/RenderOptions.cs b/DiscordChatExporter.Domain/Exporting/ExportOptions.cs similarity index 79% rename from DiscordChatExporter.Domain/Exporting/RenderOptions.cs rename to DiscordChatExporter.Domain/Exporting/ExportOptions.cs index 94ad7d0..faeb1cb 100644 --- a/DiscordChatExporter.Domain/Exporting/RenderOptions.cs +++ b/DiscordChatExporter.Domain/Exporting/ExportOptions.cs @@ -1,6 +1,6 @@ namespace DiscordChatExporter.Domain.Exporting { - public class RenderOptions + public class ExportOptions { public string BaseFilePath { get; } @@ -8,7 +8,7 @@ public int? PartitionLimit { get; } - public RenderOptions(string baseFilePath, ExportFormat format, int? partitionLimit) + public ExportOptions(string baseFilePath, ExportFormat format, int? partitionLimit) { BaseFilePath = baseFilePath; Format = format; diff --git a/DiscordChatExporter.Domain/Exporting/MessageRenderer.cs b/DiscordChatExporter.Domain/Exporting/MessageExporter.cs similarity index 68% rename from DiscordChatExporter.Domain/Exporting/MessageRenderer.cs rename to DiscordChatExporter.Domain/Exporting/MessageExporter.cs index 6a0e212..80dd5bc 100644 --- a/DiscordChatExporter.Domain/Exporting/MessageRenderer.cs +++ b/DiscordChatExporter.Domain/Exporting/MessageExporter.cs @@ -6,82 +6,77 @@ using DiscordChatExporter.Domain.Exporting.Writers; namespace DiscordChatExporter.Domain.Exporting { - internal partial class MessageRenderer : IAsyncDisposable + internal partial class MessageExporter : IAsyncDisposable { - private readonly RenderOptions _options; - private readonly RenderContext _context; + private readonly ExportOptions _options; + private readonly ExportContext _context; private long _renderedMessageCount; private int _partitionIndex; - private MessageWriterBase? _writer; + private MessageWriter? _writer; - public MessageRenderer(RenderOptions options, RenderContext context) + public MessageExporter(ExportOptions options, ExportContext context) { _options = options; _context = context; } - private async Task InitializeWriterAsync() - { - // Get partition file path - var filePath = GetPartitionFilePath(_options.BaseFilePath, _partitionIndex); - - // Create output directory - var dirPath = Path.GetDirectoryName(_options.BaseFilePath); - if (!string.IsNullOrWhiteSpace(dirPath)) - Directory.CreateDirectory(dirPath); - - // Create writer - var writer = CreateMessageWriter(filePath, _options.Format, _context); - - // Write preamble - await writer.WritePreambleAsync(); - - return _writer = writer; - } + private bool IsPartitionLimitReached() => + _renderedMessageCount > 0 && + _options.PartitionLimit != null && + _options.PartitionLimit != 0 && + _renderedMessageCount % _options.PartitionLimit == 0; private async Task ResetWriterAsync() { if (_writer != null) { - // Write postamble await _writer.WritePostambleAsync(); - - // Flush await _writer.DisposeAsync(); _writer = null; } } - public async Task RenderMessageAsync(Message message) + private async Task GetWriterAsync() { - // Ensure underlying writer is initialized - _writer ??= await InitializeWriterAsync(); - - // Render the actual message - await _writer!.WriteMessageAsync(message); - - // Increment count - _renderedMessageCount++; - - // Shift partition if necessary - if (_options.PartitionLimit != null && - _options.PartitionLimit != 0 && - _renderedMessageCount % _options.PartitionLimit == 0) + // Ensure partition limit is not exceeded + if (IsPartitionLimitReached()) { await ResetWriterAsync(); _partitionIndex++; } + + // Writer is still valid - return + if (_writer != null) + return _writer; + + var filePath = GetPartitionFilePath(_options.BaseFilePath, _partitionIndex); + + var dirPath = Path.GetDirectoryName(_options.BaseFilePath); + if (!string.IsNullOrWhiteSpace(dirPath)) + Directory.CreateDirectory(dirPath); + + var writer = CreateMessageWriter(filePath, _options.Format, _context); + await writer.WritePreambleAsync(); + + return _writer = writer; + } + + public async Task RenderMessageAsync(Message message) + { + var writer = await GetWriterAsync(); + await writer.WriteMessageAsync(message); + _renderedMessageCount++; } public async ValueTask DisposeAsync() => await ResetWriterAsync(); } - internal partial class MessageRenderer + internal partial class MessageExporter { private static string GetPartitionFilePath(string baseFilePath, int partitionIndex) { - // First partition - no changes + // First partition - don't change file name if (partitionIndex <= 0) return baseFilePath; @@ -98,9 +93,9 @@ namespace DiscordChatExporter.Domain.Exporting return fileName; } - private static MessageWriterBase CreateMessageWriter(string filePath, ExportFormat format, RenderContext context) + private static MessageWriter CreateMessageWriter(string filePath, ExportFormat format, ExportContext context) { - // Create a stream (it will get disposed by the writer) + // Stream will be disposed by the underlying writer var stream = File.Create(filePath); return format switch diff --git a/DiscordChatExporter.Domain/Exporting/Writers/CsvMessageWriter.cs b/DiscordChatExporter.Domain/Exporting/Writers/CsvMessageWriter.cs index 5948a0d..d7c0a25 100644 --- a/DiscordChatExporter.Domain/Exporting/Writers/CsvMessageWriter.cs +++ b/DiscordChatExporter.Domain/Exporting/Writers/CsvMessageWriter.cs @@ -9,11 +9,11 @@ using Tyrrrz.Extensions; namespace DiscordChatExporter.Domain.Exporting.Writers { - internal partial class CsvMessageWriter : MessageWriterBase + internal partial class CsvMessageWriter : MessageWriter { private readonly TextWriter _writer; - public CsvMessageWriter(Stream stream, RenderContext context) + public CsvMessageWriter(Stream stream, ExportContext context) : base(stream, context) { _writer = new StreamWriter(stream); diff --git a/DiscordChatExporter.Domain/Exporting/Writers/HtmlMessageWriter.cs b/DiscordChatExporter.Domain/Exporting/Writers/HtmlMessageWriter.cs index ed93cd1..79f170d 100644 --- a/DiscordChatExporter.Domain/Exporting/Writers/HtmlMessageWriter.cs +++ b/DiscordChatExporter.Domain/Exporting/Writers/HtmlMessageWriter.cs @@ -13,7 +13,7 @@ using Tyrrrz.Extensions; namespace DiscordChatExporter.Domain.Exporting.Writers { - internal partial class HtmlMessageWriter : MessageWriterBase + internal partial class HtmlMessageWriter : MessageWriter { private readonly TextWriter _writer; private readonly string _themeName; @@ -25,7 +25,7 @@ namespace DiscordChatExporter.Domain.Exporting.Writers private long _messageCount; - public HtmlMessageWriter(Stream stream, RenderContext context, string themeName) + public HtmlMessageWriter(Stream stream, ExportContext context, string themeName) : base(stream, context) { _writer = new StreamWriter(stream); diff --git a/DiscordChatExporter.Domain/Exporting/Writers/JsonMessageWriter.cs b/DiscordChatExporter.Domain/Exporting/Writers/JsonMessageWriter.cs index 20b0715..ceb0fcd 100644 --- a/DiscordChatExporter.Domain/Exporting/Writers/JsonMessageWriter.cs +++ b/DiscordChatExporter.Domain/Exporting/Writers/JsonMessageWriter.cs @@ -7,13 +7,13 @@ using DiscordChatExporter.Domain.Internal; namespace DiscordChatExporter.Domain.Exporting.Writers { - internal class JsonMessageWriter : MessageWriterBase + internal class JsonMessageWriter : MessageWriter { private readonly Utf8JsonWriter _writer; private long _messageCount; - public JsonMessageWriter(Stream stream, RenderContext context) + public JsonMessageWriter(Stream stream, ExportContext context) : base(stream, context) { _writer = new Utf8JsonWriter(stream, new JsonWriterOptions diff --git a/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/HtmlMarkdownVisitor.cs b/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/HtmlMarkdownVisitor.cs index eff613f..7a9e6fa 100644 --- a/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/HtmlMarkdownVisitor.cs +++ b/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/HtmlMarkdownVisitor.cs @@ -12,11 +12,11 @@ namespace DiscordChatExporter.Domain.Exporting.Writers.MarkdownVisitors { internal partial class HtmlMarkdownVisitor : MarkdownVisitor { - private readonly RenderContext _context; + private readonly ExportContext _context; private readonly StringBuilder _buffer; private readonly bool _isJumbo; - public HtmlMarkdownVisitor(RenderContext context, StringBuilder buffer, bool isJumbo) + public HtmlMarkdownVisitor(ExportContext context, StringBuilder buffer, bool isJumbo) { _context = context; _buffer = buffer; @@ -162,7 +162,7 @@ namespace DiscordChatExporter.Domain.Exporting.Writers.MarkdownVisitors { private static string HtmlEncode(string text) => WebUtility.HtmlEncode(text); - public static string Format(RenderContext context, string markdown) + public static string Format(ExportContext context, string markdown) { var nodes = MarkdownParser.Parse(markdown); var isJumbo = nodes.All(n => n is EmojiNode || n is TextNode textNode && string.IsNullOrWhiteSpace(textNode.Text)); diff --git a/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/PlainTextMarkdownVisitor.cs b/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/PlainTextMarkdownVisitor.cs index 7a58e01..0a88b97 100644 --- a/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/PlainTextMarkdownVisitor.cs +++ b/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/PlainTextMarkdownVisitor.cs @@ -8,10 +8,10 @@ namespace DiscordChatExporter.Domain.Exporting.Writers.MarkdownVisitors { internal partial class PlainTextMarkdownVisitor : MarkdownVisitor { - private readonly RenderContext _context; + private readonly ExportContext _context; private readonly StringBuilder _buffer; - public PlainTextMarkdownVisitor(RenderContext context, StringBuilder buffer) + public PlainTextMarkdownVisitor(ExportContext context, StringBuilder buffer) { _context = context; _buffer = buffer; @@ -64,7 +64,7 @@ namespace DiscordChatExporter.Domain.Exporting.Writers.MarkdownVisitors internal partial class PlainTextMarkdownVisitor { - public static string Format(RenderContext context, string markdown) + public static string Format(ExportContext context, string markdown) { var nodes = MarkdownParser.ParseMinimal(markdown); var buffer = new StringBuilder(); diff --git a/DiscordChatExporter.Domain/Exporting/Writers/MessageWriterBase.cs b/DiscordChatExporter.Domain/Exporting/Writers/MessageWriter.cs similarity index 76% rename from DiscordChatExporter.Domain/Exporting/Writers/MessageWriterBase.cs rename to DiscordChatExporter.Domain/Exporting/Writers/MessageWriter.cs index 34f3fee..2f9d445 100644 --- a/DiscordChatExporter.Domain/Exporting/Writers/MessageWriterBase.cs +++ b/DiscordChatExporter.Domain/Exporting/Writers/MessageWriter.cs @@ -5,13 +5,13 @@ using DiscordChatExporter.Domain.Discord.Models; namespace DiscordChatExporter.Domain.Exporting.Writers { - internal abstract class MessageWriterBase : IAsyncDisposable + internal abstract class MessageWriter : IAsyncDisposable { protected Stream Stream { get; } - protected RenderContext Context { get; } + protected ExportContext Context { get; } - protected MessageWriterBase(Stream stream, RenderContext context) + protected MessageWriter(Stream stream, ExportContext context) { Stream = stream; Context = context; diff --git a/DiscordChatExporter.Domain/Exporting/Writers/PlainTextMessageWriter.cs b/DiscordChatExporter.Domain/Exporting/Writers/PlainTextMessageWriter.cs index 34dc616..1f0e84f 100644 --- a/DiscordChatExporter.Domain/Exporting/Writers/PlainTextMessageWriter.cs +++ b/DiscordChatExporter.Domain/Exporting/Writers/PlainTextMessageWriter.cs @@ -10,13 +10,13 @@ using DiscordChatExporter.Domain.Internal; namespace DiscordChatExporter.Domain.Exporting.Writers { - internal class PlainTextMessageWriter : MessageWriterBase + internal class PlainTextMessageWriter : MessageWriter { private readonly TextWriter _writer; private long _messageCount; - public PlainTextMessageWriter(Stream stream, RenderContext context) + public PlainTextMessageWriter(Stream stream, ExportContext context) : base(stream, context) { _writer = new StreamWriter(stream); diff --git a/DiscordChatExporter.Gui/ViewModels/Dialogs/ExportSetupViewModel.cs b/DiscordChatExporter.Gui/ViewModels/Dialogs/ExportSetupViewModel.cs index 507520b..f843ad0 100644 --- a/DiscordChatExporter.Gui/ViewModels/Dialogs/ExportSetupViewModel.cs +++ b/DiscordChatExporter.Gui/ViewModels/Dialogs/ExportSetupViewModel.cs @@ -61,7 +61,7 @@ namespace DiscordChatExporter.Gui.ViewModels.Dialogs var channel = Channels.Single(); // Generate default file name - var defaultFileName = Exporter.GetDefaultExportFileName(SelectedFormat, Guild!, channel!, After, Before); + var defaultFileName = ChannelExporter.GetDefaultExportFileName(Guild!, channel!, SelectedFormat, After, Before); // Generate filter var ext = SelectedFormat.GetFileExtension(); diff --git a/DiscordChatExporter.Gui/ViewModels/RootViewModel.cs b/DiscordChatExporter.Gui/ViewModels/RootViewModel.cs index 7a0acac..39ca52f 100644 --- a/DiscordChatExporter.Gui/ViewModels/RootViewModel.cs +++ b/DiscordChatExporter.Gui/ViewModels/RootViewModel.cs @@ -67,7 +67,7 @@ namespace DiscordChatExporter.Gui.ViewModels private DiscordClient GetDiscordClient(AuthToken token) => new DiscordClient(token); - private Exporter GetExporter(AuthToken token) => new Exporter(GetDiscordClient(token)); + private ChannelExporter GetChannelExporter(AuthToken token) => new ChannelExporter(GetDiscordClient(token)); private async Task HandleAutoUpdateAsync() { @@ -261,7 +261,7 @@ namespace DiscordChatExporter.Gui.ViewModels try { - await GetExporter(token).ExportChatLogAsync(dialog.Guild!, channel!, + await GetChannelExporter(token).ExportAsync(dialog.Guild!, channel!, dialog.OutputPath!, dialog.SelectedFormat, _settingsService.DateFormat, dialog.PartitionLimit, dialog.After, dialog.Before, operation);