58 lines
1.7 KiB
C#
58 lines
1.7 KiB
C#
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>(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<Snowflake> 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();
|
|
}
|
|
}
|
|
}
|