using System.Diagnostics; using Catalogger.Backend.Cache; using Catalogger.Backend.Database; using Catalogger.Backend.Database.Models; using Catalogger.Backend.Extensions; using Remora.Discord.API.Abstractions.Gateway.Events; using Remora.Discord.Gateway.Responders; using Remora.Results; namespace Catalogger.Backend.Bot.Responders; public class GuildCreateResponder(ILogger logger, DatabaseContext db, ChannelCacheService channelCache) : IResponder { private readonly ILogger _logger = logger.ForContext(); public async Task RespondAsync(IGuildCreate evt, CancellationToken ct = default) { ulong guildId; string? guildName = null; if (evt.Guild.TryPickT0(out var guild, out _)) { _logger.Verbose("Received guild create for available guild {GuildId} ({Name})", guild.ID, guild.Name); guildId = guild.ID.ToUlong(); guildName = guild.Name; foreach (var c in guild.Channels) channelCache.AddChannel(c, guild.ID); } else if (evt.Guild.TryPickT1(out var unavailableGuild, out _)) { _logger.Verbose("Received guild create for unavailable guild {GuildId}", unavailableGuild.ID); guildId = unavailableGuild.ID.ToUlong(); } else throw new UnreachableException(); var tx = await db.Database.BeginTransactionAsync(ct); if (await db.Guilds.FindAsync([guildId], ct) != null) return Result.Success; db.Add(new Guild { Id = guildId }); await db.SaveChangesAsync(ct); await tx.CommitAsync(ct); _logger.Information("Joined new guild {GuildId} ({Name})", guildId, guildName); return Result.Success; } }