Rejig LogStringHandler (#30706)
* Rejig LogStringHandler * Fix session logs * Fix properly * comments * IAsType support * Fix mind logs * Fix mind logging AGAIN --------- Co-authored-by: PJB3005 <pieterjan.briers+git@gmail.com>
This commit is contained in:
@@ -25,7 +25,6 @@ namespace Content.Server.Administration.Logs;
|
||||
public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogManager
|
||||
{
|
||||
[Dependency] private readonly IConfigurationManager _configuration = default!;
|
||||
[Dependency] private readonly IEntityManager _entityManager = default!;
|
||||
[Dependency] private readonly ILogManager _logManager = default!;
|
||||
[Dependency] private readonly IServerDbManager _db = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
@@ -72,7 +71,6 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa
|
||||
|
||||
// CVars
|
||||
private bool _metricsEnabled;
|
||||
private bool _enabled;
|
||||
private TimeSpan _queueSendDelay;
|
||||
private int _queueMax;
|
||||
private int _preRoundQueueMax;
|
||||
@@ -103,7 +101,7 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa
|
||||
_configuration.OnValueChanged(CVars.MetricsEnabled,
|
||||
value => _metricsEnabled = value, true);
|
||||
_configuration.OnValueChanged(CCVars.AdminLogsEnabled,
|
||||
value => _enabled = value, true);
|
||||
value => Enabled = value, true);
|
||||
_configuration.OnValueChanged(CCVars.AdminLogsQueueSendDelay,
|
||||
value => _queueSendDelay = TimeSpan.FromSeconds(value), true);
|
||||
_configuration.OnValueChanged(CCVars.AdminLogsQueueMax,
|
||||
@@ -123,6 +121,12 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa
|
||||
}
|
||||
}
|
||||
|
||||
public override string ConvertName(string name)
|
||||
{
|
||||
// JsonNamingPolicy is not whitelisted by the sandbox.
|
||||
return NamingPolicy.ConvertName(name);
|
||||
}
|
||||
|
||||
public async Task Shutdown()
|
||||
{
|
||||
if (!_logQueue.IsEmpty)
|
||||
@@ -292,8 +296,17 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa
|
||||
}
|
||||
}
|
||||
|
||||
private void Add(LogType type, LogImpact impact, string message, JsonDocument json, HashSet<Guid> players)
|
||||
public override void Add(LogType type, [System.Runtime.CompilerServices.InterpolatedStringHandlerArgument("")] ref LogStringHandler handler)
|
||||
{
|
||||
Add(type, LogImpact.Medium, ref handler);
|
||||
}
|
||||
|
||||
public override void Add(LogType type, LogImpact impact, [System.Runtime.CompilerServices.InterpolatedStringHandlerArgument("")] ref LogStringHandler handler)
|
||||
{
|
||||
var message = handler.ToStringAndClear();
|
||||
if (!Enabled)
|
||||
return;
|
||||
|
||||
var preRound = _runLevel == GameRunLevel.PreRoundLobby;
|
||||
var count = preRound ? _preRoundLogQueue.Count : _logQueue.Count;
|
||||
if (count >= _dropThreshold)
|
||||
@@ -302,6 +315,10 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa
|
||||
return;
|
||||
}
|
||||
|
||||
var json = JsonSerializer.SerializeToDocument(handler.Values, _jsonOptions);
|
||||
var id = NextLogId;
|
||||
var players = GetPlayers(handler.Values, id);
|
||||
|
||||
// PostgreSQL does not support storing null chars in text values.
|
||||
if (message.Contains('\0'))
|
||||
{
|
||||
@@ -311,31 +328,85 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa
|
||||
|
||||
var log = new AdminLog
|
||||
{
|
||||
Id = NextLogId,
|
||||
Id = id,
|
||||
RoundId = _currentRoundId,
|
||||
Type = type,
|
||||
Impact = impact,
|
||||
Date = DateTime.UtcNow,
|
||||
Message = message,
|
||||
Json = json,
|
||||
Players = new List<AdminLogPlayer>(players.Count)
|
||||
Players = players,
|
||||
};
|
||||
|
||||
var adminLog = false;
|
||||
var adminSys = _entityManager.SystemOrNull<AdminSystem>();
|
||||
DoAdminAlerts(players, message, impact);
|
||||
|
||||
if (preRound)
|
||||
{
|
||||
_preRoundLogQueue.Enqueue(log);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logQueue.Enqueue(log);
|
||||
CacheLog(log);
|
||||
}
|
||||
}
|
||||
|
||||
private List<AdminLogPlayer> GetPlayers(Dictionary<string, object?> values, int logId)
|
||||
{
|
||||
List<AdminLogPlayer> players = new();
|
||||
foreach (var value in values.Values)
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
case SerializablePlayer player:
|
||||
AddPlayer(players, player.UserId, logId);
|
||||
continue;
|
||||
|
||||
case EntityStringRepresentation rep:
|
||||
if (rep.Session is {} session)
|
||||
AddPlayer(players, session.UserId.UserId, logId);
|
||||
continue;
|
||||
|
||||
case IAdminLogsPlayerValue playerValue:
|
||||
foreach (var player in playerValue.Players)
|
||||
{
|
||||
AddPlayer(players, player, logId);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return players;
|
||||
}
|
||||
|
||||
private void AddPlayer(List<AdminLogPlayer> players, Guid user, int logId)
|
||||
{
|
||||
// The majority of logs have a single player, or maybe two. Instead of allocating a List<AdminLogPlayer> and
|
||||
// HashSet<Guid>, we just iterate over the list to check for duplicates.
|
||||
foreach (var player in players)
|
||||
{
|
||||
if (player.PlayerUserId == user)
|
||||
return;
|
||||
}
|
||||
|
||||
players.Add(new AdminLogPlayer
|
||||
{
|
||||
LogId = logId,
|
||||
PlayerUserId = user
|
||||
});
|
||||
}
|
||||
|
||||
private void DoAdminAlerts(List<AdminLogPlayer> players, string message, LogImpact impact)
|
||||
{
|
||||
var adminLog = true;
|
||||
var logMessage = message;
|
||||
|
||||
foreach (var id in players)
|
||||
foreach (var player in players)
|
||||
{
|
||||
var player = new AdminLogPlayer
|
||||
{
|
||||
LogId = log.Id,
|
||||
PlayerUserId = id
|
||||
};
|
||||
var id = player.PlayerUserId;
|
||||
|
||||
log.Players.Add(player);
|
||||
|
||||
if (adminSys != null)
|
||||
if (EntityManager.TrySystem(out AdminSystem? adminSys))
|
||||
{
|
||||
var cachedInfo = adminSys.GetCachedPlayerInfo(new NetUserId(id));
|
||||
if (cachedInfo != null && cachedInfo.Antag)
|
||||
@@ -372,35 +443,6 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa
|
||||
|
||||
if (adminLog)
|
||||
_chat.SendAdminAlert(logMessage);
|
||||
|
||||
if (preRound)
|
||||
{
|
||||
_preRoundLogQueue.Enqueue(log);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logQueue.Enqueue(log);
|
||||
CacheLog(log);
|
||||
}
|
||||
}
|
||||
|
||||
public override void Add(LogType type, LogImpact impact, ref LogStringHandler handler)
|
||||
{
|
||||
if (!_enabled)
|
||||
{
|
||||
handler.ToStringAndClear();
|
||||
return;
|
||||
}
|
||||
|
||||
var (json, players) = ToJson(handler.Values);
|
||||
var message = handler.ToStringAndClear();
|
||||
|
||||
Add(type, impact, message, json, players);
|
||||
}
|
||||
|
||||
public override void Add(LogType type, ref LogStringHandler handler)
|
||||
{
|
||||
Add(type, LogImpact.Medium, ref handler);
|
||||
}
|
||||
|
||||
public async Task<List<SharedAdminLog>> All(LogFilter? filter = null, Func<List<SharedAdminLog>>? listProvider = null)
|
||||
|
||||
Reference in New Issue
Block a user