using Remora.Discord.API.Abstractions.Gateway.Events; using Remora.Rest.Core; using Serilog.Context; namespace Catalogger.Backend.Extensions; public static class LogUtils { public static IDisposable Enrich(T evt) where T : IGatewayEvent { var type = ("Event", typeof(T).Name); return evt switch { IMessageDelete md => PushProperties( type, ("GuildId", md.GuildID), ("ChannelId", md.ChannelID), ("MessageId", md.ID) ), IMessageUpdate mc => PushProperties( type, ("GuildId", mc.GuildID), ("ChannelId", mc.ChannelID), ("MessageId", mc.ID) ), IMessageDeleteBulk mdb => PushProperties( type, ("GuildId", mdb.GuildID), ("ChannelId", mdb.ChannelID), ("MessageIds", mdb.IDs) ), _ => PushProperties(type), }; } public static IDisposable PushProperties(params (string, object?)[] properties) => new MultiDisposable( properties .Select(p => { if (p.Item2 is Optional s) return LogContext.PushProperty(p.Item1, s.IsDefined() ? s.Value : null); return LogContext.PushProperty(p.Item1, p.Item2); }) .ToArray() ); private record MultiDisposable(IDisposable[] Entries) : IDisposable { public void Dispose() { foreach (var e in Entries) e.Dispose(); } } }