diff --git a/DiscordChatExporter.Core/Exporting/ChannelExporter.cs b/DiscordChatExporter.Core/Exporting/ChannelExporter.cs index 67befd4d..0abfce35 100644 --- a/DiscordChatExporter.Core/Exporting/ChannelExporter.cs +++ b/DiscordChatExporter.Core/Exporting/ChannelExporter.cs @@ -37,8 +37,9 @@ public class ChannelExporter(DiscordClient discord) ); } - // Check if the 'after' boundary is valid - if (request.After is not null && !request.Channel.MayHaveMessagesAfter(request.After.Value)) + // Check if the 'before' and 'after' boundaries are valid + if ((request.Before is not null && !request.Channel.MayHaveMessagesBefore(request.Before.Value)) || + (request.After is not null && !request.Channel.MayHaveMessagesAfter(request.After.Value))) { Console.Error.WriteLine( $"NOTE: Channel '{request.Channel.Name}' " @@ -47,19 +48,6 @@ public class ChannelExporter(DiscordClient discord) ); } - // Check if the 'before' boundary is valid - if ( - request.Before is not null - && !request.Channel.MayHaveMessagesBefore(request.Before.Value) - ) - { - throw new DiscordChatExporterException( - $"Channel '{request.Channel.Name}' " - + $"of guild '{request.Guild.Name}' " - + $"does not contain any messages within the specified period." - ); - } - // Build context var context = new ExportContext(discord, request); await context.PopulateChannelsAndRolesAsync(cancellationToken); diff --git a/tags b/tags new file mode 100644 index 00000000..38320521 --- /dev/null +++ b/tags @@ -0,0 +1,871 @@ +!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ +!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/ +!_TAG_OUTPUT_FILESEP slash /slash or backslash/ +!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/ +!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/ +!_TAG_PROC_CWD /zfs/data/src/ajenos/Tyrrrz/DiscordChatExporter/ // +!_TAG_PROGRAM_AUTHOR Universal Ctags Team // +!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/ +!_TAG_PROGRAM_URL https://ctags.io/ /official site/ +!_TAG_PROGRAM_VERSION 5.9.0 // +$schema DiscordChatExporter.Cli.Tests/xunit.runner.json /^ "$schema": "https:\/\/xunit.net\/schema\/current\/xunit.runner.schema.json",$/;" s +Active DiscordChatExporter.Cli/Commands/Shared/ThreadInclusionMode.cs /^ Active,$/;" e enum:ThreadInclusionMode file: +Active DiscordChatExporter.Gui/Models/ThreadInclusionMode.cs /^ Active,$/;" e enum:ThreadInclusionMode file: +Add DiscordChatExporter.Gui/Utils/DisposableCollector.cs /^ public void Add(IDisposable item)$/;" m class:DisposableCollector +After DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public Snowflake? After { get; init; }$/;" p class:ExportCommandBase +After DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public Snowflake? After { get; }$/;" p class:ExportRequest +AggregateMatcher DiscordChatExporter.Core/Markdown/Parsing/AggregateMatcher.cs /^internal class AggregateMatcher($/;" m +All DiscordChatExporter.Cli/Commands/Shared/ThreadInclusionMode.cs /^ All,$/;" e enum:ThreadInclusionMode file: +All DiscordChatExporter.Gui/Models/ThreadInclusionMode.cs /^ All,$/;" e enum:ThreadInclusionMode file: +And DiscordChatExporter.Core/Exporting/Filtering/BinaryExpressionKind.cs /^ And,$/;" e enum:BinaryExpressionKind file: +Apng DiscordChatExporter.Core/Discord/Data/StickerFormat.cs /^ Apng = 2,$/;" e enum:StickerFormat file: +App DiscordChatExporter.Gui/App.axaml.cs /^ public App()$/;" m class:App +App DiscordChatExporter.Gui/App.axaml.cs /^public class App : Application, IDisposable$/;" c +AppendIfNotEmpty DiscordChatExporter.Core/Utils/Extensions/StringExtensions.cs /^ public static StringBuilder AppendIfNotEmpty(this StringBuilder builder, char value) =>$/;" m class:StringExtensions +Application DiscordChatExporter.Core/Discord/Data/Application.cs /^public partial record Application$/;" p +Application DiscordChatExporter.Core/Discord/Data/Application.cs /^public partial record Application(Snowflake Id, string Name, ApplicationFlags Flags)$/;" m +ApplicationAutoModerationRuleCreateBadge DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ ApplicationAutoModerationRuleCreateBadge = 64,$/;" e enum:ApplicationFlags file: +ApplicationCommandBadge DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ ApplicationCommandBadge = 8388608,$/;" e enum:ApplicationFlags file: +ApplicationFlags DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^public enum ApplicationFlags$/;" g +Assembly DiscordChatExporter.Gui/Program.cs /^ private static Assembly Assembly { get; } = Assembly.GetExecutingAssembly();$/;" p class:Program +AssetsDirPath DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public string? AssetsDirPath$/;" p class:ExportCommandBase +AssetsDirPath DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public string AssetsDirPath { get; }$/;" p class:ExportRequest +AsyncCollectionExtensions DiscordChatExporter.Core/Utils/Extensions/AsyncCollectionExtensions.cs /^public static class AsyncCollectionExtensions$/;" c +Attachment DiscordChatExporter.Core/Discord/Data/Attachment.cs /^public partial record Attachment$/;" p +Attachment DiscordChatExporter.Core/Discord/Data/Attachment.cs /^public partial record Attachment($/;" m +AttachmentTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake AttachmentTestCases { get; } = Snowflake.Parse("885587741654536192")/;" p class:ChannelIds +AutoLinkNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher AutoLinkNodeMatcher =$/;" f class:MarkdownParser file: +AvailableLocales DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public IReadOnlyList AvailableLocales { get; } =$/;" p class:SettingsViewModel +AvailableThemes DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public IReadOnlyList AvailableThemes { get; } = Enum.GetValues()/;" p class:SettingsViewModel +AvailableThreadInclusionModes DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public IReadOnlyList AvailableThreadInclusionModes { get; } =$/;" p class:SettingsViewModel +AvaloniaClockIdentifier DiscordChatExporter.Gui/Utils/Internationalization.cs /^ public static string AvaloniaClockIdentifier => Is24Hours ? "24HourClock" : "12HourClock";$/;" f class:Internationalization +AvaloniaExtensions DiscordChatExporter.Gui/Utils/Extensions/AvaloniaExtensions.cs /^internal static class AvaloniaExtensions$/;" c +Before DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public Snowflake? Before { get; init; }$/;" p class:ExportCommandBase +Before DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public Snowflake? Before { get; }$/;" p class:ExportRequest +BinaryExpressionKind DiscordChatExporter.Core/Exporting/Filtering/BinaryExpressionKind.cs /^internal enum BinaryExpressionKind$/;" g +BinaryExpressionMessageFilter DiscordChatExporter.Core/Exporting/Filtering/BinaryExpressionMessageFilter.cs /^internal class BinaryExpressionMessageFilter($/;" m +BinaryExtensions DiscordChatExporter.Core/Utils/Extensions/BinaryExtensions.cs /^public static class BinaryExtensions$/;" c +Bold DiscordChatExporter.Core/Markdown/FormattingKind.cs /^ Bold,$/;" e enum:FormattingKind file: +BoldFormattingNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher BoldFormattingNodeMatcher =$/;" f class:MarkdownParser file: +Bot DiscordChatExporter.Core/Discord/TokenKind.cs /^ Bot,$/;" e enum:TokenKind file: +Build DiscordChatExporter.Core/Utils/UrlBuilder.cs /^ public string Build()$/;" m class:UrlBuilder +BuildAvaloniaApp DiscordChatExporter.Gui/Program.cs /^ public static AppBuilder BuildAvaloniaApp() =>$/;" m class:Program +ButtonsCount DiscordChatExporter.Gui/ViewModels/Dialogs/MessageBoxViewModel.cs /^ public int ButtonsCount => (IsDefaultButtonVisible ? 1 : 0) + (IsCancelButtonVisible ? 1 : 0/;" f class:MessageBoxViewModel +By editing the settings file .docs/Token-and-IDs.md /^#### By editing the settings file$/;" t subsection:Obtaining Token and Channel IDs""How to get a User Token""Through the desktop app / enabling web developer tools +CLI .docs/Troubleshooting.md /^## CLI$/;" s chapter:Troubleshooting +CLI Caveats .docs/Message-filters.md /^## CLI Caveats$/;" s chapter:Message filters +CLI commands .docs/Using-the-CLI.md /^## CLI commands$/;" s chapter:Using the CLI +CSV .docs/Getting-started.md /^### CSV$/;" S section:Getting started""File formats +Call DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^ Call = 3,$/;" e enum:MessageKind file: +Can DCE add new messages to an existing export? .docs/Troubleshooting.md /^### Can DCE add new messages to an existing export?$/;" S section:Troubleshooting""General questions +Can DCE download images? .docs/Troubleshooting.md /^### Can DCE download images?$/;" S section:Troubleshooting""General questions +Can DCE export messages that have already been deleted? .docs/Troubleshooting.md /^### Can DCE export messages that have already been deleted?$/;" S section:Troubleshooting""General questions +Can DCE export multiple formats at once? .docs/Troubleshooting.md /^### Can DCE export multiple formats at once?$/;" S section:Troubleshooting""General questions +Can DCE export private chats? .docs/Troubleshooting.md /^### Can DCE export private chats?$/;" S section:Troubleshooting""General questions +Can DCE recreate the exported chats in Discord? .docs/Troubleshooting.md /^### Can DCE recreate the exported chats in Discord?$/;" S section:Troubleshooting""General questions +Can DCE reupload exported messages to another channel? .docs/Troubleshooting.md /^### Can DCE reupload exported messages to another channel?$/;" S section:Troubleshooting""General questions +Can the exported chats be shared? .docs/Troubleshooting.md /^### Can the exported chats be shared?$/;" S section:Troubleshooting""General questions +CanExport DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private bool CanExport() =>$/;" m class:DashboardViewModel file: +CanPullChannels DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private bool CanPullChannels() => !IsBusy && _discord is not null && SelectedGuild is not nu/;" m class:DashboardViewModel file: +CanPullGuilds DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private bool CanPullGuilds() => !IsBusy && !string.IsNullOrWhiteSpace(Token);$/;" m class:DashboardViewModel file: +ChainedFilter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser ChainedFilter = Parse.Chain($/;" f class:FilterGrammar file: +Changing the date format .docs/Using-the-CLI.md /^#### Changing the date format$/;" t section:Using the CLI""Export a specific channel +Changing the filename and output directory .docs/Using-the-CLI.md /^#### Changing the filename and output directory$/;" t section:Using the CLI""Export a specific channel +Changing the format .docs/Using-the-CLI.md /^#### Changing the format$/;" t section:Using the CLI""Export a specific channel +Changing the media directory .docs/Using-the-CLI.md /^#### Changing the media directory$/;" t section:Using the CLI""Export a specific channel +Changing the output directory .docs/Using-the-CLI.md /^#### Changing the output directory$/;" t section:Using the CLI""Export a specific channel +Changing the output filename .docs/Using-the-CLI.md /^#### Changing the output filename$/;" t section:Using the CLI""Export a specific channel +Channel DiscordChatExporter.Core/Discord/Data/Channel.cs /^public partial record Channel$/;" p +Channel DiscordChatExporter.Core/Discord/Data/Channel.cs /^public partial record Channel($/;" m +Channel DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public Channel Channel { get; }$/;" p class:ExportRequest +Channel DiscordChatExporter.Core/Markdown/MentionKind.cs /^ Channel,$/;" e enum:MentionKind file: +ChannelConnection DiscordChatExporter.Core/Discord/Data/ChannelConnection.cs /^public record ChannelConnection(Channel Channel, IReadOnlyList Children)$/;" m +ChannelExporter DiscordChatExporter.Core/Exporting/ChannelExporter.cs /^public class ChannelExporter(DiscordClient discord)$/;" m +ChannelIconChange DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^ ChannelIconChange = 5,$/;" e enum:MessageKind file: +ChannelIds DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^public static class ChannelIds$/;" c +ChannelIds DiscordChatExporter.Cli/Commands/ExportChannelsCommand.cs /^ public required IReadOnlyList ChannelIds { get; init; }$/;" p class:ExportChannelsCommand +ChannelKind DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^public enum ChannelKind$/;" g +ChannelMentionNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher ChannelMentionNodeMatcher =$/;" f class:MarkdownParser file: +ChannelNameChange DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^ ChannelNameChange = 4,$/;" e enum:MessageKind file: +ChannelPinnedMessage DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^ ChannelPinnedMessage = 6,$/;" e enum:MessageKind file: +ChannelToHierarchicalNameStringConverter DiscordChatExporter.Gui/Converters/ChannelToHierarchicalNameStringConverter.cs /^public class ChannelToHierarchicalNameStringConverter : IValueConverter$/;" c +Children DiscordChatExporter.Core/Markdown/IContainerNode.cs /^ IReadOnlyList Children { get; }$/;" p interface:IContainerNode +Clamp DiscordChatExporter.Core/Utils/Extensions/TimeSpanExtensions.cs /^ public static TimeSpan Clamp(this TimeSpan value, TimeSpan min, TimeSpan max)$/;" m class:TimeSpanExtensions +Client DiscordChatExporter.Core/Utils/Http.cs /^ public static HttpClient Client { get; } = new();$/;" p class:Http +Close DiscordChatExporter.Gui/Framework/DialogVIewModelBase.cs /^ protected void Close(T dialogResult)$/;" m class:DialogViewModelBase +CodedStandardEmojiNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher CodedStandardEmojiNodeMatche/;" f class:MarkdownParser file: +CollectAsync DiscordChatExporter.Core/Utils/Extensions/AsyncCollectionExtensions.cs /^ private static async ValueTask> CollectAsync($/;" m class:AsyncCollectionExtensions file: +CollectionExtensions DiscordChatExporter.Core/Utils/Extensions/CollectionExtensions.cs /^public static class CollectionExtensions$/;" c +ColorExtensions DiscordChatExporter.Core/Utils/Extensions/ColorExtensions.cs /^public static class ColorExtensions$/;" c +Command DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs /^ public ICommand? Command$/;" p class:HyperLink +CommandParameter DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs /^ public object? CommandParameter$/;" p class:HyperLink +CommandParameterProperty DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs /^ public static readonly StyledProperty CommandParameterProperty =$/;" f class:HyperLink +CommandProperty DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs /^ public static readonly StyledProperty CommandProperty =$/;" f class:HyperLink +Configuration DiscordChatExporter.Cli.Tests/Infra/Secrets.cs /^ private static readonly IConfigurationRoot Configuration = new ConfigurationBuilder()$/;" f class:Secrets file: +ConsoleExtensions DiscordChatExporter.Cli/Utils/Extensions/ConsoleExtensions.cs /^internal static class ConsoleExtensions$/;" c +ContainsFilter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser ContainsFilter = String.Select(v =>$/;" f class:FilterGrammar file: +ContainsMessageFilter DiscordChatExporter.Core/Exporting/Filtering/ContainsMessageFilter.cs /^internal class ContainsMessageFilter(string text) : MessageFilter$/;" m +Convert DiscordChatExporter.Cli/Commands/Converters/ThreadInclusionModeBindingConverter.cs /^ public override ThreadInclusionMode Convert(string? rawValue)$/;" m class:ThreadInclusionModeBindingConverter +Convert DiscordChatExporter.Cli/Commands/Converters/TruthyBooleanBindingConverter.cs /^ public override bool Convert(string? rawValue)$/;" m class:TruthyBooleanBindingConverter +Create DiscordChatExporter.Cli.Tests/Utils/TempDir.cs /^ public static TempDir Create()$/;" m class:TempDir +Create DiscordChatExporter.Cli.Tests/Utils/TempFile.cs /^ public static TempFile Create()$/;" m class:TempFile +CreateAnsiConsole DiscordChatExporter.Cli/Utils/Extensions/ConsoleExtensions.cs /^ public static IAnsiConsole CreateAnsiConsole(this IConsole console) =>$/;" m class:ConsoleExtensions +CreateMessageWriter DiscordChatExporter.Core/Exporting/MessageExporter.cs /^ private static MessageWriter CreateMessageWriter($/;" m class:MessageExporter file: +CreateProgressTicker DiscordChatExporter.Cli/Utils/Extensions/ConsoleExtensions.cs /^ public static Progress CreateProgressTicker(this IConsole console) =>$/;" m class:ConsoleExtensions +CreateStatusTicker DiscordChatExporter.Cli/Utils/Extensions/ConsoleExtensions.cs /^ public static Status CreateStatusTicker(this IConsole console) =>$/;" m class:ConsoleExtensions +Creating the .plist file .docs/Scheduling-MacOS.md /^## Creating the .plist file$/;" s chapter:Scheduling exports on macOS +Creating the script .docs/Scheduling-Linux.md /^## Creating the script$/;" s chapter:Scheduling exports with Cron +Creating the script .docs/Scheduling-MacOS.md /^## Creating the script$/;" s chapter:Scheduling exports on macOS +Creating the script .docs/Scheduling-Windows.md /^## Creating the script$/;" s chapter:Scheduling exports on Windows +CrossPost DiscordChatExporter.Core/Discord/Data/MessageFlags.cs /^ CrossPost = 2,$/;" e enum:MessageFlags file: +CrossPosted DiscordChatExporter.Core/Discord/Data/MessageFlags.cs /^ CrossPosted = 1,$/;" e enum:MessageFlags file: +Csv DiscordChatExporter.Core/Exporting/ExportFormat.cs /^ Csv,$/;" e enum:ExportFormat file: +CsvContentSpecs DiscordChatExporter.Cli.Tests/Specs/CsvContentSpecs.cs /^public class CsvContentSpecs$/;" c +CsvEncode DiscordChatExporter.Core/Exporting/CsvMessageWriter.cs /^ private static string CsvEncode(string value)$/;" m class:CsvMessageWriter file: +CsvMessageWriter DiscordChatExporter.Core/Exporting/CsvMessageWriter.cs /^internal partial class CsvMessageWriter$/;" c +CsvMessageWriter DiscordChatExporter.Core/Exporting/CsvMessageWriter.cs /^internal partial class CsvMessageWriter(Stream stream, ExportContext context)$/;" m +CultureInfo DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public CultureInfo? CultureInfo { get; }$/;" p class:ExportRequest +CustomEmojiNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher CustomEmojiNodeMatcher =$/;" f class:MarkdownParser file: +Dark DiscordChatExporter.Gui/Framework/ThemeVariant.cs /^ Dark,$/;" e enum:ThemeVariant file: +DashboardView DiscordChatExporter.Gui/Views/Components/DashboardView.axaml.cs /^ public DashboardView() => InitializeComponent();$/;" m class:DashboardView +DashboardView DiscordChatExporter.Gui/Views/Components/DashboardView.axaml.cs /^public partial class DashboardView : UserControl$/;" c +DashboardViewModel DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ public DashboardViewModel($/;" m class:DashboardViewModel +DashboardViewModel DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^public partial class DashboardViewModel : ViewModelBase$/;" c +DataContext DiscordChatExporter.Gui/Framework/UserControl.cs /^ public new TDataContext DataContext$/;" p class:UserControl +DataContext DiscordChatExporter.Gui/Framework/Window.cs /^ public new TDataContext DataContext$/;" p class:Window +DataDump DiscordChatExporter.Core/Discord/Dump/DataDump.cs /^public partial class DataDump$/;" c +DataDump DiscordChatExporter.Core/Discord/Dump/DataDump.cs /^public partial class DataDump(IReadOnlyList channels)$/;" m +DataDumpChannel DiscordChatExporter.Core/Discord/Dump/DataDumpChannel.cs /^public record DataDumpChannel(Snowflake Id, string Name);$/;" m +DataPackageFilePath DiscordChatExporter.Cli/Commands/ExportAllCommand.cs /^ public string? DataPackageFilePath { get; init; }$/;" p class:ExportAllCommand +Date ranges .docs/Using-the-CLI.md /^#### Date ranges$/;" t section:Using the CLI""Export a specific channel +DateFormat DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public string DateFormat { get; init; } = "MM\/dd\/yyyy h:mm tt";$/;" p class:ExportCommandBase +DateRangeSpecs DiscordChatExporter.Cli.Tests/Specs/DateRangeSpecs.cs /^public class DateRangeSpecs$/;" c +DateRangeTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake DateRangeTestCases { get; } = Snowflake.Parse("866674248747319326");$/;" p class:ChannelIds +Default DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^ Default = 0,$/;" e enum:MessageKind file: +DefaultRegexOptions DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private const RegexOptions DefaultRegexOptions =$/;" f class:MarkdownParser file: +DialogManager DiscordChatExporter.Gui/Framework/DialogManager.cs /^public class DialogManager : IDisposable$/;" c +DialogViewModelBase DiscordChatExporter.Gui/Framework/DialogVIewModelBase.cs /^public abstract partial class DialogViewModelBase : ViewModelBase$/;" c +DirPath DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ private static readonly string DirPath = Path.Combine($/;" f class:ExportWrapper file: +DirectGroupTextChat DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ DirectGroupTextChat = 3,$/;" e enum:ChannelKind file: +DirectTextChat DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ DirectTextChat = 1,$/;" e enum:ChannelKind file: +Discord DiscordChatExporter.Cli/Commands/Base/DiscordCommandBase.cs /^ protected DiscordClient Discord => _discordClient ??= new DiscordClient(Token);$/;" f class:DiscordCommandBase +DiscordChatExporter Readme.md /^# DiscordChatExporter$/;" c +DiscordChatExporter Tests DiscordChatExporter.Cli.Tests/Readme.md /^# DiscordChatExporter Tests$/;" c +DiscordChatExporterException DiscordChatExporter.Core/Exceptions/DiscordChatExporterException.cs /^public class DiscordChatExporterException($/;" m +DiscordClient DiscordChatExporter.Core/Discord/DiscordClient.cs /^public class DiscordClient(string token)$/;" m +DiscordCommandBase DiscordChatExporter.Cli/Commands/Base/DiscordCommandBase.cs /^public abstract class DiscordCommandBase : ICommand$/;" c +DiscordToken DiscordChatExporter.Cli.Tests/Infra/Secrets.cs /^ public static string DiscordToken =>$/;" f class:Secrets +Disposable DiscordChatExporter.Gui/Utils/Disposable.cs /^internal class Disposable(Action dispose) : IDisposable$/;" m +DisposableCollector DiscordChatExporter.Gui/Utils/DisposableCollector.cs /^internal class DisposableCollector : IDisposable$/;" c +DisposableExtensions DiscordChatExporter.Gui/Utils/Extensions/DisposableExtensions.cs /^internal static class DisposableExtensions$/;" c +Dispose DiscordChatExporter.Gui/App.axaml.cs /^ public void Dispose()$/;" m class:App +Dispose DiscordChatExporter.Gui/Framework/DialogManager.cs /^ public void Dispose() => _dialogLock.Dispose();$/;" m class:DialogManager +Dispose DiscordChatExporter.Gui/Framework/ViewModelBase.cs /^ protected virtual void Dispose(bool disposing) { }$/;" m class:ViewModelBase +Dispose DiscordChatExporter.Gui/Framework/ViewModelBase.cs /^ public void Dispose()$/;" m class:ViewModelBase +Dispose DiscordChatExporter.Gui/Utils/DisposableCollector.cs /^ public void Dispose()$/;" m class:DisposableCollector +Dispose DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ protected override void Dispose(bool disposing)$/;" m class:DashboardViewModel +Dispose DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ protected override void Dispose(bool disposing)$/;" m class:SettingsViewModel +DisposeAll DiscordChatExporter.Gui/Utils/Extensions/DisposableExtensions.cs /^ public static void DisposeAll(this IEnumerable disposables)$/;" m class:DisposableExtensions +Docker DiscordChatExporter.Core/Utils/Docker.cs /^public static class Docker$/;" c +Docker usage instructions .docs/Docker.md /^# Docker usage instructions$/;" c +Download Readme.md /^## Download$/;" s chapter:DiscordChatExporter +Downloading assets .docs/Using-the-CLI.md /^#### Downloading assets$/;" t section:Using the CLI""Export a specific channel +Embed DiscordChatExporter.Core/Discord/Data/Embeds/Embed.cs /^public partial record Embed$/;" p +Embed DiscordChatExporter.Core/Discord/Data/Embeds/Embed.cs /^public partial record Embed($/;" m +Embed DiscordChatExporter.Core/Exporting/Filtering/MessageContentMatchKind.cs /^ Embed,$/;" e enum:MessageContentMatchKind file: +EmbedAuthor DiscordChatExporter.Core/Discord/Data/Embeds/EmbedAuthor.cs /^public record EmbedAuthor(string? Name, string? Url, string? IconUrl, string? IconProxyUrl)$/;" m +EmbedField DiscordChatExporter.Core/Discord/Data/Embeds/EmbedField.cs /^public record EmbedField(string Name, string Value, bool IsInline)$/;" m +EmbedFooter DiscordChatExporter.Core/Discord/Data/Embeds/EmbedFooter.cs /^public record EmbedFooter(string Text, string? IconUrl, string? IconProxyUrl)$/;" m +EmbedImage DiscordChatExporter.Core/Discord/Data/Embeds/EmbedImage.cs /^public record EmbedImage(string? Url, string? ProxyUrl, int? Width, int? Height)$/;" m +EmbedKind DiscordChatExporter.Core/Discord/Data/Embeds/EmbedKind.cs /^public enum EmbedKind$/;" g +EmbedTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake EmbedTestCases { get; } = Snowflake.Parse("866472452459462687");$/;" p class:ChannelIds +EmbedVideo DiscordChatExporter.Core/Discord/Data/Embeds/EmbedVideo.cs /^public record EmbedVideo(string? Url, string? ProxyUrl, int? Width, int? Height)$/;" m +Embedded DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ Embedded = 131072,$/;" e enum:ApplicationFlags file: +Emoji DiscordChatExporter.Core/Discord/Data/Emoji.cs /^public partial record Emoji$/;" p +EmojiIndex DiscordChatExporter.Core/Discord/Data/EmojiIndex.cs /^internal static class EmojiIndex$/;" c +EmojiTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake EmojiTestCases { get; } = Snowflake.Parse("866768438290415636");$/;" p class:ChannelIds +Enum DiscordChatExporter.Core/Utils/Extensions/StringExtensions.cs /^ where T : struct, Enum => Enum.TryParse(str, ignoreCase, out var result) ? result : n/;" f class:StringExtensions file: +Environment variables .docs/Docker.md /^## Environment variables$/;" s chapter:Docker usage instructions +Ephemeral DiscordChatExporter.Core/Discord/Data/MessageFlags.cs /^ Ephemeral = 64,$/;" e enum:MessageFlags file: +Errors .docs/Troubleshooting.md /^## Errors$/;" s chapter:Troubleshooting +EscapeFileName DiscordChatExporter.Core/Utils/PathEx.cs /^ public static string EscapeFileName(string path)$/;" m class:PathEx +EscapedCharacter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser EscapedCharacter = Character$/;" f class:FilterGrammar file: +EscapedCharacterTextNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ > EscapedCharacterTextNodeMatcher = new RegexMatcher($/;" f class:MarkdownParser file: +EscapedSymbolTextNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher EscapedSymbolTextNodeMatcher/;" f class:MarkdownParser file: +Everyone DiscordChatExporter.Core/Markdown/MentionKind.cs /^ Everyone,$/;" e enum:MentionKind file: +EveryoneMentionNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher EveryoneMentionNodeMatcher =$/;" f class:MarkdownParser file: +Examples .docs/Message-filters.md /^## Examples$/;" s chapter:Message filters +ExceptionExtensions DiscordChatExporter.Core/Utils/Extensions/ExceptionExtensions.cs /^public static class ExceptionExtensions$/;" c +Excluding DMs .docs/Using-the-CLI.md /^#### Excluding DMs$/;" t subsection:Using the CLI""Export a specific channel""Export all channels +ExecuteAsync DiscordChatExporter.Cli/Commands/Base/DiscordCommandBase.cs /^ public virtual ValueTask ExecuteAsync(IConsole console)$/;" m class:DiscordCommandBase +ExecuteAsync DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public override async ValueTask ExecuteAsync(IConsole console)$/;" m class:ExportCommandBase +ExecuteAsync DiscordChatExporter.Cli/Commands/ExportAllCommand.cs /^ public override async ValueTask ExecuteAsync(IConsole console)$/;" m class:ExportAllCommand +ExecuteAsync DiscordChatExporter.Cli/Commands/ExportChannelsCommand.cs /^ public override async ValueTask ExecuteAsync(IConsole console)$/;" m class:ExportChannelsCommand +ExecuteAsync DiscordChatExporter.Cli/Commands/ExportDirectMessagesCommand.cs /^ public override async ValueTask ExecuteAsync(IConsole console)$/;" m class:ExportDirectMessagesCommand +ExecuteAsync DiscordChatExporter.Cli/Commands/ExportGuildCommand.cs /^ public override async ValueTask ExecuteAsync(IConsole console)$/;" m class:ExportGuildCommand +ExecuteAsync DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs /^ public override async ValueTask ExecuteAsync(IConsole console)$/;" m class:GetChannelsCommand +ExecuteAsync DiscordChatExporter.Cli/Commands/GetDirectChannelsCommand.cs /^ public override async ValueTask ExecuteAsync(IConsole console)$/;" m class:GetDirectChannelsCommand +ExecuteAsync DiscordChatExporter.Cli/Commands/GetGuildsCommand.cs /^ public override async ValueTask ExecuteAsync(IConsole console)$/;" m class:GetGuildsCommand +ExecuteAsync DiscordChatExporter.Cli/Commands/GuideCommand.cs /^ public ValueTask ExecuteAsync(IConsole console)$/;" m class:GuideCommand +Export a specific channel .docs/Using-the-CLI.md /^## Export a specific channel$/;" s chapter:Using the CLI +Export all channels .docs/Using-the-CLI.md /^### Export all channels$/;" S section:Using the CLI""Export a specific channel +Export at Startup .docs/Scheduling-Windows.md /^## Export at Startup$/;" s chapter:Scheduling exports on Windows +Export at a specific time and date .docs/Scheduling-MacOS.md /^### Export at a specific time and date$/;" S section:Scheduling exports on macOS""Creating the .plist file +Export channels from a specific server .docs/Using-the-CLI.md /^### Export channels from a specific server$/;" S section:Using the CLI""Export a specific channel +Export every _n_ seconds .docs/Scheduling-MacOS.md /^### Export every _n_ seconds$/;" S section:Scheduling exports on macOS""Creating the .plist file +ExportAllCommand DiscordChatExporter.Cli/Commands/ExportAllCommand.cs /^public class ExportAllCommand : ExportCommandBase$/;" c +ExportAssetDownloader DiscordChatExporter.Core/Exporting/ExportAssetDownloader.cs /^internal partial class ExportAssetDownloader$/;" c +ExportAssetDownloader DiscordChatExporter.Core/Exporting/ExportAssetDownloader.cs /^internal partial class ExportAssetDownloader(string workingDirPath, bool reuse)$/;" m +ExportAsync DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ private static async ValueTask ExportAsync(Snowflake channelId, ExportFormat format)$/;" m class:ExportWrapper file: +ExportAsync DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ protected async ValueTask ExportAsync(IConsole console, IReadOnlyList channels)$/;" m class:ExportCommandBase +ExportAsync DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ protected async ValueTask ExportAsync(IConsole console, IReadOnlyList channelIds)$/;" m class:ExportCommandBase +ExportAsync DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private async Task ExportAsync()$/;" m class:DashboardViewModel file: +ExportChannelsCommand DiscordChatExporter.Cli/Commands/ExportChannelsCommand.cs /^public class ExportChannelsCommand : ExportCommandBase$/;" c +ExportCommandBase DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^public abstract class ExportCommandBase : DiscordCommandBase$/;" c +ExportContext DiscordChatExporter.Core/Exporting/ExportContext.cs /^internal class ExportContext(DiscordClient discord, ExportRequest request)$/;" m +ExportDirectMessagesCommand DiscordChatExporter.Cli/Commands/ExportDirectMessagesCommand.cs /^public class ExportDirectMessagesCommand : ExportCommandBase$/;" c +ExportFormat DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public ExportFormat ExportFormat { get; init; } = ExportFormat.HtmlDark;$/;" p class:ExportCommandBase +ExportFormat DiscordChatExporter.Core/Exporting/ExportFormat.cs /^public enum ExportFormat$/;" g +ExportFormatExtensions DiscordChatExporter.Core/Exporting/ExportFormat.cs /^public static class ExportFormatExtensions$/;" c +ExportFormatToStringConverter DiscordChatExporter.Gui/Converters/ExportFormatToStringConverter.cs /^public class ExportFormatToStringConverter : IValueConverter$/;" c +ExportGuildCommand DiscordChatExporter.Cli/Commands/ExportGuildCommand.cs /^public class ExportGuildCommand : ExportCommandBase$/;" c +ExportRequest DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public ExportRequest($/;" m class:ExportRequest +ExportRequest DiscordChatExporter.Core/Exporting/ExportRequest.cs /^public partial class ExportRequest$/;" c +ExportSetupView DiscordChatExporter.Gui/Views/Dialogs/ExportSetupView.axaml.cs /^ public ExportSetupView() => InitializeComponent();$/;" m class:ExportSetupView +ExportSetupView DiscordChatExporter.Gui/Views/Dialogs/ExportSetupView.axaml.cs /^public partial class ExportSetupView : UserControl$/;" c +ExportSetupViewModel DiscordChatExporter.Gui/ViewModels/Dialogs/ExportSetupViewModel.cs /^public partial class ExportSetupViewModel($/;" m +ExportWrapper DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ static ExportWrapper()$/;" m class:ExportWrapper file: +ExportWrapper DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^public static class ExportWrapper$/;" c +Exporter DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ protected ChannelExporter Exporter => _channelExporter ??= new ChannelExporter(Discord);$/;" f class:ExportCommandBase +Exporting on System Boot/User Login .docs/Scheduling-MacOS.md /^### Exporting on System Boot\/User Login$/;" S section:Scheduling exports on macOS""Creating the .plist file +Extra launchctl commands .docs/Scheduling-MacOS.md /^### Extra launchctl commands$/;" S section:Scheduling exports on macOS""Loading the .plist into launchctl +ExtractEmojis DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ public static IReadOnlyList ExtractEmojis(string markdown) =>$/;" m class:MarkdownParser +ExtractLinks DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ public static IReadOnlyList ExtractLinks(string markdown) =>$/;" m class:MarkdownParser +FAQ & Troubleshooting .docs/Readme.md /^## FAQ & Troubleshooting$/;" s chapter:Home +Features Readme.md /^## Features$/;" s chapter:DiscordChatExporter +File DiscordChatExporter.Core/Exporting/Filtering/MessageContentMatchKind.cs /^ File,$/;" e enum:MessageContentMatchKind file: +File formats .docs/Getting-started.md /^## File formats$/;" s chapter:Getting started +FileSize DiscordChatExporter.Core/Discord/Data/Common/FileSize.cs /^public partial record struct FileSize$/;" s +FileSize DiscordChatExporter.Core/Discord/Data/Common/FileSize.cs /^public readonly partial record struct FileSize(long TotalBytes)$/;" m +FileSizePartitionLimit DiscordChatExporter.Core/Exporting/Partitioning/FileSizePartitionLimit.cs /^internal class FileSizePartitionLimit(long limit) : PartitionLimit$/;" m +Filter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ public static readonly TextParser Filter = ChainedFilter.Token().AtEnd();$/;" f class:FilterGrammar +FilterGrammar DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^internal static class FilterGrammar$/;" c +FilterSpecs DiscordChatExporter.Cli.Tests/Specs/FilterSpecs.cs /^public class FilterSpecs$/;" c +FilterTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake FilterTestCases { get; } = Snowflake.Parse("866744075033641020");$/;" p class:ChannelIds +Filtering messages .docs/Using-the-CLI.md /^#### Filtering messages$/;" t section:Using the CLI""Export a specific channel +First steps .docs/Troubleshooting.md /^## First steps$/;" s chapter:Troubleshooting +Format DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public ExportFormat Format { get; }$/;" p class:ExportRequest +FormatAsync DiscordChatExporter.Core/Exporting/HtmlMarkdownVisitor.cs /^ public static async ValueTask FormatAsync($/;" m class:HtmlMarkdownVisitor +FormatAsync DiscordChatExporter.Core/Exporting/PlainTextMarkdownVisitor.cs /^ public static async ValueTask FormatAsync($/;" m class:PlainTextMarkdownVisitor +FormatPath DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ private static string FormatPath($/;" m class:ExportRequest file: +FormattingKind DiscordChatExporter.Core/Markdown/FormattingKind.cs /^internal enum FormattingKind$/;" g +FormattingNode DiscordChatExporter.Core/Markdown/FormattingNode.cs /^internal record FormattingNode(FormattingKind Kind, IReadOnlyList Children)$/;" m +FromBytes DiscordChatExporter.Core/Discord/Data/Common/FileSize.cs /^ public static FileSize FromBytes(long bytes) => new(bytes);$/;" m struct:FileSize +FromFilter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser FromFilter = Span.EqualToIgnoreCase("from:/;" f class:FilterGrammar file: +FromMessageFilter DiscordChatExporter.Core/Exporting/Filtering/FromMessageFilter.cs /^internal class FromMessageFilter(string value) : MessageFilter$/;" m +GUI or CLI? .docs/Getting-started.md /^## GUI or CLI?$/;" s chapter:Getting started +GatewayGuildMembers DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ GatewayGuildMembers = 16384,$/;" e enum:ApplicationFlags file: +GatewayGuildMembersLimited DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ GatewayGuildMembersLimited = 32768,$/;" e enum:ApplicationFlags file: +GatewayMessageContent DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ GatewayMessageContent = 262144,$/;" e enum:ApplicationFlags file: +GatewayMessageContentLimited DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ GatewayMessageContentLimited = 524288,$/;" e enum:ApplicationFlags file: +GatewayPresence DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ GatewayPresence = 4096,$/;" e enum:ApplicationFlags file: +GatewayPresenceLimited DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ GatewayPresenceLimited = 8192,$/;" e enum:ApplicationFlags file: +General questions .docs/Troubleshooting.md /^## General questions$/;" s chapter:Troubleshooting +Generating the filename and output directory dynamically .docs/Using-the-CLI.md /^#### Generating the filename and output directory dynamically$/;" t section:Using the CLI""Export a specific channel +GenericExtensions DiscordChatExporter.Core/Utils/Extensions/GenericExtensions.cs /^public static class GenericExtensions$/;" c +GetAwaiter DiscordChatExporter.Core/Utils/Extensions/AsyncCollectionExtensions.cs /^ public static ValueTaskAwaiter> GetAwaiter($/;" m class:AsyncCollectionExtensions +GetChannelIconUrl DiscordChatExporter.Core/Discord/Data/Common/ImageCdn.cs /^ public static string GetChannelIconUrl(Snowflake channelId, string iconHash, int size = 512)/;" m class:ImageCdn +GetChannelsCommand DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs /^public class GetChannelsCommand : DiscordCommandBase$/;" c +GetCustomEmojiUrl DiscordChatExporter.Core/Discord/Data/Common/ImageCdn.cs /^ public static string GetCustomEmojiUrl(Snowflake emojiId, bool isAnimated = false) =>$/;" m class:ImageCdn +GetDefaultOutputFileName DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public static string GetDefaultOutputFileName($/;" m class:ExportRequest +GetDirectChannelsCommand DiscordChatExporter.Cli/Commands/GetDirectChannelsCommand.cs /^public class GetDirectChannelsCommand : DiscordCommandBase$/;" c +GetDisplayName DiscordChatExporter.Core/Exporting/ExportFormat.cs /^ public static string GetDisplayName(this ExportFormat format) =>$/;" m class:ExportFormatExtensions +GetFallbackContent DiscordChatExporter.Core/Exporting/PlainTextMessageExtensions.cs /^ public static string GetFallbackContent(this Message message) =>$/;" m class:PlainTextMessageExtensions +GetFallbackUserAvatarUrl DiscordChatExporter.Core/Discord/Data/Common/ImageCdn.cs /^ public static string GetFallbackUserAvatarUrl(int index = 0) =>$/;" m class:ImageCdn +GetFileExtension DiscordChatExporter.Core/Exporting/ExportFormat.cs /^ public static string GetFileExtension(this ExportFormat format) =>$/;" m class:ExportFormatExtensions +GetFileNameFromUrl DiscordChatExporter.Core/Exporting/ExportAssetDownloader.cs /^ private static string GetFileNameFromUrl(string url)$/;" m class:ExportAssetDownloader file: +GetGuildIconUrl DiscordChatExporter.Core/Discord/Data/Common/ImageCdn.cs /^ public static string GetGuildIconUrl(Snowflake guildId, string iconHash, int size = 512) =>$/;" m class:ImageCdn +GetGuildsCommand DiscordChatExporter.Cli/Commands/GetGuildsCommand.cs /^public class GetGuildsCommand : DiscordCommandBase$/;" c +GetMemberAvatarUrl DiscordChatExporter.Core/Discord/Data/Common/ImageCdn.cs /^ public static string GetMemberAvatarUrl($/;" m class:ImageCdn +GetMessageAsHtmlAsync DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ public static async ValueTask GetMessageAsHtmlAsync($/;" m class:ExportWrapper +GetMessageAsJsonAsync DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ public static async ValueTask GetMessageAsJsonAsync($/;" m class:ExportWrapper +GetOutputBaseFilePath DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ private static string GetOutputBaseFilePath($/;" m class:ExportRequest file: +GetPartitionFilePath DiscordChatExporter.Core/Exporting/MessageExporter.cs /^ private static string GetPartitionFilePath(string baseFilePath, int partitionIndex)$/;" m class:MessageExporter file: +GetSelfAndChildren DiscordChatExporter.Core/Utils/Extensions/ExceptionExtensions.cs /^ public static IReadOnlyList GetSelfAndChildren(this Exception exception)$/;" m class:ExceptionExtensions +GetStandardEmojiUrl DiscordChatExporter.Core/Discord/Data/Common/ImageCdn.cs /^ public static string GetStandardEmojiUrl(string emojiName)$/;" m class:ImageCdn +GetStickerUrl DiscordChatExporter.Core/Discord/Data/Common/ImageCdn.cs /^ public static string GetStickerUrl(Snowflake stickerId, string format = "png") =>$/;" m class:ImageCdn +GetUrlHash DiscordChatExporter.Core/Exporting/ExportAssetDownloader.cs /^ private static string GetUrlHash(string url)$/;" m class:ExportAssetDownloader file: +GetUserAvatarUrl DiscordChatExporter.Core/Discord/Data/Common/ImageCdn.cs /^ public static string GetUserAvatarUrl(Snowflake userId, string avatarHash, int size = 512) =/;" m class:ImageCdn +Getting started .docs/Getting-started.md /^# Getting started$/;" c +Gif DiscordChatExporter.Core/Discord/Data/StickerFormat.cs /^ Gif = 4,$/;" e enum:StickerFormat file: +Gifv DiscordChatExporter.Core/Discord/Data/Embeds/EmbedKind.cs /^ Gifv,$/;" e enum:EmbedKind file: +GroupedFilter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser GroupedFilter =$/;" f class:FilterGrammar file: +GroupingTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake GroupingTestCases { get; } = Snowflake.Parse("992092091545034842");$/;" p class:ChannelIds +Guide .docs/Using-the-GUI.md /^## Guide$/;" s chapter:Using the GUI +GuideCommand DiscordChatExporter.Cli/Commands/GuideCommand.cs /^public class GuideCommand : ICommand$/;" c +Guides .docs/Readme.md /^## Guides$/;" s chapter:Home +Guild DiscordChatExporter.Core/Discord/Data/Guild.cs /^public partial record Guild$/;" p +Guild DiscordChatExporter.Core/Discord/Data/Guild.cs /^public partial record Guild(Snowflake Id, string Name, string IconUrl) : IHasId$/;" m +Guild DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public Guild Guild { get; }$/;" p class:ExportRequest +GuildCategory DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ GuildCategory = 4,$/;" e enum:ChannelKind file: +GuildDirectory DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ GuildDirectory = 14,$/;" e enum:ChannelKind file: +GuildForum DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ GuildForum = 15,$/;" e enum:ChannelKind file: +GuildId DiscordChatExporter.Cli/Commands/ExportGuildCommand.cs /^ public required Snowflake GuildId { get; init; }$/;" p class:ExportGuildCommand +GuildId DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs /^ public required Snowflake GuildId { get; init; }$/;" p class:GetChannelsCommand +GuildMemberJoin DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^ GuildMemberJoin = 7,$/;" e enum:MessageKind file: +GuildNews DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ GuildNews = 5,$/;" e enum:ChannelKind file: +GuildNewsThread DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ GuildNewsThread = 10,$/;" e enum:ChannelKind file: +GuildPrivateThread DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ GuildPrivateThread = 12,$/;" e enum:ChannelKind file: +GuildPublicThread DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ GuildPublicThread = 11,$/;" e enum:ChannelKind file: +GuildStageVoice DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ GuildStageVoice = 13,$/;" e enum:ChannelKind file: +GuildTextChat DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ GuildTextChat = 0,$/;" e enum:ChannelKind file: +GuildVoiceChat DiscordChatExporter.Core/Discord/Data/ChannelKind.cs /^ GuildVoiceChat = 2,$/;" e enum:ChannelKind file: +HTML .docs/Getting-started.md /^### HTML$/;" S section:Getting started""File formats +HasFilter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser HasFilter = Span.EqualToIgnoreCase("has:")$/;" f class:FilterGrammar file: +HasMessageFilter DiscordChatExporter.Core/Exporting/Filtering/HasMessageFilter.cs /^internal class HasMessageFilter(MessageContentMatchKind kind) : MessageFilter$/;" m +HasThread DiscordChatExporter.Core/Discord/Data/MessageFlags.cs /^ HasThread = 32,$/;" e enum:MessageFlags file: +HeadingNode DiscordChatExporter.Core/Markdown/HeadingNode.cs /^internal record HeadingNode(int Level, IReadOnlyList Children)$/;" m +HeadingNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher HeadingNodeMatcher =$/;" f class:MarkdownParser file: +Here DiscordChatExporter.Core/Markdown/MentionKind.cs /^ Here,$/;" e enum:MentionKind file: +HereMentionNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher HereMentionNodeMatcher =$/;" f class:MarkdownParser file: +HiddenLinkNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher HiddenLinkNodeMatcher =$/;" f class:MarkdownParser file: +Home .docs/Readme.md /^# Home$/;" c +How can I find my token? .docs/Troubleshooting.md /^### How can I find my token?$/;" S section:Troubleshooting""First steps +How can I reset my token? .docs/Troubleshooting.md /^### How can I reset my token?$/;" S section:Troubleshooting""General questions +How can I set DCE to export automatically at certain times? .docs/Troubleshooting.md /^### How can I set DCE to export automatically at certain times?$/;" S section:Troubleshooting""First steps +How do I use the CLI? .docs/Troubleshooting.md /^### How do I use the CLI?$/;" S section:Troubleshooting""CLI +How to get a Bot Token .docs/Token-and-IDs.md /^## How to get a Bot Token$/;" s chapter:Obtaining Token and Channel IDs +How to get a Server ID or a Channel ID .docs/Token-and-IDs.md /^## How to get a Server ID or a Channel ID$/;" s chapter:Obtaining Token and Channel IDs +How to get a User Token .docs/Token-and-IDs.md /^## How to get a User Token$/;" s chapter:Obtaining Token and Channel IDs +Html DiscordChatExporter.Cli.Tests/Utils/Html.cs /^internal static class Html$/;" c +HtmlAttachmentSpecs DiscordChatExporter.Cli.Tests/Specs/HtmlAttachmentSpecs.cs /^public class HtmlAttachmentSpecs$/;" c +HtmlContentSpecs DiscordChatExporter.Cli.Tests/Specs/HtmlContentSpecs.cs /^public class HtmlContentSpecs$/;" c +HtmlDark DiscordChatExporter.Core/Exporting/ExportFormat.cs /^ HtmlDark,$/;" e enum:ExportFormat file: +HtmlEmbedSpecs DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^public class HtmlEmbedSpecs$/;" c +HtmlEncode DiscordChatExporter.Core/Exporting/HtmlMarkdownVisitor.cs /^ private static string HtmlEncode(string text) => WebUtility.HtmlEncode(text);$/;" m class:HtmlMarkdownVisitor file: +HtmlGroupingSpecs DiscordChatExporter.Cli.Tests/Specs/HtmlGroupingSpecs.cs /^public class HtmlGroupingSpecs$/;" c +HtmlLight DiscordChatExporter.Core/Exporting/ExportFormat.cs /^ HtmlLight,$/;" e enum:ExportFormat file: +HtmlMarkdownSpecs DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs /^public class HtmlMarkdownSpecs$/;" c +HtmlMarkdownVisitor DiscordChatExporter.Core/Exporting/HtmlMarkdownVisitor.cs /^internal partial class HtmlMarkdownVisitor$/;" c +HtmlMarkdownVisitor DiscordChatExporter.Core/Exporting/HtmlMarkdownVisitor.cs /^internal partial class HtmlMarkdownVisitor($/;" m +HtmlMentionSpecs DiscordChatExporter.Cli.Tests/Specs/HtmlMentionSpecs.cs /^public class HtmlMentionSpecs$/;" c +HtmlMessageExtensions DiscordChatExporter.Core/Exporting/HtmlMessageExtensions.cs /^internal static class HtmlMessageExtensions$/;" c +HtmlMessageWriter DiscordChatExporter.Core/Exporting/HtmlMessageWriter.cs /^internal class HtmlMessageWriter(Stream stream, ExportContext context, string themeName)$/;" m +HtmlReplySpecs DiscordChatExporter.Cli.Tests/Specs/HtmlReplySpecs.cs /^public class HtmlReplySpecs$/;" c +HtmlStickerSpecs DiscordChatExporter.Cli.Tests/Specs/HtmlStickerSpecs.cs /^public class HtmlStickerSpecs$/;" c +Http DiscordChatExporter.Core/Utils/Http.cs /^public static class Http$/;" c +HttpExtensions DiscordChatExporter.Core/Utils/Extensions/HttpExtensions.cs /^public static class HttpExtensions$/;" c +HyperLink DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs /^ public HyperLink() => InitializeComponent();$/;" m class:HyperLink +HyperLink DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs /^public partial class HyperLink : UserControl$/;" c +I can't export Direct Messages .docs/Troubleshooting.md /^### I can't export Direct Messages$/;" S section:Troubleshooting""CLI +I can't find Docker exported chats .docs/Troubleshooting.md /^### I can't find Docker exported chats$/;" S section:Troubleshooting""CLI +I see messages in the export, but they have no content .docs/Troubleshooting.md /^### I see messages in the export, but they have no content$/;" S section:Troubleshooting""First steps +IContainerNode DiscordChatExporter.Core/Markdown/IContainerNode.cs /^internal interface IContainerNode$/;" i +IHasId DiscordChatExporter.Core/Discord/Data/Common/IHasId.cs /^public interface IHasId$/;" i +IMatcher DiscordChatExporter.Core/Markdown/Parsing/IMatcher.cs /^internal interface IMatcher$/;" i +INotifyPropertyChanged DiscordChatExporter.Gui/Utils/Extensions/NotifyPropertyChangedExtensions.cs /^ where TOwner : INotifyPropertyChanged$/;" p class:NotifyPropertyChangedExtensions +I_can_export_a_channel_and_download_all_referenced_assets DiscordChatExporter.Cli.Tests/Specs/SelfContainedSpecs.cs /^ public async Task I_can_export_a_channel_and_download_all_referenced_assets()$/;" m class:SelfContainedSpecs +I_can_export_a_channel_and_the_messages_are_grouped_according_to_their_author_and_timestamps DiscordChatExporter.Cli.Tests/Specs/HtmlGroupingSpecs.cs /^ public async Task I_can_export_a_channel_and_the_messages_are_grouped_according_to_their_aut/;" m class:HtmlGroupingSpecs +I_can_export_a_channel_in_the_CSV_format DiscordChatExporter.Cli.Tests/Specs/CsvContentSpecs.cs /^ public async Task I_can_export_a_channel_in_the_CSV_format()$/;" m class:CsvContentSpecs +I_can_export_a_channel_in_the_HTML_format DiscordChatExporter.Cli.Tests/Specs/HtmlContentSpecs.cs /^ public async Task I_can_export_a_channel_in_the_HTML_format()$/;" m class:HtmlContentSpecs +I_can_export_a_channel_in_the_JSON_format DiscordChatExporter.Cli.Tests/Specs/JsonContentSpecs.cs /^ public async Task I_can_export_a_channel_in_the_JSON_format()$/;" m class:JsonContentSpecs +I_can_export_a_channel_in_the_TXT_format DiscordChatExporter.Cli.Tests/Specs/PlainTextContentSpecs.cs /^ public async Task I_can_export_a_channel_in_the_TXT_format()$/;" m class:PlainTextContentSpecs +I_can_export_a_channel_that_contains_a_message_cross_posted_from_another_guild DiscordChatExporter.Cli.Tests/Specs/HtmlReplySpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_cross_posted_from_another_g/;" m class:HtmlReplySpecs +I_can_export_a_channel_that_contains_a_message_that_replies_to_a_deleted_message DiscordChatExporter.Cli.Tests/Specs/HtmlReplySpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_that_replies_to_a_deleted_m/;" m class:HtmlReplySpecs +I_can_export_a_channel_that_contains_a_message_that_replies_to_an_empty_message_with_an_attachment DiscordChatExporter.Cli.Tests/Specs/HtmlReplySpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_that_replies_to_an_empty_me/;" m class:HtmlReplySpecs +I_can_export_a_channel_that_contains_a_message_that_replies_to_an_interaction DiscordChatExporter.Cli.Tests/Specs/HtmlReplySpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_that_replies_to_an_interact/;" m class:HtmlReplySpecs +I_can_export_a_channel_that_contains_a_message_that_replies_to_another_message DiscordChatExporter.Cli.Tests/Specs/HtmlReplySpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_that_replies_to_another_mes/;" m class:HtmlReplySpecs +I_can_export_a_channel_that_contains_a_message_with_a_GIFV_embed DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_GIFV_embed()$/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_a_GIFV_embed_and_the_text_is_hidden_if_it_only_contains_the_video_link DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_GIFV_embed_and_the_t/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_a_Lottie_sticker DiscordChatExporter.Cli.Tests/Specs/HtmlStickerSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_Lottie_sticker()$/;" m class:HtmlStickerSpecs +I_can_export_a_channel_that_contains_a_message_with_a_Lottie_sticker DiscordChatExporter.Cli.Tests/Specs/JsonStickerSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_Lottie_sticker()$/;" m class:JsonStickerSpecs +I_can_export_a_channel_that_contains_a_message_with_a_PNG_sticker DiscordChatExporter.Cli.Tests/Specs/HtmlStickerSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_PNG_sticker()$/;" m class:HtmlStickerSpecs +I_can_export_a_channel_that_contains_a_message_with_a_PNG_sticker DiscordChatExporter.Cli.Tests/Specs/JsonStickerSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_PNG_sticker()$/;" m class:JsonStickerSpecs +I_can_export_a_channel_that_contains_a_message_with_a_Spotify_track_embed DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_Spotify_track_embed(/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_a_Twitch_clip_embed DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_Twitch_clip_embed()$/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_a_Twitter_post_embed_that_includes_multiple_images DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_Twitter_post_embed_t/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_a_YouTube_video_embed DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_YouTube_video_embed(/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_a_generic_attachment DiscordChatExporter.Cli.Tests/Specs/HtmlAttachmentSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_generic_attachment()$/;" m class:HtmlAttachmentSpecs +I_can_export_a_channel_that_contains_a_message_with_a_generic_attachment DiscordChatExporter.Cli.Tests/Specs/JsonAttachmentSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_generic_attachment()$/;" m class:JsonAttachmentSpecs +I_can_export_a_channel_that_contains_a_message_with_a_guild_invite DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_guild_invite()$/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_a_rich_embed DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_rich_embed()$/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_a_rich_embed DiscordChatExporter.Cli.Tests/Specs/JsonEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_rich_embed()$/;" m class:JsonEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_a_role_mention DiscordChatExporter.Cli.Tests/Specs/HtmlMentionSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_role_mention()$/;" m class:HtmlMentionSpecs +I_can_export_a_channel_that_contains_a_message_with_a_role_mention DiscordChatExporter.Cli.Tests/Specs/JsonMentionSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_role_mention()$/;" m class:JsonMentionSpecs +I_can_export_a_channel_that_contains_a_message_with_a_text_channel_mention DiscordChatExporter.Cli.Tests/Specs/HtmlMentionSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_text_channel_mention/;" m class:HtmlMentionSpecs +I_can_export_a_channel_that_contains_a_message_with_a_text_channel_mention DiscordChatExporter.Cli.Tests/Specs/JsonMentionSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_text_channel_mention/;" m class:JsonMentionSpecs +I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker()$/;" m class:HtmlMarkdownSpecs +I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_the_full_format DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_/;" m class:HtmlMarkdownSpecs +I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_the_full_long_format DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_/;" m class:HtmlMarkdownSpecs +I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_the_long_date_format DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_/;" m class:HtmlMarkdownSpecs +I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_the_long_format DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_/;" m class:HtmlMarkdownSpecs +I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_the_relative_format DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_/;" m class:HtmlMarkdownSpecs +I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_the_short_date_format DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_/;" m class:HtmlMarkdownSpecs +I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_the_short_format DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_timestamp_marker_in_/;" m class:HtmlMarkdownSpecs +I_can_export_a_channel_that_contains_a_message_with_a_user_mention DiscordChatExporter.Cli.Tests/Specs/HtmlMentionSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_user_mention()$/;" m class:HtmlMentionSpecs +I_can_export_a_channel_that_contains_a_message_with_a_user_mention DiscordChatExporter.Cli.Tests/Specs/JsonMentionSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_user_mention()$/;" m class:JsonMentionSpecs +I_can_export_a_channel_that_contains_a_message_with_a_video_attachment DiscordChatExporter.Cli.Tests/Specs/HtmlAttachmentSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_video_attachment()$/;" m class:HtmlAttachmentSpecs +I_can_export_a_channel_that_contains_a_message_with_a_video_attachment DiscordChatExporter.Cli.Tests/Specs/JsonAttachmentSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_video_attachment()$/;" m class:JsonAttachmentSpecs +I_can_export_a_channel_that_contains_a_message_with_a_video_embed DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_video_embed()$/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_a_voice_channel_mention DiscordChatExporter.Cli.Tests/Specs/HtmlMentionSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_voice_channel_mentio/;" m class:HtmlMentionSpecs +I_can_export_a_channel_that_contains_a_message_with_a_voice_channel_mention DiscordChatExporter.Cli.Tests/Specs/JsonMentionSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_a_voice_channel_mentio/;" m class:JsonMentionSpecs +I_can_export_a_channel_that_contains_a_message_with_an_audio_attachment DiscordChatExporter.Cli.Tests/Specs/HtmlAttachmentSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_an_audio_attachment()$/;" m class:HtmlAttachmentSpecs +I_can_export_a_channel_that_contains_a_message_with_an_audio_attachment DiscordChatExporter.Cli.Tests/Specs/JsonAttachmentSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_an_audio_attachment()$/;" m class:JsonAttachmentSpecs +I_can_export_a_channel_that_contains_a_message_with_an_image_attachment DiscordChatExporter.Cli.Tests/Specs/HtmlAttachmentSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_an_image_attachment()$/;" m class:HtmlAttachmentSpecs +I_can_export_a_channel_that_contains_a_message_with_an_image_attachment DiscordChatExporter.Cli.Tests/Specs/JsonAttachmentSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_an_image_attachment()$/;" m class:JsonAttachmentSpecs +I_can_export_a_channel_that_contains_a_message_with_an_image_embed DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_an_image_embed()$/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_an_image_embed_and_the_text_is_hidden_if_it_only_contains_the_image_link DiscordChatExporter.Cli.Tests/Specs/HtmlEmbedSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_an_image_embed_and_the/;" m class:HtmlEmbedSpecs +I_can_export_a_channel_that_contains_a_message_with_an_invalid_timestamp_marker DiscordChatExporter.Cli.Tests/Specs/HtmlMarkdownSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_an_invalid_timestamp_m/;" m class:HtmlMarkdownSpecs +I_can_export_a_channel_that_contains_a_message_with_custom_inline_emoji_and_have_them_listed_separately DiscordChatExporter.Cli.Tests/Specs/JsonEmojiSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_custom_inline_emoji_an/;" m class:JsonEmojiSpecs +I_can_export_a_channel_that_contains_a_message_with_inline_emoji_and_have_them_listed_separately DiscordChatExporter.Cli.Tests/Specs/JsonEmojiSpecs.cs /^ public async Task I_can_export_a_channel_that_contains_a_message_with_inline_emoji_and_have_/;" m class:JsonEmojiSpecs +I_can_export_a_channel_with_partitioning_based_on_file_size DiscordChatExporter.Cli.Tests/Specs/PartitioningSpecs.cs /^ public async Task I_can_export_a_channel_with_partitioning_based_on_file_size()$/;" m class:PartitioningSpecs +I_can_export_a_channel_with_partitioning_based_on_message_count DiscordChatExporter.Cli.Tests/Specs/PartitioningSpecs.cs /^ public async Task I_can_export_a_channel_with_partitioning_based_on_message_count()$/;" m class:PartitioningSpecs +I_can_filter_the_export_to_only_include_messages_sent_after_the_specified_date DiscordChatExporter.Cli.Tests/Specs/DateRangeSpecs.cs /^ public async Task I_can_filter_the_export_to_only_include_messages_sent_after_the_specified_/;" m class:DateRangeSpecs +I_can_filter_the_export_to_only_include_messages_sent_before_the_specified_date DiscordChatExporter.Cli.Tests/Specs/DateRangeSpecs.cs /^ public async Task I_can_filter_the_export_to_only_include_messages_sent_before_the_specified/;" m class:DateRangeSpecs +I_can_filter_the_export_to_only_include_messages_sent_between_the_specified_dates DiscordChatExporter.Cli.Tests/Specs/DateRangeSpecs.cs /^ public async Task I_can_filter_the_export_to_only_include_messages_sent_between_the_specifie/;" m class:DateRangeSpecs +I_can_filter_the_export_to_only_include_messages_that_contain_guild_invites DiscordChatExporter.Cli.Tests/Specs/FilterSpecs.cs /^ public async Task I_can_filter_the_export_to_only_include_messages_that_contain_guild_invite/;" m class:FilterSpecs +I_can_filter_the_export_to_only_include_messages_that_contain_images DiscordChatExporter.Cli.Tests/Specs/FilterSpecs.cs /^ public async Task I_can_filter_the_export_to_only_include_messages_that_contain_images()$/;" m class:FilterSpecs +I_can_filter_the_export_to_only_include_messages_that_contain_the_specified_mention DiscordChatExporter.Cli.Tests/Specs/FilterSpecs.cs /^ public async Task I_can_filter_the_export_to_only_include_messages_that_contain_the_specifie/;" m class:FilterSpecs +I_can_filter_the_export_to_only_include_messages_that_contain_the_specified_text DiscordChatExporter.Cli.Tests/Specs/FilterSpecs.cs /^ public async Task I_can_filter_the_export_to_only_include_messages_that_contain_the_specifie/;" m class:FilterSpecs +I_can_filter_the_export_to_only_include_messages_that_have_been_pinned DiscordChatExporter.Cli.Tests/Specs/FilterSpecs.cs /^ public async Task I_can_filter_the_export_to_only_include_messages_that_have_been_pinned()$/;" m class:FilterSpecs +I_can_filter_the_export_to_only_include_messages_that_were_sent_by_the_specified_author DiscordChatExporter.Cli.Tests/Specs/FilterSpecs.cs /^ public async Task I_can_filter_the_export_to_only_include_messages_that_were_sent_by_the_spe/;" m class:FilterSpecs +Id DiscordChatExporter.Core/Discord/Data/Common/IHasId.cs /^ Snowflake Id { get; }$/;" p interface:IHasId +IgnoredEmojiTextNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher IgnoredEmojiTextNodeMatcher /;" f class:MarkdownParser file: +Image DiscordChatExporter.Core/Discord/Data/Embeds/EmbedKind.cs /^ Image,$/;" e enum:EmbedKind file: +Image DiscordChatExporter.Core/Exporting/Filtering/MessageContentMatchKind.cs /^ Image,$/;" e enum:MessageContentMatchKind file: +ImageCdn DiscordChatExporter.Core/Discord/Data/Common/ImageCdn.cs /^public static class ImageCdn$/;" c +In Chrome .docs/Token-and-IDs.md /^#### In Chrome$/;" t subsection:Obtaining Token and Channel IDs""How to get a User Token""Through your web browser +In Firefox .docs/Token-and-IDs.md /^#### In Firefox$/;" t subsection:Obtaining Token and Channel IDs""How to get a User Token""Through your web browser +IncludeDirectChannels DiscordChatExporter.Cli/Commands/ExportAllCommand.cs /^ public bool IncludeDirectChannels { get; init; } = true;$/;" p class:ExportAllCommand +IncludeGuildChannels DiscordChatExporter.Cli/Commands/ExportAllCommand.cs /^ public bool IncludeGuildChannels { get; init; } = true;$/;" p class:ExportAllCommand +IncludeVoiceChannels DiscordChatExporter.Cli/Commands/ExportAllCommand.cs /^ public bool IncludeVoiceChannels { get; init; } = true;$/;" p class:ExportAllCommand +IncludeVoiceChannels DiscordChatExporter.Cli/Commands/ExportGuildCommand.cs /^ public bool IncludeVoiceChannels { get; init; } = true;$/;" p class:ExportGuildCommand +IncludeVoiceChannels DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs /^ public bool IncludeVoiceChannels { get; init; } = true;$/;" p class:GetChannelsCommand +Including threads .docs/Using-the-CLI.md /^#### Including threads$/;" t subsection:Using the CLI""Export a specific channel""Export channels from a specific server +Including voice channels .docs/Using-the-CLI.md /^#### Including voice channels$/;" t subsection:Using the CLI""Export a specific channel""Export channels from a specific server +Initialize DiscordChatExporter.Gui/App.axaml.cs /^ public override void Initialize()$/;" m class:App +Initialize DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private void Initialize()$/;" m class:DashboardViewModel file: +InitializeTheme DiscordChatExporter.Gui/App.axaml.cs /^ private void InitializeTheme()$/;" m class:App file: +InlineCodeBlockNode DiscordChatExporter.Core/Markdown/InlineCodeBlockNode.cs /^internal record InlineCodeBlockNode(string Code) : MarkdownNode;$/;" m +InlineCodeBlockNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher InlineCodeBlockNodeMatcher =$/;" f class:MarkdownParser file: +Installation & Usage .docs/Readme.md /^## Installation & Usage$/;" s chapter:Home +Instance DiscordChatExporter.Gui/Converters/ChannelToHierarchicalNameStringConverter.cs /^ public static ChannelToHierarchicalNameStringConverter Instance { get; } = new();$/;" p class:ChannelToHierarchicalNameStringConverter +Instance DiscordChatExporter.Gui/Converters/ExportFormatToStringConverter.cs /^ public static ExportFormatToStringConverter Instance { get; } = new();$/;" p class:ExportFormatToStringConverter +Instance DiscordChatExporter.Gui/Converters/LocaleToDisplayNameStringConverter.cs /^ public static LocaleToDisplayNameStringConverter Instance { get; } = new();$/;" p class:LocaleToDisplayNameStringConverter +Instance DiscordChatExporter.Gui/Converters/SnowflakeToTimestampStringConverter.cs /^ public static SnowflakeToTimestampStringConverter Instance { get; } = new();$/;" p class:SnowflakeToTimestampStringConverter +Interaction DiscordChatExporter.Core/Discord/Data/Interaction.cs /^public record Interaction(Snowflake Id, string Name, User User)$/;" m +Internationalization DiscordChatExporter.Gui/Utils/Internationalization.cs /^internal static class Internationalization$/;" c +InvalidFileNameChars DiscordChatExporter.Core/Utils/PathEx.cs /^ private static readonly HashSet InvalidFileNameChars =$/;" f class:PathEx file: +Invite DiscordChatExporter.Core/Discord/Data/Invite.cs /^public record Invite(string Code, Guild Guild, Channel? Channel)$/;" m +Invite DiscordChatExporter.Core/Exporting/Filtering/MessageContentMatchKind.cs /^ Invite,$/;" e enum:MessageContentMatchKind file: +Is24Hours DiscordChatExporter.Gui/Utils/Internationalization.cs /^ public static bool Is24Hours =>$/;" f class:Internationalization +IsAutoUpdateEnabled DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public bool IsAutoUpdateEnabled$/;" p class:SettingsViewModel +IsBotToken DiscordChatExporter.Cli/Commands/Base/DiscordCommandBase.cs /^ public bool IsBotToken { get; init; } = false;$/;" p class:DiscordCommandBase +IsCancelButtonVisible DiscordChatExporter.Gui/ViewModels/Dialogs/MessageBoxViewModel.cs /^ public bool IsCancelButtonVisible => !string.IsNullOrWhiteSpace(CancelButtonText);$/;" f class:MessageBoxViewModel +IsContentHidden DiscordChatExporter.Core/Exporting/HtmlMessageExtensions.cs /^ public static bool IsContentHidden(this Message message)$/;" m class:HtmlMessageExtensions +IsDefaultButtonVisible DiscordChatExporter.Gui/ViewModels/Dialogs/MessageBoxViewModel.cs /^ public bool IsDefaultButtonVisible => !string.IsNullOrWhiteSpace(DefaultButtonText);$/;" f class:MessageBoxViewModel +IsDevelopmentBuild DiscordChatExporter.Gui/Program.cs /^ public static bool IsDevelopmentBuild { get; } = Version.Major is <= 0 or >= 999;$/;" p class:Program +IsMatch DiscordChatExporter.Core/Exporting/Filtering/MessageFilter.cs /^ public abstract bool IsMatch(Message message);$/;" m class:MessageFilter +IsProgressIndeterminate DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ public bool IsProgressIndeterminate => IsBusy && Progress.Current.Fraction is <= 0 or >= 1;$/;" f class:DashboardViewModel +IsReached DiscordChatExporter.Core/Exporting/Partitioning/NullPartitionLimit.cs /^ public override bool IsReached(long messagesWritten, long bytesWritten) => false;$/;" m class:NullPartitionLimit +IsReached DiscordChatExporter.Core/Exporting/Partitioning/PartitionLimit.cs /^ public abstract bool IsReached(long messagesWritten, long bytesWritten);$/;" m class:PartitionLimit +IsRunningInContainer DiscordChatExporter.Core/Utils/Docker.cs /^ public static bool IsRunningInContainer { get; } =$/;" p class:Docker +IsTokenPersisted DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public bool IsTokenPersisted$/;" p class:SettingsViewModel +IsUkraineSupportMessageDisabled DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public bool IsUkraineSupportMessageDisabled { get; init; } = false;$/;" p class:ExportCommandBase +IsUtcNormalizationEnabled DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public bool IsUtcNormalizationEnabled { get; init; } = false;$/;" p class:ExportCommandBase +IsUtcNormalizationEnabled DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public bool IsUtcNormalizationEnabled { get; }$/;" p class:ExportRequest +IsUtcNormalizationEnabled DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public bool IsUtcNormalizationEnabled$/;" p class:SettingsViewModel +Italic DiscordChatExporter.Core/Markdown/FormattingKind.cs /^ Italic,$/;" e enum:FormattingKind file: +ItalicAltFormattingNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher ItalicAltFormattingNodeMatch/;" f class:MarkdownParser file: +ItalicBoldFormattingNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ > ItalicBoldFormattingNodeMatcher = new RegexMatcher($/;" f class:MarkdownParser file: +ItalicFormattingNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher ItalicFormattingNodeMatcher /;" f class:MarkdownParser file: +ItalicUnderlineFormattingNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ > ItalicUnderlineFormattingNodeMatcher = new RegexMatcher($/;" f class:MarkdownParser file: +JSON .docs/Getting-started.md /^### JSON$/;" S section:Getting started""File formats +Json DiscordChatExporter.Core/Exporting/ExportFormat.cs /^ Json,$/;" e enum:ExportFormat file: +JsonAttachmentSpecs DiscordChatExporter.Cli.Tests/Specs/JsonAttachmentSpecs.cs /^public class JsonAttachmentSpecs$/;" c +JsonContentSpecs DiscordChatExporter.Cli.Tests/Specs/JsonContentSpecs.cs /^public class JsonContentSpecs$/;" c +JsonEmbedSpecs DiscordChatExporter.Cli.Tests/Specs/JsonEmbedSpecs.cs /^public class JsonEmbedSpecs$/;" c +JsonEmojiSpecs DiscordChatExporter.Cli.Tests/Specs/JsonEmojiSpecs.cs /^public class JsonEmojiSpecs$/;" c +JsonMentionSpecs DiscordChatExporter.Cli.Tests/Specs/JsonMentionSpecs.cs /^public class JsonMentionSpecs$/;" c +JsonMessageWriter DiscordChatExporter.Core/Exporting/JsonMessageWriter.cs /^internal class JsonMessageWriter(Stream stream, ExportContext context)$/;" m +JsonStickerSpecs DiscordChatExporter.Cli.Tests/Specs/JsonStickerSpecs.cs /^public class JsonStickerSpecs$/;" c +Light DiscordChatExporter.Gui/Framework/ThemeVariant.cs /^ Light,$/;" e enum:ThemeVariant file: +Link DiscordChatExporter.Core/Discord/Data/Embeds/EmbedKind.cs /^ Link,$/;" e enum:EmbedKind file: +Link DiscordChatExporter.Core/Exporting/Filtering/MessageContentMatchKind.cs /^ Link,$/;" e enum:MessageContentMatchKind file: +LinkNode DiscordChatExporter.Core/Markdown/LinkNode.cs /^internal record LinkNode(string Url, IReadOnlyList Children)$/;" m +List channels in a server .docs/Using-the-CLI.md /^### List channels in a server$/;" S section:Using the CLI""Export a specific channel +List direct message channels .docs/Using-the-CLI.md /^### List direct message channels$/;" S section:Using the CLI""Export a specific channel +List servers .docs/Using-the-CLI.md /^### List servers$/;" S section:Using the CLI""Export a specific channel +ListItemNode DiscordChatExporter.Core/Markdown/ListItemNode.cs /^internal record ListItemNode(IReadOnlyList Children) : MarkdownNode, IContainerNod/;" m +ListNode DiscordChatExporter.Core/Markdown/ListNode.cs /^internal record ListNode(IReadOnlyList Items) : MarkdownNode;$/;" m +ListNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher ListNodeMatcher =$/;" f class:MarkdownParser file: +LoadAsync DiscordChatExporter.Core/Discord/Dump/DataDump.cs /^ public static async ValueTask LoadAsync($/;" m class:DataDump +Loading DiscordChatExporter.Core/Discord/Data/MessageFlags.cs /^ Loading = 128,$/;" e enum:MessageFlags file: +Loading the .plist into launchctl .docs/Scheduling-MacOS.md /^## Loading the .plist into launchctl$/;" s chapter:Scheduling exports on macOS +Locale DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public string? Locale { get; init; }$/;" p class:ExportCommandBase +Locale DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public string? Locale { get; }$/;" p class:ExportRequest +Locale DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public string Locale$/;" p class:SettingsViewModel +LocaleToDisplayNameStringConverter DiscordChatExporter.Gui/Converters/LocaleToDisplayNameStringConverter.cs /^public class LocaleToDisplayNameStringConverter : IValueConverter$/;" c +Locker DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ private static readonly AsyncKeyedLocker Locker = new();$/;" f class:ExportWrapper file: +Log DiscordChatExporter.Core/Utils/Extensions/SuperpowerExtensions.cs /^ public static TextParser Log(this TextParser parser, string description) =>$/;" m class:SuperpowerExtensions +Lottie DiscordChatExporter.Core/Discord/Data/StickerFormat.cs /^ Lottie = 3,$/;" e enum:StickerFormat file: +Main DiscordChatExporter.Cli/Program.cs /^ public static async Task Main(string[] args) =>$/;" m class:Program +Main DiscordChatExporter.Gui/Program.cs /^ public static int Main(string[] args)$/;" m class:Program +MainView DiscordChatExporter.Gui/Views/MainView.axaml.cs /^ public MainView() => InitializeComponent();$/;" m class:MainView +MainView DiscordChatExporter.Gui/Views/MainView.axaml.cs /^public partial class MainView : Window$/;" c +MainViewModel DiscordChatExporter.Gui/ViewModels/MainViewModel.cs /^public partial class MainViewModel($/;" m +MarkdownContext DiscordChatExporter.Core/Markdown/Parsing/MarkdownContext.cs /^internal readonly record struct MarkdownContext(int Depth = 0);$/;" m +MarkdownNode DiscordChatExporter.Core/Markdown/EmojiNode.cs /^) : MarkdownNode$/;" p +MarkdownNode DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ where TNode : MarkdownNode$/;" p class:MarkdownParser +MarkdownNode DiscordChatExporter.Core/Markdown/TimestampNode.cs /^internal record TimestampNode(DateTimeOffset? Instant, string? Format) : MarkdownNode$/;" p +MarkdownParser DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^internal static partial class MarkdownParser$/;" c +MarkdownTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake MarkdownTestCases { get; } = Snowflake.Parse("866459526819348521");$/;" p class:ChannelIds +MarkdownVisitor DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^internal abstract class MarkdownVisitor$/;" c +MaskedLinkNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher MaskedLinkNodeMatcher =$/;" f class:MarkdownParser file: +MatchAll DiscordChatExporter.Core/Markdown/Parsing/IMatcher.cs /^ public static IEnumerable> MatchAll($/;" m class:MatcherExtensions +MatcherExtensions DiscordChatExporter.Core/Markdown/Parsing/IMatcher.cs /^internal static class MatcherExtensions$/;" c +Member DiscordChatExporter.Core/Discord/Data/Member.cs /^public partial record Member$/;" p +Member DiscordChatExporter.Core/Discord/Data/Member.cs /^public partial record Member($/;" m +MentionKind DiscordChatExporter.Core/Markdown/MentionKind.cs /^internal enum MentionKind$/;" g +MentionTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake MentionTestCases { get; } = Snowflake.Parse("866458801389174794");$/;" p class:ChannelIds +MentionsFilter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser MentionsFilter = Span.EqualToIgnoreCase($/;" f class:FilterGrammar file: +MentionsMessageFilter DiscordChatExporter.Core/Exporting/Filtering/MentionsMessageFilter.cs /^internal class MentionsMessageFilter(string value) : MessageFilter$/;" m +Message DiscordChatExporter.Core/Discord/Data/Message.cs /^public partial record Message$/;" p +Message DiscordChatExporter.Core/Discord/Data/Message.cs /^public partial record Message($/;" m +Message filters .docs/Message-filters.md /^# Message filters$/;" c +MessageBox DiscordChatExporter.Gui/Utils/NativeMethods.cs /^ public static extern int MessageBox(nint hWnd, string text, string caption, uint type);$/;" m class:NativeMethods.Windows file: +MessageBoxView DiscordChatExporter.Gui/Views/Dialogs/MessageBoxView.axaml.cs /^ public MessageBoxView() => InitializeComponent();$/;" m class:MessageBoxView +MessageBoxView DiscordChatExporter.Gui/Views/Dialogs/MessageBoxView.axaml.cs /^public partial class MessageBoxView : UserControl$/;" c +MessageBoxViewModel DiscordChatExporter.Gui/ViewModels/Dialogs/MessageBoxViewModel.cs /^public partial class MessageBoxViewModel : DialogViewModelBase$/;" c +MessageContentMatchKind DiscordChatExporter.Core/Exporting/Filtering/MessageContentMatchKind.cs /^internal enum MessageContentMatchKind$/;" g +MessageCountPartitionLimit DiscordChatExporter.Core/Exporting/Partitioning/MessageCountPartitionLimit.cs /^internal class MessageCountPartitionLimit(long limit) : PartitionLimit$/;" m +MessageExporter DiscordChatExporter.Core/Exporting/MessageExporter.cs /^internal partial class MessageExporter$/;" c +MessageExporter DiscordChatExporter.Core/Exporting/MessageExporter.cs /^internal partial class MessageExporter(ExportContext context) : IAsyncDisposable$/;" m +MessageFilter DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public MessageFilter MessageFilter { get; init; } = MessageFilter.Null;$/;" p class:ExportCommandBase +MessageFilter DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public MessageFilter MessageFilter { get; }$/;" p class:ExportRequest +MessageFilter DiscordChatExporter.Core/Exporting/Filtering/MessageFilter.cs /^public abstract partial class MessageFilter$/;" c +MessageFilter DiscordChatExporter.Core/Exporting/Filtering/MessageFilter.cs /^public partial class MessageFilter$/;" c +MessageFlags DiscordChatExporter.Core/Discord/Data/MessageFlags.cs /^public enum MessageFlags$/;" g +MessageKind DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^public enum MessageKind$/;" g +MessageWriter DiscordChatExporter.Core/Exporting/MessageWriter.cs /^internal abstract class MessageWriter(Stream stream, ExportContext context) : IAsyncDisposable$/;" m +MinimalNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher MinimalNodeMatcher =$/;" f class:MarkdownParser file: +MultiLineCodeBlockNode DiscordChatExporter.Core/Markdown/MultiLineCodeBlockNode.cs /^internal record MultiLineCodeBlockNode(string Language, string Code) : MarkdownNode;$/;" m +MultiLineCodeBlockNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher MultiLineCodeBlockNodeMatche/;" f class:MarkdownParser file: +MultiLineQuoteNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher MultiLineQuoteNodeMatcher =$/;" f class:MarkdownParser file: +Name DiscordChatExporter.Gui/Program.cs /^ public static string Name { get; } = Assembly.GetName().Name ?? "DiscordChatExporter";$/;" p class:Program +NativeMethods DiscordChatExporter.Gui/Utils/NativeMethods.cs /^internal static class NativeMethods$/;" c +NegatedFilter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser NegatedFilter = Character$/;" f class:FilterGrammar file: +NegatedMessageFilter DiscordChatExporter.Core/Exporting/Filtering/NegatedMessageFilter.cs /^internal class NegatedMessageFilter(MessageFilter filter) : MessageFilter$/;" m +NodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher NodeMatcher =$/;" f class:MarkdownParser file: +None DiscordChatExporter.Cli/Commands/Shared/ThreadInclusionMode.cs /^ None,$/;" e enum:ThreadInclusionMode file: +None DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ None = 0,$/;" e enum:ApplicationFlags file: +None DiscordChatExporter.Core/Discord/Data/MessageFlags.cs /^ None = 0,$/;" e enum:MessageFlags file: +None DiscordChatExporter.Gui/Models/ThreadInclusionMode.cs /^ None,$/;" e enum:ThreadInclusionMode file: +Notify DiscordChatExporter.Gui/Framework/SnackbarManager.cs /^ public void Notify($/;" m class:SnackbarManager +Notify DiscordChatExporter.Gui/Framework/SnackbarManager.cs /^ public void Notify(string message, TimeSpan? duration = null) =>$/;" m class:SnackbarManager +NotifyPropertyChangedExtensions DiscordChatExporter.Gui/Utils/Extensions/NotifyPropertyChangedExtensions.cs /^internal static class NotifyPropertyChangedExtensions$/;" c +Null DiscordChatExporter.Core/Exporting/Filtering/MessageFilter.cs /^ public static MessageFilter Null { get; } = new NullMessageFilter();$/;" p class:MessageFilter +Null DiscordChatExporter.Core/Exporting/Partitioning/PartitionLimit.cs /^ public static PartitionLimit Null { get; } = new NullPartitionLimit();$/;" p class:PartitionLimit +NullIfWhiteSpace DiscordChatExporter.Core/Utils/Extensions/StringExtensions.cs /^ public static string? NullIfWhiteSpace(this string str) =>$/;" m class:StringExtensions +NullMessageFilter DiscordChatExporter.Core/Exporting/Filtering/NullMessageFilter.cs /^internal class NullMessageFilter : MessageFilter$/;" c +NullPartitionLimit DiscordChatExporter.Core/Exporting/Partitioning/NullPartitionLimit.cs /^internal class NullPartitionLimit : PartitionLimit$/;" c +Obtaining Token and Channel IDs .docs/Token-and-IDs.md /^# Obtaining Token and Channel IDs$/;" c +OnAllPropertiesChanged DiscordChatExporter.Gui/Framework/ViewModelBase.cs /^ protected void OnAllPropertiesChanged() => OnPropertyChanged(string.Empty);$/;" m class:ViewModelBase +OnFrameworkInitializationCompleted DiscordChatExporter.Gui/App.axaml.cs /^ public override void OnFrameworkInitializationCompleted()$/;" m class:App +OpenDiscord DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private void OpenDiscord() => ProcessEx.StartShellExecute("https:\/\/discord.com\/app");$/;" m class:DashboardViewModel file: +OpenDiscordDeveloperPortal DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private void OpenDiscordDeveloperPortal() =>$/;" m class:DashboardViewModel file: +Or DiscordChatExporter.Core/Exporting/Filtering/BinaryExpressionKind.cs /^ Or,$/;" e enum:BinaryExpressionKind file: +OutputDirPath DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public string OutputDirPath { get; }$/;" p class:ExportRequest +OutputFilePath DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public string OutputFilePath { get; }$/;" p class:ExportRequest +OutputPath DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public string OutputPath$/;" p class:ExportCommandBase +ParallelLimit DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public int ParallelLimit { get; init; } = 1;$/;" p class:ExportCommandBase +ParallelLimit DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public int ParallelLimit$/;" p class:SettingsViewModel +Parse DiscordChatExporter.Cli.Tests/Utils/Html.cs /^ public static IHtmlDocument Parse(string source) => Parser.ParseDocument(source);$/;" m class:Html +Parse DiscordChatExporter.Core/Discord/Dump/DataDump.cs /^ public static DataDump Parse(JsonElement json)$/;" m class:DataDump +Parse DiscordChatExporter.Core/Discord/Snowflake.cs /^ public static Snowflake Parse(string value) => Parse(value, null);$/;" m struct:Snowflake +Parse DiscordChatExporter.Core/Discord/Snowflake.cs /^ public static Snowflake Parse(string value, IFormatProvider? formatProvider) =>$/;" m struct:Snowflake +Parse DiscordChatExporter.Core/Exporting/Filtering/MessageFilter.cs /^ public static MessageFilter Parse(string value) => FilterGrammar.Filter.Parse(value);$/;" m class:MessageFilter +Parse DiscordChatExporter.Core/Exporting/Partitioning/PartitionLimit.cs /^ public static PartitionLimit Parse(string value, IFormatProvider? formatProvider = null) =>$/;" m class:PartitionLimit +Parse DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static IReadOnlyList Parse($/;" m class:MarkdownParser file: +Parse DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ public static IReadOnlyList Parse(string markdown) =>$/;" m class:MarkdownParser +ParseMinimal DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static IReadOnlyList ParseMinimal($/;" m class:MarkdownParser file: +ParseMinimal DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ public static IReadOnlyList ParseMinimal(string markdown) =>$/;" m class:MarkdownParser +ParsedMatch DiscordChatExporter.Core/Markdown/Parsing/ParsedMatch.cs /^internal class ParsedMatch(StringSegment segment, T value)$/;" m +Parser DiscordChatExporter.Cli.Tests/Utils/Html.cs /^ private static readonly IHtmlParser Parser = new HtmlParser();$/;" f class:Html file: +PartitionLimit DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public PartitionLimit PartitionLimit { get; init; } = PartitionLimit.Null;$/;" p class:ExportCommandBase +PartitionLimit DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public PartitionLimit PartitionLimit { get; }$/;" p class:ExportRequest +PartitionLimit DiscordChatExporter.Core/Exporting/Partitioning/PartitionLimit.cs /^public abstract partial class PartitionLimit$/;" c +PartitionLimit DiscordChatExporter.Core/Exporting/Partitioning/PartitionLimit.cs /^public partial class PartitionLimit$/;" c +Partitioning .docs/Using-the-CLI.md /^#### Partitioning$/;" t section:Using the CLI""Export a specific channel +PartitioningSpecs DiscordChatExporter.Cli.Tests/Specs/PartitioningSpecs.cs /^public class PartitioningSpecs$/;" c +PathEx DiscordChatExporter.Cli.Tests/Utils/TempDir.cs /^using PathEx = System.IO.Path;$/;" t file: +PathEx DiscordChatExporter.Cli.Tests/Utils/TempFile.cs /^using PathEx = System.IO.Path;$/;" t file: +PathEx DiscordChatExporter.Core/Utils/PathEx.cs /^public static class PathEx$/;" c +Pin DiscordChatExporter.Core/Exporting/Filtering/MessageContentMatchKind.cs /^ Pin,$/;" e enum:MessageContentMatchKind file: +Pipe DiscordChatExporter.Core/Utils/Extensions/GenericExtensions.cs /^ public static TOut Pipe(this TIn input, Func transform) =>$/;" m class:GenericExtensions +Plain Text .docs/Getting-started.md /^### Plain Text$/;" S section:Getting started""File formats +PlainText DiscordChatExporter.Core/Exporting/ExportFormat.cs /^ PlainText,$/;" e enum:ExportFormat file: +PlainTextContentSpecs DiscordChatExporter.Cli.Tests/Specs/PlainTextContentSpecs.cs /^public class PlainTextContentSpecs$/;" c +PlainTextMarkdownVisitor DiscordChatExporter.Core/Exporting/PlainTextMarkdownVisitor.cs /^internal partial class PlainTextMarkdownVisitor$/;" c +PlainTextMarkdownVisitor DiscordChatExporter.Core/Exporting/PlainTextMarkdownVisitor.cs /^internal partial class PlainTextMarkdownVisitor(ExportContext context, StringBuilder buffer)$/;" m +PlainTextMessageExtensions DiscordChatExporter.Core/Exporting/PlainTextMessageExtensions.cs /^internal static class PlainTextMessageExtensions$/;" c +PlainTextMessageWriter DiscordChatExporter.Core/Exporting/PlainTextMessageWriter.cs /^internal class PlainTextMessageWriter(Stream stream, ExportContext context)$/;" m +Png DiscordChatExporter.Core/Discord/Data/StickerFormat.cs /^ Png = 1,$/;" e enum:StickerFormat file: +PopulateChildren DiscordChatExporter.Core/Utils/Extensions/ExceptionExtensions.cs /^ private static void PopulateChildren(this Exception exception, ICollection childr/;" m class:ExceptionExtensions file: +PrimitiveFilter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser PrimitiveFilter = Parse.OneOf($/;" f class:FilterGrammar file: +ProcessEx DiscordChatExporter.Gui/Utils/ProcessEx.cs /^internal static class ProcessEx$/;" c +Program DiscordChatExporter.Cli/Program.cs /^public static class Program$/;" c +Program DiscordChatExporter.Gui/Program.cs /^public static class Program$/;" c +Progress DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ public ProgressContainer Progress { get; } = new();$/;" p class:DashboardViewModel +ProjectDocumentationUrl DiscordChatExporter.Gui/Program.cs /^ public static string ProjectDocumentationUrl { get; } = ProjectUrl + "\/tree\/master\/.docs"/;" p class:Program +ProjectReleasesUrl DiscordChatExporter.Gui/Program.cs /^ public static string ProjectReleasesUrl { get; } = $"{ProjectUrl}\/releases";$/;" p class:Program +ProjectUrl DiscordChatExporter.Gui/Program.cs /^ public static string ProjectUrl { get; } = "https:\/\/github.com\/Tyrrrz\/DiscordChatExporte/;" p class:Program +PromptDirectoryPathAsync DiscordChatExporter.Gui/Framework/DialogManager.cs /^ public async Task PromptDirectoryPathAsync(string defaultDirPath = "")$/;" m class:DialogManager +PullChannelsAsync DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private async Task PullChannelsAsync()$/;" m class:DashboardViewModel file: +PullGuildsAsync DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private async Task PullGuildsAsync()$/;" m class:DashboardViewModel file: +Pulling .docs/Docker.md /^## Pulling$/;" s chapter:Docker usage instructions +Quote DiscordChatExporter.Core/Markdown/FormattingKind.cs /^ Quote,$/;" e enum:FormattingKind file: +QuotedString DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser QuotedString =$/;" f class:FilterGrammar file: +Reaction DiscordChatExporter.Core/Discord/Data/Reaction.cs /^public record Reaction(Emoji Emoji, int Count)$/;" m +ReactionFilter DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser ReactionFilter = Span.EqualToIgnoreCase($/;" f class:FilterGrammar file: +ReactionMessageFilter DiscordChatExporter.Core/Exporting/Filtering/ReactionMessageFilter.cs /^internal class ReactionMessageFilter(string value) : MessageFilter$/;" m +RecipientAdd DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^ RecipientAdd = 1,$/;" e enum:MessageKind file: +RecipientRemove DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^ RecipientRemove = 2,$/;" e enum:MessageKind file: +RegexMatcher DiscordChatExporter.Core/Markdown/Parsing/RegexMatcher.cs /^internal class RegexMatcher($/;" m +RepeatedSingleLineQuoteNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ > RepeatedSingleLineQuoteNodeMatcher = new RegexMatcher($/;" f class:MarkdownParser file: +ReplaceWhiteSpace DiscordChatExporter.Cli.Tests/Utils/Extensions/StringExtensions.cs /^ public static string ReplaceWhiteSpace(this string str, string replacement = " ")$/;" m class:StringExtensions +Reply DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^ Reply = 19,$/;" e enum:MessageKind file: +ReplyTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake ReplyTestCases { get; } = Snowflake.Parse("866459871934677052");$/;" p class:ChannelIds +ResetAlpha DiscordChatExporter.Core/Utils/Extensions/ColorExtensions.cs /^ public static Color ResetAlpha(this Color color) => color.WithAlpha(255);$/;" m class:ColorExtensions +ResiliencePipeline DiscordChatExporter.Core/Utils/Http.cs /^ public static ResiliencePipeline ResiliencePipeline { get; } =$/;" p class:Http +ResponseResiliencePipeline DiscordChatExporter.Core/Utils/Http.cs /^ public static ResiliencePipeline ResponseResiliencePipeline { get; } =$/;" p class:Http +Reusing assets .docs/Using-the-CLI.md /^#### Reusing assets$/;" t section:Using the CLI""Export a specific channel +Rich DiscordChatExporter.Core/Discord/Data/Embeds/EmbedKind.cs /^ Rich,$/;" e enum:EmbedKind file: +Role DiscordChatExporter.Core/Discord/Data/Role.cs /^public record Role(Snowflake Id, string Name, int Position, Color? Color) : IHasId$/;" m +Role DiscordChatExporter.Core/Markdown/MentionKind.cs /^ Role,$/;" e enum:MentionKind file: +RoleMentionNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher RoleMentionNodeMatcher =$/;" f class:MarkdownParser file: +Scheduling exports on Windows .docs/Scheduling-Windows.md /^# Scheduling exports on Windows$/;" c +Scheduling exports on macOS .docs/Scheduling-MacOS.md /^# Scheduling exports on macOS$/;" c +Scheduling exports with Cron .docs/Scheduling-Linux.md /^# Scheduling exports with Cron$/;" c +Scheduling with Task Scheduler .docs/Scheduling-Windows.md /^## Scheduling with Task Scheduler$/;" s chapter:Scheduling exports on Windows +Screenshots Readme.md /^## Screenshots$/;" s chapter:DiscordChatExporter +Secrets DiscordChatExporter.Cli.Tests/Infra/Secrets.cs /^internal static class Secrets$/;" c +See also Readme.md /^## See also$/;" s chapter:DiscordChatExporter +SelectedChannels DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ public ObservableCollection SelectedChannels { get; } = [];$/;" p class:DashboardViewModel +SelfContainedSpecs DiscordChatExporter.Cli.Tests/Specs/SelfContainedSpecs.cs /^public class SelfContainedSpecs$/;" c +SelfContainedTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake SelfContainedTestCases { get; } = Snowflake.Parse("88744143267837956/;" p class:ChannelIds +SetPath DiscordChatExporter.Core/Utils/UrlBuilder.cs /^ public UrlBuilder SetPath(string path)$/;" m class:UrlBuilder +SetQueryParameter DiscordChatExporter.Core/Utils/UrlBuilder.cs /^ public UrlBuilder SetQueryParameter(string key, string? value, bool ignoreUnsetValue = true)$/;" m class:UrlBuilder +Settings .docs/Using-the-GUI.md /^## Settings$/;" s chapter:Using the GUI +SettingsService DiscordChatExporter.Gui/Services/SettingsService.cs /^public partial class SettingsService$/;" c +SettingsService DiscordChatExporter.Gui/Services/SettingsService.cs /^public partial class SettingsService()$/;" m +SettingsView DiscordChatExporter.Gui/Views/Dialogs/SettingsView.axaml.cs /^ public SettingsView() => InitializeComponent();$/;" m class:SettingsView +SettingsView DiscordChatExporter.Gui/Views/Dialogs/SettingsView.axaml.cs /^public partial class SettingsView : UserControl$/;" c +SettingsViewModel DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public SettingsViewModel(SettingsService settingsService)$/;" m class:SettingsViewModel +SettingsViewModel DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^public class SettingsViewModel : DialogViewModelBase$/;" c +ShouldDownloadAssets DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public bool ShouldDownloadAssets { get; init; }$/;" p class:ExportCommandBase +ShouldDownloadAssets DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public bool ShouldDownloadAssets { get; }$/;" p class:ExportRequest +ShouldFormatMarkdown DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public bool ShouldFormatMarkdown { get; init; } = true;$/;" p class:ExportCommandBase +ShouldFormatMarkdown DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public bool ShouldFormatMarkdown { get; }$/;" p class:ExportRequest +ShouldReuseAssets DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ public bool ShouldReuseAssets { get; init; } = false;$/;" p class:ExportCommandBase +ShouldReuseAssets DiscordChatExporter.Core/Exporting/ExportRequest.cs /^ public bool ShouldReuseAssets { get; }$/;" p class:ExportRequest +ShowDialogAsync DiscordChatExporter.Gui/Framework/DialogManager.cs /^ public async Task ShowDialogAsync(DialogViewModelBase dialog)$/;" m class:DialogManager +ShowHelp DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private void ShowHelp() => ProcessEx.StartShellExecute(Program.ProjectDocumentationUrl);$/;" m class:DashboardViewModel file: +ShowSettingsAsync DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private async Task ShowSettingsAsync() =>$/;" m class:DashboardViewModel file: +ShrugTextNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher ShrugTextNodeMatcher =$/;" f class:MarkdownParser file: +SingleLineQuoteNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher SingleLineQuoteNodeMatcher =$/;" f class:MarkdownParser file: +SnackbarManager DiscordChatExporter.Gui/Framework/SnackbarManager.cs /^public class SnackbarManager$/;" c +Snowflake DiscordChatExporter.Core/Discord/Snowflake.cs /^public partial record struct Snowflake : IComparable, IComparable$/;" s +Snowflake DiscordChatExporter.Core/Discord/Snowflake.cs /^public partial record struct Snowflake$/;" s +Snowflake DiscordChatExporter.Core/Discord/Snowflake.cs /^public readonly partial record struct Snowflake(ulong Value)$/;" m +SnowflakeToTimestampStringConverter DiscordChatExporter.Gui/Converters/SnowflakeToTimestampStringConverter.cs /^public class SnowflakeToTimestampStringConverter : IValueConverter$/;" c +Sound DiscordChatExporter.Core/Exporting/Filtering/MessageContentMatchKind.cs /^ Sound,$/;" e enum:MessageContentMatchKind file: +SourceMessageDeleted DiscordChatExporter.Core/Discord/Data/MessageFlags.cs /^ SourceMessageDeleted = 8,$/;" e enum:MessageFlags file: +Spoiler DiscordChatExporter.Core/Markdown/FormattingKind.cs /^ Spoiler,$/;" e enum:FormattingKind file: +SpoilerFormattingNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher SpoilerFormattingNodeMatcher/;" f class:MarkdownParser file: +SpotifyTrackEmbedProjection DiscordChatExporter.Core/Discord/Data/Embeds/SpotifyTrackEmbedProjection.cs /^public partial record SpotifyTrackEmbedProjection$/;" p +SpotifyTrackEmbedProjection DiscordChatExporter.Core/Discord/Data/Embeds/SpotifyTrackEmbedProjection.cs /^public partial record SpotifyTrackEmbedProjection(string TrackId)$/;" m +StandardEmojiNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher StandardEmojiNodeMatcher =$/;" f class:MarkdownParser file: +StartShellExecute DiscordChatExporter.Gui/Utils/ProcessEx.cs /^ public static void StartShellExecute(string path)$/;" m class:ProcessEx +StartTaskAsync DiscordChatExporter.Cli/Utils/Extensions/ConsoleExtensions.cs /^ public static async ValueTask StartTaskAsync($/;" m class:ConsoleExtensions +Step 1 .docs/Using-the-CLI.md /^## Step 1$/;" s chapter:Using the CLI +Step 1 .docs/Using-the-GUI.md /^### Step 1$/;" S section:Using the GUI""Guide +Step 2 .docs/Using-the-CLI.md /^## Step 2$/;" s chapter:Using the CLI +Step 2 .docs/Using-the-GUI.md /^### Step 2$/;" S section:Using the GUI""Guide +Step 3 .docs/Using-the-CLI.md /^## Step 3$/;" s chapter:Using the CLI +Step 3 .docs/Using-the-GUI.md /^### Step 3$/;" S section:Using the GUI""Guide +Step 4 .docs/Using-the-GUI.md /^### Step 4$/;" S section:Using the GUI""Guide +Sticker DiscordChatExporter.Core/Discord/Data/Sticker.cs /^public partial record Sticker$/;" p +Sticker DiscordChatExporter.Core/Discord/Data/Sticker.cs /^public partial record Sticker(Snowflake Id, string Name, StickerFormat Format, string SourceUrl)$/;" m +StickerFormat DiscordChatExporter.Core/Discord/Data/StickerFormat.cs /^public enum StickerFormat$/;" g +StickerTestCases DiscordChatExporter.Cli.Tests/Infra/ChannelIds.cs /^ public static Snowflake StickerTestCases { get; } = Snowflake.Parse("939668868253769729");$/;" p class:ChannelIds +Strikethrough DiscordChatExporter.Core/Markdown/FormattingKind.cs /^ Strikethrough,$/;" e enum:FormattingKind file: +StrikethroughFormattingNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ > StrikethroughFormattingNodeMatcher = new RegexMatcher($/;" f class:MarkdownParser file: +String DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser String = Parse$/;" f class:FilterGrammar file: +StringExtensions DiscordChatExporter.Cli.Tests/Utils/Extensions/StringExtensions.cs /^internal static class StringExtensions$/;" c +StringExtensions DiscordChatExporter.Core/Utils/Extensions/StringExtensions.cs /^public static class StringExtensions$/;" c +StringMatcher DiscordChatExporter.Core/Markdown/Parsing/StringMatcher.cs /^internal class StringMatcher($/;" m +StringSegment DiscordChatExporter.Core/Markdown/Parsing/StringSegment.cs /^internal readonly record struct StringSegment(string Source, int StartIndex, int Length)$/;" m +SuperpowerExtensions DiscordChatExporter.Core/Utils/Extensions/SuperpowerExtensions.cs /^public static class SuperpowerExtensions$/;" c +SuppressEmbeds DiscordChatExporter.Core/Discord/Data/MessageFlags.cs /^ SuppressEmbeds = 4,$/;" e enum:MessageFlags file: +System DiscordChatExporter.Gui/Framework/ThemeVariant.cs /^ System,$/;" e enum:ThemeVariant file: +TempDir DiscordChatExporter.Cli.Tests/Utils/TempDir.cs /^internal partial class TempDir$/;" c +TempDir DiscordChatExporter.Cli.Tests/Utils/TempDir.cs /^internal partial class TempDir(string path) : IDisposable$/;" m +TempFile DiscordChatExporter.Cli.Tests/Utils/TempFile.cs /^internal partial class TempFile$/;" c +TempFile DiscordChatExporter.Cli.Tests/Utils/TempFile.cs /^internal partial class TempFile(string path) : IDisposable$/;" m +Terms of use[[?]](https://github.com/Tyrrrz/.github/blob/master/docs/why-so-political.md) Readme.md /^## Terms of use[[?]](https:\/\/github.com\/Tyrrrz\/.github\/blob\/master\/docs\/why-so-poli/;" s chapter:DiscordChatExporter +Text DiscordChatExporter.Core/Utils/Extensions/SuperpowerExtensions.cs /^ public static TextParser Text(this TextParser parser) =>$/;" m class:SuperpowerExtensions +Text DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs /^ public string? Text$/;" p class:HyperLink +TextNode DiscordChatExporter.Core/Markdown/TextNode.cs /^internal record TextNode(string Text) : MarkdownNode;$/;" m +TextProperty DiscordChatExporter.Gui/Views/Controls/HyperLink.axaml.cs /^ public static readonly StyledProperty TextProperty =$/;" f class:HyperLink +The exported file is too large, I can't open it .docs/Troubleshooting.md /^### The exported file is too large, I can't open it$/;" S section:Troubleshooting""First steps +Theme DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public ThemeVariant Theme$/;" p class:SettingsViewModel +ThemeVariant DiscordChatExporter.Gui/Framework/ThemeVariant.cs /^public enum ThemeVariant$/;" g +ThreadCreated DiscordChatExporter.Core/Discord/Data/MessageKind.cs /^ ThreadCreated = 18,$/;" e enum:MessageKind file: +ThreadInclusionMode DiscordChatExporter.Cli/Commands/ExportAllCommand.cs /^ public ThreadInclusionMode ThreadInclusionMode { get; init; } = ThreadInclusionMode.None;$/;" p class:ExportAllCommand +ThreadInclusionMode DiscordChatExporter.Cli/Commands/ExportGuildCommand.cs /^ public ThreadInclusionMode ThreadInclusionMode { get; init; } = ThreadInclusionMode.None;$/;" p class:ExportGuildCommand +ThreadInclusionMode DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs /^ public ThreadInclusionMode ThreadInclusionMode { get; init; } = ThreadInclusionMode.None;$/;" p class:GetChannelsCommand +ThreadInclusionMode DiscordChatExporter.Cli/Commands/Shared/ThreadInclusionMode.cs /^public enum ThreadInclusionMode$/;" g +ThreadInclusionMode DiscordChatExporter.Gui/Models/ThreadInclusionMode.cs /^public enum ThreadInclusionMode$/;" g +ThreadInclusionMode DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ public ThreadInclusionMode ThreadInclusionMode$/;" p class:SettingsViewModel +ThreadInclusionModeBindingConverter DiscordChatExporter.Cli/Commands/Converters/ThreadInclusionModeBindingConverter.cs /^internal class ThreadInclusionModeBindingConverter : BindingConverter$/;" c +Through the desktop app / enabling web developer tools .docs/Token-and-IDs.md /^### Through the desktop app \/ enabling web developer tools$/;" S section:Obtaining Token and Channel IDs""How to get a User Token +Through your web browser .docs/Token-and-IDs.md /^### Through your web browser$/;" S section:Obtaining Token and Channel IDs""How to get a User Token +TimeSpanExtensions DiscordChatExporter.Core/Utils/Extensions/TimeSpanExtensions.cs /^public static class TimeSpanExtensions$/;" c +TimestampNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher TimestampNodeMatcher =$/;" f class:MarkdownParser file: +ToHex DiscordChatExporter.Core/Utils/Extensions/BinaryExtensions.cs /^ public static string ToHex(this byte[] data, bool isUpperCase = true)$/;" m class:BinaryExtensions +ToHex DiscordChatExporter.Core/Utils/Extensions/ColorExtensions.cs /^ public static string ToHex(this Color color) => $"#{color.R:X2}{color.G:X2}{color.B:X2}";$/;" m class:ColorExtensions +ToRgb DiscordChatExporter.Core/Utils/Extensions/ColorExtensions.cs /^ public static int ToRgb(this Color color) => color.ToArgb() & 0xffffff;$/;" m class:ColorExtensions +ToSingletonEnumerable DiscordChatExporter.Core/Utils/Extensions/CollectionExtensions.cs /^ public static IEnumerable ToSingletonEnumerable(this T obj)$/;" m class:CollectionExtensions +ToSpaceSeparatedWords DiscordChatExporter.Core/Utils/Extensions/StringExtensions.cs /^ public static string ToSpaceSeparatedWords(this string str)$/;" m class:StringExtensions +Token DiscordChatExporter.Cli/Commands/Base/DiscordCommandBase.cs /^ public required string Token { get; init; }$/;" p class:DiscordCommandBase +Token DiscordChatExporter.Core/Utils/Extensions/SuperpowerExtensions.cs /^ public static TextParser Token(this TextParser parser) =>$/;" m class:SuperpowerExtensions +Token stealer? .docs/Troubleshooting.md /^### Token stealer?$/;" S section:Troubleshooting""General questions +TokenKind DiscordChatExporter.Core/Discord/TokenKind.cs /^public enum TokenKind$/;" g +Troubleshooting .docs/Troubleshooting.md /^# Troubleshooting$/;" c +Truncate DiscordChatExporter.Core/Utils/Extensions/StringExtensions.cs /^ public static string Truncate(this string str, int charCount) =>$/;" m class:StringExtensions +TruthyBooleanBindingConverter DiscordChatExporter.Cli/Commands/Converters/TruthyBooleanBindingConverter.cs /^internal class TruthyBooleanBindingConverter : BindingConverter$/;" c +TryBindView DiscordChatExporter.Gui/Framework/ViewManager.cs /^ public Control? TryBindView(ViewModelBase viewModel)$/;" m class:ViewManager +TryGetCode DiscordChatExporter.Core/Discord/Data/EmojiIndex.cs /^ public static string? TryGetCode(string name) => _toCodes.GetValueOrDefault(name);$/;" m class:EmojiIndex +TryGetMainWindow DiscordChatExporter.Gui/Utils/Extensions/AvaloniaExtensions.cs /^ public static Window? TryGetMainWindow(this IApplicationLifetime lifetime) =>$/;" m class:AvaloniaExtensions +TryGetName DiscordChatExporter.Core/Discord/Data/EmojiIndex.cs /^ public static string? TryGetName(string code) => _fromCodes.GetValueOrDefault(code);$/;" m class:EmojiIndex +TryGetTopLevel DiscordChatExporter.Gui/Utils/Extensions/AvaloniaExtensions.cs /^ public static TopLevel? TryGetTopLevel(this IApplicationLifetime lifetime) =>$/;" m class:AvaloniaExtensions +TryGetValue DiscordChatExporter.Core/Utils/Extensions/HttpExtensions.cs /^ public static string? TryGetValue(this HttpHeaders headers, string name) =>$/;" m class:HttpExtensions +TryMatch DiscordChatExporter.Core/Markdown/Parsing/IMatcher.cs /^ ParsedMatch? TryMatch(TContext context, StringSegment segment);$/;" m interface:IMatcher +TryParse DiscordChatExporter.Core/Discord/Snowflake.cs /^ public static Snowflake? TryParse(string? value, IFormatProvider? formatProvider = null)$/;" m struct:Snowflake +TryParse DiscordChatExporter.Core/Exporting/Partitioning/PartitionLimit.cs /^ public static PartitionLimit? TryParse(string value, IFormatProvider? formatProvider = null)$/;" m class:PartitionLimit +TryParseFileSizeBytes DiscordChatExporter.Core/Exporting/Partitioning/PartitionLimit.cs /^ private static long? TryParseFileSizeBytes(string value, IFormatProvider? formatProvider = n/;" m class:PartitionLimit file: +TryShutdown DiscordChatExporter.Gui/Utils/Extensions/AvaloniaExtensions.cs /^ public static bool TryShutdown(this IApplicationLifetime lifetime, int exitCode = 0)$/;" m class:AvaloniaExtensions +TwitchClipEmbedProjection DiscordChatExporter.Core/Discord/Data/Embeds/TwitchClipEmbedProjection.cs /^public partial record TwitchClipEmbedProjection$/;" p +TwitchClipEmbedProjection DiscordChatExporter.Core/Discord/Data/Embeds/TwitchClipEmbedProjection.cs /^public partial record TwitchClipEmbedProjection(string ClipId)$/;" m +Underline DiscordChatExporter.Core/Markdown/FormattingKind.cs /^ Underline,$/;" e enum:FormattingKind file: +UnderlineFormattingNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher UnderlineFormattingNodeMatch/;" f class:MarkdownParser file: +Unix permissions issues .docs/Docker.md /^## Unix permissions issues$/;" s chapter:Docker usage instructions +UnquotedString DiscordChatExporter.Core/Exporting/Filtering/Parsing/FilterGrammar.cs /^ private static readonly TextParser UnquotedString = Parse$/;" f class:FilterGrammar file: +UpdateService DiscordChatExporter.Gui/Services/UpdateService.cs /^public class UpdateService(SettingsService settingsService) : IDisposable$/;" m +Urgent DiscordChatExporter.Core/Discord/Data/MessageFlags.cs /^ Urgent = 16,$/;" e enum:MessageFlags file: +UrlBuilder DiscordChatExporter.Core/Utils/UrlBuilder.cs /^public class UrlBuilder$/;" c +Usage .docs/Docker.md /^## Usage$/;" s chapter:Docker usage instructions +User DiscordChatExporter.Core/Discord/Data/User.cs /^public partial record User$/;" p +User DiscordChatExporter.Core/Discord/Data/User.cs /^public partial record User($/;" m +User DiscordChatExporter.Core/Discord/TokenKind.cs /^ User,$/;" e enum:TokenKind file: +User DiscordChatExporter.Core/Markdown/MentionKind.cs /^ User,$/;" e enum:MentionKind file: +UserControl DiscordChatExporter.Gui/Framework/UserControl.cs /^public class UserControl : UserControl$/;" c +UserMentionNodeMatcher DiscordChatExporter.Core/Markdown/Parsing/MarkdownParser.cs /^ private static readonly IMatcher UserMentionNodeMatcher =$/;" f class:MarkdownParser file: +Using the CLI .docs/Using-the-CLI.md /^# Using the CLI$/;" c +Using the GUI .docs/Using-the-GUI.md /^# Using the GUI$/;" c +Using the console .docs/Token-and-IDs.md /^##### Using the console$/;" T subsubsection:Obtaining Token and Channel IDs""How to get a User Token""Through your web browser""In Chrome +Using the console .docs/Token-and-IDs.md /^##### Using the console$/;" T subsubsection:Obtaining Token and Channel IDs""How to get a User Token""Through your web browser""In Firefox +Using the network monitor .docs/Token-and-IDs.md /^##### Using the network monitor$/;" T subsubsection:Obtaining Token and Channel IDs""How to get a User Token""Through your web browser""In Chrome +Using the network monitor .docs/Token-and-IDs.md /^##### Using the network monitor$/;" T subsubsection:Obtaining Token and Channel IDs""How to get a User Token""Through your web browser""In Firefox +Using the storage inspector .docs/Token-and-IDs.md /^##### Using the storage inspector$/;" T subsubsection:Obtaining Token and Channel IDs""How to get a User Token""Through your web browser""In Chrome +Using the storage inspector .docs/Token-and-IDs.md /^##### Using the storage inspector$/;" T subsubsection:Obtaining Token and Channel IDs""How to get a User Token""Through your web browser""In Firefox +VerificationPendingGuildLimit DiscordChatExporter.Core/Discord/Data/ApplicationFlags.cs /^ VerificationPendingGuildLimit = 65536,$/;" e enum:ApplicationFlags file: +Version DiscordChatExporter.Gui/Program.cs /^ public static Version Version { get; } = Assembly.GetName().Version ?? new Version(0, 0, 0);$/;" p class:Program +VersionString DiscordChatExporter.Gui/Program.cs /^ public static string VersionString { get; } = Version.ToString(3);$/;" p class:Program +Via settings menu (BetterDiscord only) .docs/Token-and-IDs.md /^#### Via settings menu (BetterDiscord only)$/;" t subsection:Obtaining Token and Channel IDs""How to get a User Token""Through the desktop app / enabling web developer tools +Video DiscordChatExporter.Core/Discord/Data/Embeds/EmbedKind.cs /^ Video,$/;" e enum:EmbedKind file: +Video DiscordChatExporter.Core/Exporting/Filtering/MessageContentMatchKind.cs /^ Video,$/;" e enum:MessageContentMatchKind file: +Video tutorial .docs/Readme.md /^## Video tutorial$/;" s chapter:Home +Video tutorial .docs/Using-the-GUI.md /^## Video tutorial$/;" s chapter:Using the GUI +ViewManager DiscordChatExporter.Gui/Framework/ViewManager.cs /^public partial class ViewManager : IDataTemplate$/;" c +ViewManager DiscordChatExporter.Gui/Framework/ViewManager.cs /^public partial class ViewManager$/;" c +ViewModelBase DiscordChatExporter.Gui/Framework/ViewModelBase.cs /^public abstract class ViewModelBase : ObservableObject, IDisposable$/;" c +ViewModelManager DiscordChatExporter.Gui/Framework/ViewModelManager.cs /^public class ViewModelManager(IServiceProvider services)$/;" m +VisitAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ public async ValueTask VisitAsync($/;" m class:MarkdownVisitor +VisitEmojiAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual ValueTask VisitEmojiAsync($/;" m class:MarkdownVisitor +VisitFormattingAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual async ValueTask VisitFormattingAsync($/;" m class:MarkdownVisitor +VisitHeadingAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual async ValueTask VisitHeadingAsync($/;" m class:MarkdownVisitor +VisitInlineCodeBlockAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual ValueTask VisitInlineCodeBlockAsync($/;" m class:MarkdownVisitor +VisitLinkAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual async ValueTask VisitLinkAsync($/;" m class:MarkdownVisitor +VisitListAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual async ValueTask VisitListAsync($/;" m class:MarkdownVisitor +VisitListItemAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual async ValueTask VisitListItemAsync($/;" m class:MarkdownVisitor +VisitMentionAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual ValueTask VisitMentionAsync($/;" m class:MarkdownVisitor +VisitMultiLineCodeBlockAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual ValueTask VisitMultiLineCodeBlockAsync($/;" m class:MarkdownVisitor +VisitTextAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual ValueTask VisitTextAsync($/;" m class:MarkdownVisitor +VisitTimestampAsync DiscordChatExporter.Core/Markdown/Parsing/MarkdownVisitor.cs /^ protected virtual ValueTask VisitTimestampAsync($/;" m class:MarkdownVisitor +WaitForCloseAsync DiscordChatExporter.Gui/Framework/DialogVIewModelBase.cs /^ public async Task WaitForCloseAsync() => await _closeTcs.Task;$/;" m class:DialogViewModelBase +When I open DCE a black window pops up quickly or nothing shows up .docs/Troubleshooting.md /^### When I open DCE a black window pops up quickly or nothing shows up$/;" S section:Troubleshooting""First steps +Where can I find the 'Channel IDs'? .docs/Troubleshooting.md /^### Where can I find the 'Channel IDs'?$/;" S section:Troubleshooting""CLI +Why should I be worried about the safety of my token? .docs/Troubleshooting.md /^### Why should I be worried about the safety of my token?$/;" S section:Troubleshooting""General questions +Will I get banned if I use this? .docs/Troubleshooting.md /^### Will I get banned if I use this?$/;" S section:Troubleshooting""General questions +Will the messages disappear from the exported file if I delete a message, delete my account or block a person? .docs/Troubleshooting.md /^### Will the messages disappear from the exported file if I delete a message, delete my account /;" S section:Troubleshooting""General questions +Window DiscordChatExporter.Gui/Framework/Window.cs /^public class Window : Window$/;" c +Windows DiscordChatExporter.Gui/Utils/NativeMethods.cs /^ public static class Windows$/;" c class:NativeMethods +WithAlpha DiscordChatExporter.Core/Utils/Extensions/ColorExtensions.cs /^ public static Color WithAlpha(this Color color, int alpha) => Color.FromArgb(alpha, color);$/;" m class:ColorExtensions +WithIndex DiscordChatExporter.Core/Utils/Extensions/CollectionExtensions.cs /^ public static IEnumerable<(T value, int index)> WithIndex(this IEnumerable source)$/;" m class:CollectionExtensions +YouTubeVideoEmbedProjection DiscordChatExporter.Core/Discord/Data/Embeds/YouTubeVideoEmbedProjection.cs /^public partial record YouTubeVideoEmbedProjection$/;" p +YouTubeVideoEmbedProjection DiscordChatExporter.Core/Discord/Data/Embeds/YouTubeVideoEmbedProjection.cs /^public partial record YouTubeVideoEmbedProjection(string VideoId)$/;" m +Zero DiscordChatExporter.Core/Discord/Snowflake.cs /^ public static Snowflake Zero { get; } = new(0);$/;" p struct:Snowflake +_assetsDirPath DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ private readonly string? _assetsDirPath;$/;" f class:ExportCommandBase file: +_availableChannels DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private IReadOnlyList? _availableChannels;$/;" f class:DashboardViewModel file: +_availableGuilds DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private IReadOnlyList? _availableGuilds;$/;" f class:DashboardViewModel file: +_cancelButtonText DiscordChatExporter.Gui/ViewModels/Dialogs/MessageBoxViewModel.cs /^ private string? _cancelButtonText = "Cancel";$/;" f class:MessageBoxViewModel file: +_channelExporter DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ private ChannelExporter? _channelExporter;$/;" f class:ExportCommandBase file: +_closeTcs DiscordChatExporter.Gui/Framework/DialogVIewModelBase.cs /^ private readonly TaskCompletionSource _closeTcs = new($/;" f class:DialogViewModelBase file: +_defaultButtonText DiscordChatExporter.Gui/ViewModels/Dialogs/MessageBoxViewModel.cs /^ private string? _defaultButtonText = "OK";$/;" f class:MessageBoxViewModel file: +_defaultDuration DiscordChatExporter.Gui/Framework/SnackbarManager.cs /^ private readonly TimeSpan _defaultDuration = TimeSpan.FromSeconds(5);$/;" f class:SnackbarManager file: +_dialogLock DiscordChatExporter.Gui/Framework/DialogManager.cs /^ private readonly AsyncNonKeyedLocker _dialogLock = new();$/;" f class:DialogManager file: +_dialogManager DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private readonly DialogManager _dialogManager;$/;" f class:DashboardViewModel file: +_dialogResult DiscordChatExporter.Gui/Framework/DialogVIewModelBase.cs /^ private T? _dialogResult;$/;" f class:DialogViewModelBase file: +_discord DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private DiscordClient? _discord;$/;" f class:DashboardViewModel file: +_discordClient DiscordChatExporter.Cli/Commands/Base/DiscordCommandBase.cs /^ private DiscordClient? _discordClient;$/;" f class:DiscordCommandBase file: +_eventRoot DiscordChatExporter.Gui/App.axaml.cs /^ private readonly DisposableCollector _eventRoot = new();$/;" f class:App file: +_eventRoot DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private readonly DisposableCollector _eventRoot = new();$/;" f class:DashboardViewModel file: +_eventRoot DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ private readonly DisposableCollector _eventRoot = new();$/;" f class:SettingsViewModel file: +_fromCodes DiscordChatExporter.Core/Discord/Data/EmojiIndex.cs /^ private static Dictionary _fromCodes = new(5000, StringComparer.Ordinal)$/;" f class:EmojiIndex file: +_isBusy DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private bool _isBusy;$/;" f class:DashboardViewModel file: +_items DiscordChatExporter.Gui/Utils/DisposableCollector.cs /^ private readonly List _items = [];$/;" f class:DisposableCollector file: +_lock DiscordChatExporter.Gui/Utils/DisposableCollector.cs /^ private readonly object _lock = new();$/;" f class:DisposableCollector file: +_mainViewModel DiscordChatExporter.Gui/App.axaml.cs /^ private readonly MainViewModel _mainViewModel;$/;" f class:App file: +_message DiscordChatExporter.Gui/ViewModels/Dialogs/MessageBoxViewModel.cs /^ private string? _message = "Message";$/;" f class:MessageBoxViewModel file: +_outputPath DiscordChatExporter.Cli/Commands/Base/ExportCommandBase.cs /^ private readonly string _outputPath = Directory.GetCurrentDirectory();$/;" f class:ExportCommandBase file: +_path DiscordChatExporter.Core/Utils/UrlBuilder.cs /^ private string _path = "";$/;" f class:UrlBuilder file: +_progressMuxer DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private readonly AutoResetProgressMuxer _progressMuxer;$/;" f class:DashboardViewModel file: +_queryParameters DiscordChatExporter.Core/Utils/UrlBuilder.cs /^ private readonly Dictionary _queryParameters = new($/;" f class:UrlBuilder file: +_selectedGuild DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private Guild? _selectedGuild;$/;" f class:DashboardViewModel file: +_services DiscordChatExporter.Gui/App.axaml.cs /^ private readonly ServiceProvider _services;$/;" f class:App file: +_settingsService DiscordChatExporter.Gui/App.axaml.cs /^ private readonly SettingsService _settingsService;$/;" f class:App file: +_settingsService DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private readonly SettingsService _settingsService;$/;" f class:DashboardViewModel file: +_settingsService DiscordChatExporter.Gui/ViewModels/Dialogs/SettingsViewModel.cs /^ private readonly SettingsService _settingsService;$/;" f class:SettingsViewModel file: +_snackbarManager DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private readonly SnackbarManager _snackbarManager;$/;" f class:DashboardViewModel file: +_title DiscordChatExporter.Gui/ViewModels/Dialogs/MessageBoxViewModel.cs /^ private string? _title = "Title";$/;" f class:MessageBoxViewModel file: +_toCodes DiscordChatExporter.Core/Discord/Data/EmojiIndex.cs /^ private static Dictionary _toCodes = new(5000, StringComparer.Ordinal)$/;" f class:EmojiIndex file: +_token DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private string? _token;$/;" f class:DashboardViewModel file: +_viewModelManager DiscordChatExporter.Gui/ViewModels/Components/DashboardViewModel.cs /^ private readonly ViewModelManager _viewModelManager;$/;" f class:DashboardViewModel file: +channelId DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ Snowflake channelId$/;" f class:ExportWrapper +channelId DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ public static async ValueTask ExportAsHtmlAsync(Snowflake channelId) =>$/;" f class:ExportWrapper +channelId DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ public static async ValueTask ExportAsJsonAsync(Snowflake channelId) =>$/;" f class:ExportWrapper +channelId DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ public static async ValueTask ExportAsCsvAsync(Snowflake channelId) =>$/;" f class:ExportWrapper +channelId DiscordChatExporter.Cli.Tests/Infra/ExportWrapper.cs /^ public static async ValueTask ExportAsPlainTextAsync(Snowflake channelId) =>$/;" f class:ExportWrapper +exception DiscordChatExporter.Core/Utils/Http.cs /^ private static bool IsRetryableException(Exception exception) =>$/;" f class:Http file: +instant DiscordChatExporter.Core/Discord/Snowflake.cs /^ public static Snowflake FromDate(DateTimeOffset instant) =>$/;" f struct:Snowflake +message DiscordChatExporter.Core/Exporting/Filtering/NullMessageFilter.cs /^ public override bool IsMatch(Message message) => true;$/;" f class:NullMessageFilter +methodDisplay DiscordChatExporter.Cli.Tests/xunit.runner.json /^ "methodDisplay": "method"$/;" s +methodDisplayOptions DiscordChatExporter.Cli.Tests/xunit.runner.json /^ "methodDisplayOptions": "all",$/;" s +operator > DiscordChatExporter.Core/Discord/Snowflake.cs /^ public static bool operator >(Snowflake left, Snowflake right) => left.CompareTo(right) > 0;$/;" m struct:Snowflake +other DiscordChatExporter.Core/Discord/Snowflake.cs /^ public int CompareTo(Snowflake other) => Value.CompareTo(other.Value);$/;" f struct:Snowflake +statusCode DiscordChatExporter.Core/Utils/Http.cs /^ private static bool IsRetryableStatusCode(HttpStatusCode statusCode) =>$/;" f class:Http file: +viewModel DiscordChatExporter.Gui/Framework/ViewManager.cs /^ private Control? TryCreateView(ViewModelBase viewModel) =>$/;" f class:ViewManager file: +~ViewModelBase DiscordChatExporter.Gui/Framework/ViewModelBase.cs /^ ~ViewModelBase() => Dispose(false);$/;" m class:ViewModelBase file: