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.API.Abstractions.Objects; using Remora.Discord.Extensions.Embeds; using Remora.Discord.Gateway.Responders; using Remora.Results; namespace Catalogger.Backend.Bot.Responders.Channels; public class ChannelCreateResponder( DatabaseContext db, RoleCache roleCache, ChannelCache channelCache, UserCache userCache, WebhookExecutorService webhookExecutor) : IResponder { public async Task RespondAsync(IChannelCreate ch, CancellationToken ct = default) { if (!ch.GuildID.IsDefined()) return Result.Success; channelCache.Set(ch); var builder = new EmbedBuilder() .WithTitle(ch.Type switch { ChannelType.GuildVoice => "Voice channel created", ChannelType.GuildCategory => "Category channel created", ChannelType.GuildAnnouncement or ChannelType.GuildText => "Text channel created", _ => "Channel created" }) .WithColour(DiscordUtils.Green) .WithFooter($"ID: {ch.ID}"); if (ch.ParentID.IsDefined(out var parentId)) { builder.WithDescription(channelCache.TryGet(parentId.Value, out var parentChannel) ? $"**Name:** {ch.Name}\n**Category:** {parentChannel.Name}" : $"**Name:** {ch.Name}"); } else builder.WithDescription($"**Name:** {ch.Name}"); foreach (var overwrite in ch.PermissionOverwrites.OrDefault() ?? []) { if (overwrite.Type == PermissionOverwriteType.Role) { var roleName = roleCache.TryGet(overwrite.ID, out var role) ? role.Name : $"role {overwrite.ID}"; var embedFieldValue = ""; if (overwrite.Allow.GetPermissions().Count != 0) embedFieldValue += $"\u2705 {overwrite.Allow.ToPrettyString()}"; if (overwrite.Deny.GetPermissions().Count != 0) embedFieldValue += $"\n\n\u274c {overwrite.Deny.ToPrettyString()}"; builder.AddField($"Override for {roleName}", embedFieldValue.Trim()); } else { var user = await userCache.GetUserAsync(overwrite.ID); var embedFieldValue = ""; if (overwrite.Allow.GetPermissions().Count != 0) embedFieldValue += $"\u2705 {overwrite.Allow.ToPrettyString()}"; if (overwrite.Deny.GetPermissions().Count != 0) embedFieldValue += $"\n\n\u274c {overwrite.Deny.ToPrettyString()}"; builder.AddField($"Override for {user?.Tag() ?? $"user {overwrite.ID}"}", embedFieldValue.Trim()); } } var guildConfig = await db.GetGuildAsync(ch.GuildID.Value, ct); webhookExecutor.QueueLog(guildConfig, LogChannelType.ChannelCreate, builder.Build().GetOrThrow()); return Result.Success; } }