From 9e0e53a428b162b59fa8317949dcaeda6c1e1fdb Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 2 Sep 2024 15:05:32 +0200 Subject: [PATCH] feat: add channel delete event --- .../Channels/ChannelDeleteResponder.cs | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Catalogger.Backend/Bot/Responders/Channels/ChannelDeleteResponder.cs diff --git a/Catalogger.Backend/Bot/Responders/Channels/ChannelDeleteResponder.cs b/Catalogger.Backend/Bot/Responders/Channels/ChannelDeleteResponder.cs new file mode 100644 index 0000000..ecced61 --- /dev/null +++ b/Catalogger.Backend/Bot/Responders/Channels/ChannelDeleteResponder.cs @@ -0,0 +1,55 @@ +using Catalogger.Backend.Cache.InMemoryCache; +using Catalogger.Backend.Database; +using Catalogger.Backend.Database.Queries; +using Catalogger.Backend.Extensions; +using Catalogger.Backend.Services; +using Remora.Discord.API.Abstractions.Gateway.Events; +using Remora.Discord.Extensions.Embeds; +using Remora.Discord.Gateway.Responders; +using Remora.Results; + +namespace Catalogger.Backend.Bot.Responders.Channels; + +public class ChannelDeleteResponder( + ILogger logger, + DatabaseContext db, + ChannelCache channelCache, + WebhookExecutorService webhookExecutor) : IResponder +{ + private readonly ILogger _logger = logger.ForContext(); + + public async Task RespondAsync(IChannelDelete evt, CancellationToken ct = default) + { + if (!evt.GuildID.IsDefined()) + { + _logger.Debug("Deleted channel {ChannelId} is not in a guild", evt.ID); + return Result.Success; + } + + if (!channelCache.TryGet(evt.ID, out var channel)) + { + _logger.Information("Deleted channel {ChannelId} not found in the cache", evt.ID); + channelCache.Remove(evt.GuildID.OrDefault(), evt.ID, out _); + return Result.Success; + } + + var guildConfig = await db.GetGuildAsync(evt.GuildID.Value, ct); + var embed = new EmbedBuilder() + .WithTitle("Channel deleted") + .WithColour(DiscordUtils.Red) + .WithFooter($"ID: {evt.ID}") + .WithCurrentTimestamp() + .WithDescription($"**Name:** {channel.Name.Value}"); + + if (channel.ParentID.IsDefined(out var parentId) && channelCache.TryGet(parentId.Value, out var category)) + embed.Description += $"\n**Category:** {category.Name}"; + else + embed.Description += "\n**Category:** (none)"; + + if (channel.Topic.IsDefined(out var topic)) + embed.AddField("Description", topic); + + await webhookExecutor.QueueLogAsync(guildConfig, LogChannelType.ChannelDelete, embed.Build().GetOrThrow()); + return Result.Success; + } +} \ No newline at end of file