Add message export for GDPR Art. 15 right of access
The privacy story is incomplete without a way to actually hand the data over. New Export section in the Privacy tab streams matching messages to a Markdown, JSON or CSV file using Dalamud's file dialog and a background thread, so the settings UI stays responsive even when the export crawls a 150k-message archive. MessageStore.StreamForExport returns a MessageEnumerator over non-deleted rows filtered by ChatType list and date range, sorted ascending. MessageExporter.ExportToFile takes that enumerator, optionally narrows by SenderSource.TextValue substring (case- insensitive), and writes one of three formats: Markdown — human-readable, day headers, [HH:mm] ChatType Sender: prefix per line, trailing total. JSON — single object with metadata (filter snapshot, exported_at, plugin name) and a messages array carrying id, ISO-8601 date, numeric and named ChatType, source/target kinds, receiver, content_id, sender plaintext, content plaintext. CSV — header line plus quoted-when-needed rows for spreadsheet ingestion. Sender plaintext, channel filter, date range and format are exposed as form fields above the Export button. Empty channel selection means "all stored channels", a 0-day range means "no time limit". Result count and target path are reported via WrapperUtil notifications.
This commit is contained in:
+17
@@ -113,4 +113,21 @@ internal class HellionStrings
|
||||
internal static string Wizard_Profile_FullHistory_GdprWarning => Get(nameof(Wizard_Profile_FullHistory_GdprWarning));
|
||||
internal static string Wizard_Profile_FullHistory_Apply => Get(nameof(Wizard_Profile_FullHistory_Apply));
|
||||
internal static string Wizard_Reopen_Button => Get(nameof(Wizard_Reopen_Button));
|
||||
|
||||
internal static string Export_Heading => Get(nameof(Export_Heading));
|
||||
internal static string Export_Help => Get(nameof(Export_Help));
|
||||
internal static string Export_Range_Label => Get(nameof(Export_Range_Label));
|
||||
internal static string Export_Sender_Label => Get(nameof(Export_Sender_Label));
|
||||
internal static string Export_Channels_Heading => Get(nameof(Export_Channels_Heading));
|
||||
internal static string Export_Channels_AllOff => Get(nameof(Export_Channels_AllOff));
|
||||
internal static string Export_Format_Label => Get(nameof(Export_Format_Label));
|
||||
internal static string Export_Format_Markdown => Get(nameof(Export_Format_Markdown));
|
||||
internal static string Export_Format_Json => Get(nameof(Export_Format_Json));
|
||||
internal static string Export_Format_Csv => Get(nameof(Export_Format_Csv));
|
||||
internal static string Export_Button => Get(nameof(Export_Button));
|
||||
internal static string Export_Dialog_Title => Get(nameof(Export_Dialog_Title));
|
||||
internal static string Export_Running => Get(nameof(Export_Running));
|
||||
internal static string Export_Success => Get(nameof(Export_Success));
|
||||
internal static string Export_Empty => Get(nameof(Export_Empty));
|
||||
internal static string Export_Error => Get(nameof(Export_Error));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user