feat: slightly more debug logs, enrich message events with extra data

This commit is contained in:
sam 2024-11-26 21:25:10 +01:00
parent c06376dfda
commit 27e77eeaed
Signed by: sam
GPG key ID: 5F3C3C1B3166639D
5 changed files with 79 additions and 5 deletions

View file

@ -38,6 +38,8 @@ public class MessageCreateResponder(
public async Task<Result> RespondAsync(IMessageCreate msg, CancellationToken ct = default) public async Task<Result> RespondAsync(IMessageCreate msg, CancellationToken ct = default)
{ {
using var __ = LogUtils.Enrich(msg);
userCache.UpdateUser(msg.Author); userCache.UpdateUser(msg.Author);
CataloggerMetrics.MessagesReceived.Inc(); CataloggerMetrics.MessagesReceived.Inc();

View file

@ -41,6 +41,8 @@ public class MessageDeleteBulkResponder(
public async Task<Result> RespondAsync(IMessageDeleteBulk evt, CancellationToken ct = default) public async Task<Result> RespondAsync(IMessageDeleteBulk evt, CancellationToken ct = default)
{ {
using var _ = LogUtils.Enrich(evt);
var guild = await guildRepository.GetAsync(evt.GuildID); var guild = await guildRepository.GetAsync(evt.GuildID);
if (guild.IsMessageIgnored(evt.ChannelID, null, null)) if (guild.IsMessageIgnored(evt.ChannelID, null, null))
return Result.Success; return Result.Success;

View file

@ -27,6 +27,7 @@ using Remora.Discord.Extensions.Embeds;
using Remora.Discord.Gateway.Responders; using Remora.Discord.Gateway.Responders;
using Remora.Rest.Core; using Remora.Rest.Core;
using Remora.Results; using Remora.Results;
using Serilog.Context;
namespace Catalogger.Backend.Bot.Responders.Messages; namespace Catalogger.Backend.Bot.Responders.Messages;
@ -48,6 +49,8 @@ public class MessageDeleteResponder(
public async Task<Result> RespondAsync(IMessageDelete evt, CancellationToken ct = default) public async Task<Result> RespondAsync(IMessageDelete evt, CancellationToken ct = default)
{ {
using var _ = LogUtils.Enrich(evt);
if (!evt.GuildID.IsDefined()) if (!evt.GuildID.IsDefined())
return Result.Success; return Result.Success;
@ -64,13 +67,15 @@ public class MessageDeleteResponder(
return Result.Success; return Result.Success;
var guild = await guildRepository.GetAsync(evt.GuildID); var guild = await guildRepository.GetAsync(evt.GuildID);
if (guild.IsMessageIgnored(evt.ChannelID, null, null))
return Result.Success;
var msg = await messageRepository.GetMessageAsync(evt.ID.Value, ct); var msg = await messageRepository.GetMessageAsync(evt.ID.Value, ct);
// Sometimes a message that *should* be logged isn't stored in the database, notify the user of that // Sometimes a message that *should* be logged isn't stored in the database, notify the user of that
if (msg == null) if (msg == null)
{ {
_logger.Debug(
"Deleted message {MessageId} should be logged but is not in the database",
evt.ID
);
webhookExecutor.QueueLog( webhookExecutor.QueueLog(
webhookExecutor.GetLogChannel(guild, LogChannelType.MessageDelete, evt.ChannelID), webhookExecutor.GetLogChannel(guild, LogChannelType.MessageDelete, evt.ChannelID),
new Embed( new Embed(
@ -106,8 +111,13 @@ public class MessageDeleteResponder(
evt.ChannelID, evt.ChannelID,
msg.UserId msg.UserId
); );
if (logChannel == null) if (logChannel is null or 0)
return Result.Success; {
_logger.Debug(
"Message {MessageId} should not be logged; either ignored or message delete logs are disabled",
evt.ID
);
}
var user = await userCache.GetUserAsync(DiscordSnowflake.New(msg.UserId)); var user = await userCache.GetUserAsync(DiscordSnowflake.New(msg.UserId));
var builder = new EmbedBuilder() var builder = new EmbedBuilder()

View file

@ -42,6 +42,8 @@ public class MessageUpdateResponder(
public async Task<Result> RespondAsync(IMessageUpdate evt, CancellationToken ct = default) public async Task<Result> RespondAsync(IMessageUpdate evt, CancellationToken ct = default)
{ {
using var _ = LogUtils.Enrich(evt);
// Discord only *very* recently changed message update events to have all fields, // Discord only *very* recently changed message update events to have all fields,
// so we convert the event to a MessageCreate to avoid having to unwrap every single field // so we convert the event to a MessageCreate to avoid having to unwrap every single field
var msg = ConvertToMessageCreate(evt); var msg = ConvertToMessageCreate(evt);

View file

@ -0,0 +1,58 @@
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();
}
}
}