Tweaks to admin CSV exporting (#38531)

This commit is contained in:
Kowlin
2025-06-30 23:09:16 +02:00
committed by GitHub
parent 34825464dc
commit 32f5551e2a

View File

@@ -20,6 +20,10 @@ public sealed class AdminLogsEui : BaseEui
[Dependency] private readonly IFileDialogManager _dialogManager = default!; [Dependency] private readonly IFileDialogManager _dialogManager = default!;
[Dependency] private readonly ILogManager _log = default!; [Dependency] private readonly ILogManager _log = default!;
private const char CsvSeparator = ',';
private const string CsvQuote = "\"";
private const string CsvHeader = "Date,ID,PlayerID,Severity,Type,Message";
private ISawmill _sawmill; private ISawmill _sawmill;
private bool _currentlyExportingLogs = false; private bool _currentlyExportingLogs = false;
@@ -100,7 +104,9 @@ public sealed class AdminLogsEui : BaseEui
try try
{ {
await using var writer = new StreamWriter(file.Value.fileStream); // Buffer is set to 4KB for performance reasons. As the average export of 1000 logs is ~200KB
await using var writer = new StreamWriter(file.Value.fileStream, bufferSize: 4096);
await writer.WriteLineAsync(CsvHeader);
foreach (var child in LogsControl.LogsContainer.Children) foreach (var child in LogsControl.LogsContainer.Children)
{ {
if (child is not AdminLogLabel logLabel || !child.Visible) if (child is not AdminLogLabel logLabel || !child.Visible)
@@ -108,28 +114,31 @@ public sealed class AdminLogsEui : BaseEui
var log = logLabel.Log; var log = logLabel.Log;
// Date
// I swear to god if someone adds ,s or "s to the other fields... // I swear to god if someone adds ,s or "s to the other fields...
await writer.WriteAsync(log.Date.ToString("s", System.Globalization.CultureInfo.InvariantCulture)); await writer.WriteAsync(log.Date.ToString("s", System.Globalization.CultureInfo.InvariantCulture));
await writer.WriteAsync(','); await writer.WriteAsync(CsvSeparator);
// ID
await writer.WriteAsync(log.Id.ToString()); await writer.WriteAsync(log.Id.ToString());
await writer.WriteAsync(','); await writer.WriteAsync(CsvSeparator);
await writer.WriteAsync(log.Impact.ToString()); // PlayerID
await writer.WriteAsync(',');
// Message
await writer.WriteAsync('"');
await writer.WriteAsync(log.Message.Replace("\"", "\"\""));
await writer.WriteAsync('"');
// End of message
await writer.WriteAsync(',');
var players = log.Players; var players = log.Players;
for (var i = 0; i < players.Length; i++) for (var i = 0; i < players.Length; i++)
{ {
await writer.WriteAsync(players[i] + (i == players.Length - 1 ? "" : " ")); await writer.WriteAsync(players[i] + (i == players.Length - 1 ? "" : " "));
} }
await writer.WriteAsync(CsvSeparator);
await writer.WriteAsync(','); // Severity
await writer.WriteAsync(log.Impact.ToString());
await writer.WriteAsync(CsvSeparator);
// Type
await writer.WriteAsync(log.Type.ToString()); await writer.WriteAsync(log.Type.ToString());
await writer.WriteAsync(CsvSeparator);
// Message
await writer.WriteAsync(CsvQuote);
await writer.WriteAsync(log.Message.Replace(CsvQuote, CsvQuote + CsvQuote));
await writer.WriteAsync(CsvQuote);
await writer.WriteLineAsync(); await writer.WriteLineAsync();
} }
} }