feat: slightly more debug logs, enrich message events with extra data
This commit is contained in:
parent
c06376dfda
commit
27e77eeaed
5 changed files with 79 additions and 5 deletions
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
58
Catalogger.Backend/Extensions/LogUtils.cs
Normal file
58
Catalogger.Backend/Extensions/LogUtils.cs
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue