49 lines
No EOL
1.7 KiB
C#
49 lines
No EOL
1.7 KiB
C#
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<IGuildCreate>
|
|
{
|
|
private readonly ILogger _logger = logger.ForContext<GuildCreateResponder>();
|
|
|
|
public async Task<Result> 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;
|
|
}
|
|
} |