From 4a35a7b53037fb582ea268b0fa3fa2796340001a Mon Sep 17 00:00:00 2001 From: Alexey Golub Date: Mon, 27 Apr 2020 13:24:20 +0300 Subject: [PATCH] Cleanup and minor fixes --- .../Discord/DiscordClient.cs | 59 ++++++++++--------- .../Discord/Models/Guild.cs | 10 ++-- .../DiscordChatExporterException.cs | 8 +-- .../Exporting/MessageExporter.cs | 2 +- .../Exporting/MessageGroup.cs | 1 - .../PlainTextMarkdownVisitor.cs | 6 +- 6 files changed, 47 insertions(+), 39 deletions(-) diff --git a/DiscordChatExporter.Domain/Discord/DiscordClient.cs b/DiscordChatExporter.Domain/Discord/DiscordClient.cs index 0d0405d..a1b6efb 100644 --- a/DiscordChatExporter.Domain/Discord/DiscordClient.cs +++ b/DiscordChatExporter.Domain/Discord/DiscordClient.cs @@ -49,35 +49,42 @@ namespace DiscordChatExporter.Domain.Discord { } - private async Task GetApiResponseAsync(string url) + private async Task GetResponseAsync(string url) { - using var response = await _httpRequestPolicy.ExecuteAsync(async () => + return await _httpRequestPolicy.ExecuteAsync(async () => { using var request = new HttpRequestMessage(HttpMethod.Get, new Uri(_baseUri, url)); request.Headers.Authorization = _token.GetAuthorizationHeader(); return await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); }); + } - if (response.StatusCode == HttpStatusCode.Unauthorized) - throw DiscordChatExporterException.Unauthorized(); + private async Task GetJsonResponseAsync(string url) + { + using var response = await GetResponseAsync(url); - if ((int) response.StatusCode >= 400) - throw DiscordChatExporterException.FailedHttpRequest(response); + if (!response.IsSuccessStatusCode) + { + throw response.StatusCode switch + { + HttpStatusCode.Unauthorized => DiscordChatExporterException.Unauthorized(), + HttpStatusCode.Forbidden => DiscordChatExporterException.Forbidden(), + HttpStatusCode.NotFound => DiscordChatExporterException.NotFound(), + _ => DiscordChatExporterException.FailedHttpRequest(response) + }; + } return await response.Content.ReadAsJsonAsync(); } - private async Task TryGetApiResponseAsync(string url) + private async Task TryGetJsonResponseAsync(string url) { - try - { - return await GetApiResponseAsync(url); - } - catch (DiscordChatExporterException) - { - return null; - } + using var response = await GetResponseAsync(url); + + return response.IsSuccessStatusCode + ? await response.Content.ReadAsJsonAsync() + : (JsonElement?) null; } public async IAsyncEnumerable GetUserGuildsAsync() @@ -93,7 +100,7 @@ namespace DiscordChatExporter.Domain.Discord .SetQueryParameterIfNotNullOrWhiteSpace("after", afterId) .Build(); - var response = await GetApiResponseAsync(url); + var response = await GetJsonResponseAsync(url); var isEmpty = true; foreach (var guildJson in response.EnumerateArray()) @@ -115,7 +122,7 @@ namespace DiscordChatExporter.Domain.Discord if (guildId == Guild.DirectMessages.Id) return Guild.DirectMessages; - var response = await GetApiResponseAsync($"guilds/{guildId}"); + var response = await GetJsonResponseAsync($"guilds/{guildId}"); return Guild.Parse(response); } @@ -123,13 +130,13 @@ namespace DiscordChatExporter.Domain.Discord { if (guildId == Guild.DirectMessages.Id) { - var response = await GetApiResponseAsync("users/@me/channels"); + var response = await GetJsonResponseAsync("users/@me/channels"); foreach (var channelJson in response.EnumerateArray()) yield return Channel.Parse(channelJson); } else { - var response = await GetApiResponseAsync($"guilds/{guildId}/channels"); + var response = await GetJsonResponseAsync($"guilds/{guildId}/channels"); var categories = response .EnumerateArray() @@ -161,12 +168,10 @@ namespace DiscordChatExporter.Domain.Discord if (guildId == Guild.DirectMessages.Id) yield break; - var response = await GetApiResponseAsync($"guilds/{guildId}/roles"); + var response = await GetJsonResponseAsync($"guilds/{guildId}/roles"); foreach (var roleJson in response.EnumerateArray()) - { yield return Role.Parse(roleJson); - } } public async Task TryGetGuildMemberAsync(string guildId, User user) @@ -174,19 +179,19 @@ namespace DiscordChatExporter.Domain.Discord if (guildId == Guild.DirectMessages.Id) return Member.CreateForUser(user); - var response = await TryGetApiResponseAsync($"guilds/{guildId}/members/{user.Id}"); + var response = await TryGetJsonResponseAsync($"guilds/{guildId}/members/{user.Id}"); return response?.Pipe(Member.Parse); } private async Task GetChannelCategoryAsync(string channelParentId) { - var response = await GetApiResponseAsync($"channels/{channelParentId}"); + var response = await GetJsonResponseAsync($"channels/{channelParentId}"); return response.GetProperty("name").GetString(); } public async Task GetChannelAsync(string channelId) { - var response = await GetApiResponseAsync($"channels/{channelId}"); + var response = await GetJsonResponseAsync($"channels/{channelId}"); var parentId = response.GetPropertyOrNull("parent_id")?.GetString(); var category = !string.IsNullOrWhiteSpace(parentId) @@ -204,7 +209,7 @@ namespace DiscordChatExporter.Domain.Discord .SetQueryParameterIfNotNullOrWhiteSpace("before", before?.ToSnowflake()) .Build(); - var response = await GetApiResponseAsync(url); + var response = await GetJsonResponseAsync(url); return response.EnumerateArray().Select(Message.Parse).LastOrDefault(); } @@ -230,7 +235,7 @@ namespace DiscordChatExporter.Domain.Discord .SetQueryParameter("after", afterId) .Build(); - var response = await GetApiResponseAsync(url); + var response = await GetJsonResponseAsync(url); var messages = response .EnumerateArray() diff --git a/DiscordChatExporter.Domain/Discord/Models/Guild.cs b/DiscordChatExporter.Domain/Discord/Models/Guild.cs index 091fef5..ccbebe8 100644 --- a/DiscordChatExporter.Domain/Discord/Models/Guild.cs +++ b/DiscordChatExporter.Domain/Discord/Models/Guild.cs @@ -25,14 +25,14 @@ namespace DiscordChatExporter.Domain.Discord.Models public partial class Guild { - private static string GetIconUrl(string? id, string? iconHash) => - !string.IsNullOrWhiteSpace(id) && !string.IsNullOrWhiteSpace(iconHash) - ? $"https://cdn.discordapp.com/icons/{id}/{iconHash}.png" - : "https://cdn.discordapp.com/embed/avatars/0.png"; - public static Guild DirectMessages { get; } = new Guild("@me", "Direct Messages", null); + private static string GetIconUrl(string id, string? iconHash) => + !string.IsNullOrWhiteSpace(iconHash) + ? $"https://cdn.discordapp.com/icons/{id}/{iconHash}.png" + : "https://cdn.discordapp.com/embed/avatars/0.png"; + public static Guild Parse(JsonElement json) { var id = json.GetProperty("id").GetString(); diff --git a/DiscordChatExporter.Domain/Exceptions/DiscordChatExporterException.cs b/DiscordChatExporter.Domain/Exceptions/DiscordChatExporterException.cs index 7576941..3dcf382 100644 --- a/DiscordChatExporter.Domain/Exceptions/DiscordChatExporterException.cs +++ b/DiscordChatExporter.Domain/Exceptions/DiscordChatExporterException.cs @@ -35,15 +35,15 @@ Failed to perform an HTTP request. return new DiscordChatExporterException(message); } - internal static DiscordChatExporterException ChannelForbidden(string channel) + internal static DiscordChatExporterException Forbidden() { - var message = $"Access to channel '{channel}' is forbidden."; + const string message = "Access is forbidden."; return new DiscordChatExporterException(message); } - internal static DiscordChatExporterException ChannelDoesNotExist(string channel) + internal static DiscordChatExporterException NotFound() { - var message = $"Channel '{channel}' does not exist."; + const string message = "Not found."; return new DiscordChatExporterException(message); } diff --git a/DiscordChatExporter.Domain/Exporting/MessageExporter.cs b/DiscordChatExporter.Domain/Exporting/MessageExporter.cs index d7c8566..0347b8c 100644 --- a/DiscordChatExporter.Domain/Exporting/MessageExporter.cs +++ b/DiscordChatExporter.Domain/Exporting/MessageExporter.cs @@ -39,7 +39,7 @@ namespace DiscordChatExporter.Domain.Exporting private async Task GetWriterAsync() { - // Ensure partition limit is not exceeded + // Ensure partition limit has not been exceeded if (IsPartitionLimitReached()) { await ResetWriterAsync(); diff --git a/DiscordChatExporter.Domain/Exporting/MessageGroup.cs b/DiscordChatExporter.Domain/Exporting/MessageGroup.cs index c2e4c9c..4c1b165 100644 --- a/DiscordChatExporter.Domain/Exporting/MessageGroup.cs +++ b/DiscordChatExporter.Domain/Exporting/MessageGroup.cs @@ -5,7 +5,6 @@ using DiscordChatExporter.Domain.Discord.Models; namespace DiscordChatExporter.Domain.Exporting { // Used for grouping contiguous messages in HTML export - internal partial class MessageGroup { public User Author { get; } diff --git a/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/PlainTextMarkdownVisitor.cs b/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/PlainTextMarkdownVisitor.cs index 747e93d..2ba0609 100644 --- a/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/PlainTextMarkdownVisitor.cs +++ b/DiscordChatExporter.Domain/Exporting/Writers/MarkdownVisitors/PlainTextMarkdownVisitor.cs @@ -23,7 +23,11 @@ namespace DiscordChatExporter.Domain.Exporting.Writers.MarkdownVisitors public override MarkdownNode VisitMention(MentionNode mention) { - if (mention.Type == MentionType.User) + if (mention.Type == MentionType.Meta) + { + _buffer.Append($"@{mention.Id}"); + } + else if (mention.Type == MentionType.User) { var member = _context.TryGetMentionedMember(mention.Id); var name = member?.User.Name ?? "Unknown";