using Catalogger.Backend.Cache; 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.Rest; using Remora.Discord.Extensions.Embeds; using Remora.Discord.Gateway.Responders; using Remora.Results; namespace Catalogger.Backend.Bot.Responders.Invites; public class InviteCreateResponder( ILogger logger, DatabaseContext db, IInviteCache inviteCache, IDiscordRestGuildAPI guildApi, WebhookExecutorService webhookExecutor ) : IResponder { private readonly ILogger _logger = logger.ForContext(); public async Task RespondAsync(IInviteCreate evt, CancellationToken ct = default) { var guildId = evt.GuildID.Value; var invitesResult = await guildApi.GetGuildInvitesAsync(guildId, ct); if (!invitesResult.IsSuccess) { _logger.Error( "Error fetching new invites for guild {GuildId}: {Error}", guildId, invitesResult.Error ); } else { await inviteCache.SetAsync(guildId, invitesResult.Entity); } var embed = new EmbedBuilder() .WithTitle("Invite created") .WithDescription($"A new invite (**{evt.Code}**) was created for <#{evt.ChannelID}>.") .WithColour(DiscordUtils.Green) .WithFooter($"Code: {evt.Code}"); embed.AddField("Created by", evt.Inviter.GetOrThrow().PrettyFormat()); embed.AddField( "Maximum uses", evt.MaxUses != 0 ? evt.MaxUses.ToString() : "Infinite", inline: true ); embed.AddField( "Expires", evt.MaxAge == TimeSpan.Zero ? "Never" : $"", inline: true ); var guildConfig = await db.GetGuildAsync(guildId, ct); webhookExecutor.QueueLog( guildConfig, LogChannelType.InviteCreate, embed.Build().GetOrThrow() ); return Result.Success; } }