From 768fb88c8cf6900c173b3f25dabf99ee5349f9e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Slatinsk=C3=BD?= <43640724+slatinsky@users.noreply.github.com> Date: Mon, 3 Jul 2023 17:18:30 +0200 Subject: [PATCH] Export role details in JSON format (#1101) --- .../Exporting/ExportContext.cs | 21 ++++++++------ .../Exporting/JsonMessageWriter.cs | 28 ++++++++++++++++++- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/DiscordChatExporter.Core/Exporting/ExportContext.cs b/DiscordChatExporter.Core/Exporting/ExportContext.cs index 9051f972..7309df67 100644 --- a/DiscordChatExporter.Core/Exporting/ExportContext.cs +++ b/DiscordChatExporter.Core/Exporting/ExportContext.cs @@ -91,21 +91,26 @@ internal class ExportContext public Color? TryGetUserColor(Snowflake id) { - var member = TryGetMember(id); - - var memberRoles = member? - .RoleIds - .Select(TryGetRole) - .WhereNotNull() - .ToArray(); + var memberRoles = GetUserRoles(id); return memberRoles? .Where(r => r.Color is not null) - .OrderByDescending(r => r.Position) .Select(r => r.Color) .FirstOrDefault(); } + public IReadOnlyList GetUserRoles(Snowflake id) + { + var member = TryGetMember(id); + + return member? + .RoleIds + .Select(TryGetRole) + .WhereNotNull() + .OrderByDescending(r => r.Position) + .ToArray() ?? Array.Empty(); + } + public async ValueTask ResolveAssetUrlAsync(string url, CancellationToken cancellationToken = default) { if (!Request.ShouldDownloadAssets) diff --git a/DiscordChatExporter.Core/Exporting/JsonMessageWriter.cs b/DiscordChatExporter.Core/Exporting/JsonMessageWriter.cs index 88d36d75..469de226 100644 --- a/DiscordChatExporter.Core/Exporting/JsonMessageWriter.cs +++ b/DiscordChatExporter.Core/Exporting/JsonMessageWriter.cs @@ -1,4 +1,5 @@ -using System.IO; +using System.Collections.Generic; +using System.IO; using System.Text.Encodings.Web; using System.Text.Json; using System.Threading; @@ -48,6 +49,9 @@ internal class JsonMessageWriter : MessageWriter _writer.WriteString("color", Context.TryGetUserColor(user.Id)?.ToHex()); _writer.WriteBoolean("isBot", user.IsBot); + _writer.WritePropertyName("roles"); + await WriteRolesAsync(Context.GetUserRoles(user.Id), cancellationToken); + _writer.WriteString( "avatarUrl", await Context.ResolveAssetUrlAsync( @@ -60,6 +64,28 @@ internal class JsonMessageWriter : MessageWriter await _writer.FlushAsync(cancellationToken); } + private async ValueTask WriteRolesAsync( + IReadOnlyList roles, + CancellationToken cancellationToken = default) + { + _writer.WriteStartArray(); + + foreach (var role in roles) + { + _writer.WriteStartObject(); + + _writer.WriteString("id", role.Id.ToString()); + _writer.WriteString("name", role.Name); + _writer.WriteString("color", role.Color?.ToHex()); + _writer.WriteNumber("position", role.Position); + + _writer.WriteEndObject(); + } + + _writer.WriteEndArray(); + await _writer.FlushAsync(cancellationToken); + } + private async ValueTask WriteEmbedAuthorAsync( EmbedAuthor embedAuthor, CancellationToken cancellationToken = default)