using Microsoft.Extensions.Caching.Memory; using Remora.Discord.API.Abstractions.Gateway.Events; using Remora.Discord.Gateway.Responders; namespace Scathach.Discord.Responders; [PublicAPI] public class GuildCreateResponder( IConfigurationRoot configuration, IDbContextFactory database, ILogger logger, IMemoryCache memoryCache ) : IResponder { public async Task RespondAsync(IGuildCreate gatewayEvent, CancellationToken ct = default) { logger.LogInformation("{Availability} Guild {Name} has just been created.", $"{(gatewayEvent.Guild.IsT0 ? "A" : "Una")}vailable", gatewayEvent.Guild.IsT0 ? gatewayEvent.Guild.AsT0.Name : gatewayEvent.Guild.AsT1.ID.ToString()); if (gatewayEvent.Guild.IsT1) return Result.FromSuccess(); var guild = gatewayEvent.Guild.AsT0; var guildModel = new GuildModel(guild.ID.ToString()) { Name = guild.Name, Prefix = configuration["PREFIX"]! }; await using (var databaseContext = await database.CreateDbContextAsync(ct)) { var dbGuild = await databaseContext.Guilds.SingleOrDefaultAsync(g => g.Id == guild.ID.ToString(), ct); if (dbGuild is null) // Only add actual new guilds to the database as this fires on ALL guilds during startup { databaseContext.Guilds.Add(guildModel); await databaseContext.SaveChangesAsync(ct); } else guildModel = dbGuild; } using (var entry = memoryCache.CreateEntry(CacheKey.StringKey($"Guild:{guild.ID}"))) entry.Value = guildModel; return Result.FromSuccess(); } }