Catalogger.NET/Catalogger.Backend/Bot/Responders/Invites/InviteCreateResponder.cs

71 lines
2.2 KiB
C#
Raw Normal View History

2024-10-14 03:12:00 +02:00
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<IInviteCreate>
{
private readonly ILogger _logger = logger.ForContext<InviteCreateResponder>();
public async Task<Result> 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"
: $"<t:{(DateTimeOffset.UtcNow + evt.MaxAge).ToUnixTimeSeconds()}>",
inline: true
);
var guildConfig = await db.GetGuildAsync(guildId, ct);
webhookExecutor.QueueLog(
guildConfig,
LogChannelType.InviteCreate,
embed.Build().GetOrThrow()
);
return Result.Success;
}
}