From b36071cddd3e6d5ebd423745a3766f13b0f558c9 Mon Sep 17 00:00:00 2001 From: Oleksii Holub <1935960+Tyrrrz@users.noreply.github.com> Date: Mon, 6 Feb 2023 16:08:44 +0200 Subject: [PATCH] Use channel icon instead of guild icon, when available Closes #987 --- .../Discord/Data/Channel.cs | 17 +++++++++++++- .../Discord/Data/Guild.cs | 7 +++--- .../Exporting/JsonMessageWriter.cs | 23 +++++++++++++++++-- .../Exporting/PreambleTemplate.cshtml | 2 +- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/DiscordChatExporter.Core/Discord/Data/Channel.cs b/DiscordChatExporter.Core/Discord/Data/Channel.cs index c60b79d4..36bc562a 100644 --- a/DiscordChatExporter.Core/Discord/Data/Channel.cs +++ b/DiscordChatExporter.Core/Discord/Data/Channel.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Text.Json; using DiscordChatExporter.Core.Discord.Data.Common; using DiscordChatExporter.Core.Utils.Extensions; @@ -14,6 +15,7 @@ public partial record Channel( ChannelCategory Category, string Name, int? Position, + string? IconUrl, string? Topic, Snowflake? LastMessageId) : IHasId { @@ -35,6 +37,15 @@ public partial record Channel null ); + private static string GetIconUrl(Snowflake id, string iconHash) + { + var extension = iconHash.StartsWith("a_", StringComparison.Ordinal) + ? "gif" + : "png"; + + return $"https://cdn.discordapp.com/icons/{id}/{iconHash}.{extension}"; + } + public static Channel Parse(JsonElement json, ChannelCategory? category = null, int? positionHint = null) { var id = json.GetProperty("id").GetNonWhiteSpaceString().Pipe(Snowflake.Parse); @@ -59,6 +70,9 @@ public partial record Channel positionHint ?? json.GetPropertyOrNull("position")?.GetInt32OrNull(); + // Only available on group DMs + var iconUrl = json.GetPropertyOrNull("icon")?.GetNonWhiteSpaceStringOrNull()?.Pipe(h => GetIconUrl(id, h)); + var topic = json.GetPropertyOrNull("topic")?.GetStringOrNull(); var lastMessageId = json @@ -73,6 +87,7 @@ public partial record Channel category ?? GetFallbackCategory(kind), name, position, + iconUrl, topic, lastMessageId ); diff --git a/DiscordChatExporter.Core/Discord/Data/Guild.cs b/DiscordChatExporter.Core/Discord/Data/Guild.cs index 0e1779ed..7c7c217f 100644 --- a/DiscordChatExporter.Core/Discord/Data/Guild.cs +++ b/DiscordChatExporter.Core/Discord/Data/Guild.cs @@ -32,10 +32,9 @@ public record Guild(Snowflake Id, string Name, string IconUrl) : IHasId var id = json.GetProperty("id").GetNonWhiteSpaceString().Pipe(Snowflake.Parse); var name = json.GetProperty("name").GetNonNullString(); - var iconHash = json.GetPropertyOrNull("icon")?.GetNonWhiteSpaceStringOrNull(); - var iconUrl = !string.IsNullOrWhiteSpace(iconHash) - ? GetIconUrl(id, iconHash) - : GetDefaultIconUrl(); + var iconUrl = + json.GetPropertyOrNull("icon")?.GetNonWhiteSpaceStringOrNull()?.Pipe(h => GetIconUrl(id, h)) ?? + GetDefaultIconUrl(); return new Guild(id, name, iconUrl); } diff --git a/DiscordChatExporter.Core/Exporting/JsonMessageWriter.cs b/DiscordChatExporter.Core/Exporting/JsonMessageWriter.cs index 1b32f91f..d57ab199 100644 --- a/DiscordChatExporter.Core/Exporting/JsonMessageWriter.cs +++ b/DiscordChatExporter.Core/Exporting/JsonMessageWriter.cs @@ -244,7 +244,12 @@ internal class JsonMessageWriter : MessageWriter _writer.WriteStartObject("guild"); _writer.WriteString("id", Context.Request.Guild.Id.ToString()); _writer.WriteString("name", Context.Request.Guild.Name); - _writer.WriteString("iconUrl", await Context.ResolveAssetUrlAsync(Context.Request.Guild.IconUrl, cancellationToken)); + + _writer.WriteString( + "iconUrl", + await Context.ResolveAssetUrlAsync(Context.Request.Guild.IconUrl, cancellationToken) + ); + _writer.WriteEndObject(); // Channel @@ -255,6 +260,15 @@ internal class JsonMessageWriter : MessageWriter _writer.WriteString("category", Context.Request.Channel.Category.Name); _writer.WriteString("name", Context.Request.Channel.Name); _writer.WriteString("topic", Context.Request.Channel.Topic); + + if (!string.IsNullOrWhiteSpace(Context.Request.Channel.IconUrl)) + { + _writer.WriteString( + "iconUrl", + await Context.ResolveAssetUrlAsync(Context.Request.Channel.IconUrl, cancellationToken) + ); + } + _writer.WriteEndObject(); // Date range @@ -295,7 +309,12 @@ internal class JsonMessageWriter : MessageWriter _writer.WriteString("nickname", Context.TryGetMember(message.Author.Id)?.Nick ?? message.Author.Name); _writer.WriteString("color", Context.TryGetUserColor(message.Author.Id)?.ToHex()); _writer.WriteBoolean("isBot", message.Author.IsBot); - _writer.WriteString("avatarUrl", await Context.ResolveAssetUrlAsync(message.Author.AvatarUrl, cancellationToken)); + + _writer.WriteString( + "avatarUrl", + await Context.ResolveAssetUrlAsync(message.Author.AvatarUrl, cancellationToken) + ); + _writer.WriteEndObject(); // Attachments diff --git a/DiscordChatExporter.Core/Exporting/PreambleTemplate.cshtml b/DiscordChatExporter.Core/Exporting/PreambleTemplate.cshtml index 730caca3..5670c08f 100644 --- a/DiscordChatExporter.Core/Exporting/PreambleTemplate.cshtml +++ b/DiscordChatExporter.Core/Exporting/PreambleTemplate.cshtml @@ -851,7 +851,7 @@
- Guild icon + Guild icon
@ExportContext.Request.Guild.Name