feat: more log context

This commit is contained in:
sam 2024-11-27 15:48:30 +01:00
parent 4047df8610
commit 7749c9d9e2
Signed by: sam
GPG key ID: 5F3C3C1B3166639D
21 changed files with 159 additions and 15 deletions

View file

@ -17,7 +17,6 @@ using Catalogger.Backend.Cache.InMemoryCache;
using Catalogger.Backend.Database.Repositories;
using Catalogger.Backend.Extensions;
using Catalogger.Backend.Services;
using Microsoft.Extensions.Logging.Configuration;
using Remora.Discord.API.Abstractions.Gateway.Events;
using Remora.Discord.API.Abstractions.Objects;
using Remora.Discord.Extensions.Embeds;
@ -36,6 +35,8 @@ public class ChannelCreateResponder(
{
public async Task<Result> RespondAsync(IChannelCreate ch, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(ch);
if (!ch.GuildID.IsDefined())
return Result.Success;
channelCache.Set(ch);

View file

@ -35,6 +35,8 @@ public class ChannelDeleteResponder(
public async Task<Result> RespondAsync(IChannelDelete evt, CancellationToken ct = default)
{
using var __ = LogUtils.Enrich(evt);
if (!evt.GuildID.IsDefined())
{
_logger.Debug("Deleted channel {ChannelId} is not in a guild", evt.ID);

View file

@ -40,6 +40,8 @@ public class ChannelUpdateResponder(
public async Task<Result> RespondAsync(IChannelUpdate evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
try
{
if (!channelCache.TryGet(evt.ID, out var oldChannel))

View file

@ -13,6 +13,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
using Catalogger.Backend.Extensions;
using Microsoft.Extensions.Options;
using Remora.Commands.Services;
using Remora.Commands.Tokenization;
@ -23,6 +24,7 @@ using Remora.Discord.Commands.Responders;
using Remora.Discord.Commands.Services;
using Remora.Discord.Gateway.Responders;
using Remora.Results;
using Serilog.Context;
namespace Catalogger.Backend.Bot.Responders;
@ -57,21 +59,34 @@ public class CustomInteractionResponder(
treeNameResolver
);
public async Task<Result> RespondAsync(
IInteractionCreate gatewayEvent,
CancellationToken ct = default
)
public async Task<Result> RespondAsync(IInteractionCreate evt, CancellationToken ct = default)
{
if (config.Discord.TestMode)
{
_logger.Information(
"Not responding to interaction create event {InteractionId} in {ChannelId} as test mode is enabled",
gatewayEvent.ID,
gatewayEvent.Channel.Map(c => c.ID).OrDefault()
evt.ID,
evt.Channel.Map(c => c.ID).OrDefault()
);
return Result.Success;
}
return await _inner.RespondAsync(gatewayEvent, ct);
using var _ = LogUtils.PushProperties(
("Event", nameof(IInteractionCreate)),
("InteractionId", evt.ID),
("GuildId", evt.GuildID),
("UserId", evt.User.Map(u => u.ID)),
("MemberId", evt.Member.Map(m => m.User.Map(u => u.ID).OrDefault())),
("ChannelId", evt.Channel.Map(c => c.ID)),
("InteractionType", evt.Type)
);
using var __ = LogContext.PushProperty(
"InteractionData",
evt.Data.HasValue ? (object?)evt.Data.Value : null,
true
);
return await _inner.RespondAsync(evt, ct);
}
}

View file

@ -14,6 +14,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
using Catalogger.Backend.Cache.InMemoryCache;
using Catalogger.Backend.Extensions;
using Remora.Discord.API.Abstractions.Gateway.Events;
using Remora.Discord.API.Abstractions.Objects;
using Remora.Discord.Gateway.Responders;
@ -28,6 +29,8 @@ public class AuditLogResponder(AuditLogCache auditLogCache, ILogger logger)
public Task<Result> RespondAsync(IGuildAuditLogEntryCreate evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
if (evt.TargetID == null || evt.UserID == null)
return Task.FromResult(Result.Success);

View file

@ -37,6 +37,7 @@ public class GuildBanAddResponder(
public async Task<Result> RespondAsync(IGuildBanAdd evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
var guildConfig = await guildRepository.GetAsync(evt.GuildID);
// Delay 2 seconds for the audit log

View file

@ -37,6 +37,7 @@ public class GuildBanRemoveResponder(
public async Task<Result> RespondAsync(IGuildBanRemove evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
var guildConfig = await guildRepository.GetAsync(evt.GuildID);
// Delay 2 seconds for the audit log

View file

@ -44,6 +44,8 @@ public class GuildCreateResponder(
public async Task<Result> RespondAsync(IGuildCreate evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
ulong guildId;
string? guildName = null;
if (evt.Guild.TryPickT0(out var guild, out var unavailableGuild))
@ -101,6 +103,8 @@ public class GuildCreateResponder(
public async Task<Result> RespondAsync(IGuildDelete evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
if (evt.IsUnavailable.OrDefault(false))
{
_logger.Debug("Guild {GuildId} became unavailable", evt.ID);

View file

@ -37,6 +37,8 @@ public class GuildEmojisUpdateResponder(
public async Task<Result> RespondAsync(IGuildEmojisUpdate evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
try
{
if (!emojiCache.TryGet(evt.GuildID, out var oldEmoji))

View file

@ -14,6 +14,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
using Catalogger.Backend.Cache;
using Catalogger.Backend.Extensions;
using Remora.Discord.API.Abstractions.Gateway.Events;
using Remora.Discord.Gateway.Responders;
using Remora.Results;
@ -27,6 +28,8 @@ public class GuildMembersChunkResponder(ILogger logger, IMemberCache memberCache
public async Task<Result> RespondAsync(IGuildMembersChunk evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
_logger.Debug(
"Received chunk {ChunkIndex} / {ChunkCount} for guild {GuildId}",
evt.ChunkIndex + 1,

View file

@ -37,6 +37,8 @@ public class GuildUpdateResponder(
public async Task<Result> RespondAsync(IGuildUpdate evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
try
{
if (!guildCache.TryGet(evt.ID, out var oldGuild))

View file

@ -37,6 +37,7 @@ public class InviteCreateResponder(
public async Task<Result> RespondAsync(IInviteCreate evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
var guildId = evt.GuildID.Value;
var invitesResult = await guildApi.GetGuildInvitesAsync(guildId, ct);

View file

@ -38,6 +38,7 @@ public class InviteDeleteResponder(
public async Task<Result> RespondAsync(IInviteDelete evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
var guildId = evt.GuildID.Value;
var dbDeleteCount = await inviteRepository.DeleteInviteAsync(guildId, evt.Code);

View file

@ -48,6 +48,8 @@ public class GuildMemberAddResponder(
public async Task<Result> RespondAsync(IGuildMemberAdd member, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(member);
await memberCache.SetAsync(member.GuildID, member);
await memberCache.SetMemberNamesAsync(member.GuildID, [member]);

View file

@ -39,6 +39,8 @@ public class GuildMemberRemoveResponder(
public async Task<Result> RespondAsync(IGuildMemberRemove evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
try
{
var embed = new EmbedBuilder()

View file

@ -48,6 +48,8 @@ public class GuildMemberUpdateResponder(
CancellationToken ct = default
)
{
using var _ = LogUtils.Enrich(newMember);
try
{
var oldMember = await memberCache.TryGetAsync(newMember.GuildID, newMember.User.ID);

View file

@ -26,19 +26,19 @@ public class ReadyResponder(ILogger logger, WebhookExecutorService webhookExecut
{
private readonly ILogger _logger = logger.ForContext<ReadyResponder>();
public Task<Result> RespondAsync(IReady gatewayEvent, CancellationToken ct = default)
public Task<Result> RespondAsync(IReady evt, CancellationToken ct = default)
{
var shardId = gatewayEvent.Shard.TryGet(out var shard)
? (shard.ShardID, shard.ShardCount)
: (0, 1);
using var _ = LogUtils.Enrich(evt);
var shardId = evt.Shard.TryGet(out var shard) ? (shard.ShardID, shard.ShardCount) : (0, 1);
_logger.Information(
"Ready as {User} on shard {ShardId}/{ShardCount}",
gatewayEvent.User.Tag(),
evt.User.Tag(),
shardId.Item1,
shardId.Item2
);
if (shardId.Item1 == 0)
webhookExecutorService.SetSelfUser(gatewayEvent.User);
webhookExecutorService.SetSelfUser(evt.User);
return Task.FromResult(Result.Success);
}

View file

@ -35,6 +35,8 @@ public class RoleCreateResponder(
public async Task<Result> RespondAsync(IGuildRoleCreate evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
_logger.Debug("Received new role {RoleId} in guild {GuildId}", evt.Role.ID, evt.GuildID);
roleCache.Set(evt.Role, evt.GuildID);

View file

@ -35,6 +35,8 @@ public class RoleDeleteResponder(
public async Task<Result> RespondAsync(IGuildRoleDelete evt, CancellationToken ct = default)
{
using var __ = LogUtils.Enrich(evt);
try
{
if (!roleCache.TryGet(evt.RoleID, out var role))

View file

@ -37,6 +37,8 @@ public class RoleUpdateResponder(
public async Task<Result> RespondAsync(IGuildRoleUpdate evt, CancellationToken ct = default)
{
using var _ = LogUtils.Enrich(evt);
try
{
var newRole = evt.Role;