using Catalogger.Backend.Cache.InMemoryCache; using Remora.Discord.API; using Remora.Discord.API.Abstractions.Gateway.Events; using Remora.Discord.API.Abstractions.Objects; using Remora.Discord.Gateway.Responders; using Remora.Results; namespace Catalogger.Backend.Bot.Responders.Guilds; public class AuditLogResponder(AuditLogCache auditLogCache, ILogger logger) : IResponder { private readonly ILogger _logger = logger.ForContext(); public Task RespondAsync(IGuildAuditLogEntryCreate evt, CancellationToken ct = default) { if (evt.TargetID == null || evt.UserID == null) return Task.FromResult(Result.Success); switch (evt.ActionType) { case AuditLogEvent.MemberKick: auditLogCache.SetKick(evt.GuildID, evt.TargetID, evt.UserID.Value, evt.Reason); break; case AuditLogEvent.MemberBanAdd: auditLogCache.SetBan(evt.GuildID, evt.TargetID, evt.UserID.Value, evt.Reason); break; case AuditLogEvent.MemberBanRemove: auditLogCache.SetUnban(evt.GuildID, evt.TargetID, evt.UserID.Value, evt.Reason); break; case AuditLogEvent.MemberRoleUpdate: case AuditLogEvent.MemberUpdate: auditLogCache.SetMemberUpdate( evt.GuildID, evt.TargetID, evt.UserID.Value, evt.Reason ); break; default: _logger.Debug( "Received audit log event {Id} with type {Type} that we don't care about, ignoring", evt.ID, evt.ActionType ); break; } return Task.FromResult(Result.Success); } }