Tweaks to admin CSV exporting (#38531)
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user