diff --git a/DiscordChatExporter.Core/Discord/Data/Channel.cs b/DiscordChatExporter.Core/Discord/Data/Channel.cs index 625a837..fd4403c 100644 --- a/DiscordChatExporter.Core/Discord/Data/Channel.cs +++ b/DiscordChatExporter.Core/Discord/Data/Channel.cs @@ -20,8 +20,9 @@ public partial record Channel( Snowflake? LastMessageId) : IHasId { // Used for visual backwards-compatibility with old exports, where - // channels without a parent (i.e. mostly DM channels) had a fallback - // category created for them. + // channels without a parent (i.e. mostly DM channels) or channels + // with an inaccessible parent (i.e. inside private categories) had + // a fallback category created for them. public string Category => Parent?.Name ?? Kind switch { ChannelKind.GuildCategory => "Category", diff --git a/DiscordChatExporter.Core/Discord/DiscordClient.cs b/DiscordChatExporter.Core/Discord/DiscordClient.cs index b112ec2..0b5f181 100644 --- a/DiscordChatExporter.Core/Discord/DiscordClient.cs +++ b/DiscordChatExporter.Core/Discord/DiscordClient.cs @@ -368,11 +368,21 @@ public class DiscordClient .GetNonWhiteSpaceStringOrNull()? .Pipe(Snowflake.Parse); - var parent = parentId is not null - ? await GetChannelAsync(parentId.Value, cancellationToken) - : null; + try + { + var parent = parentId is not null + ? await GetChannelAsync(parentId.Value, cancellationToken) + : null; - return Channel.Parse(response, parent); + return Channel.Parse(response, parent); + } + // It's possible for the parent channel to be inaccessible, despite the + // child channel being accessible. + // https://github.com/Tyrrrz/DiscordChatExporter/issues/1108 + catch (DiscordChatExporterException) + { + return Channel.Parse(response); + } } private async ValueTask TryGetLastMessageAsync(