using System.Collections.Concurrent; using Remora.Discord.API; using Remora.Rest.Core; namespace Catalogger.Backend.Cache.InMemoryCache; public class AuditLogCache { private readonly ConcurrentDictionary<(Snowflake GuildId, Snowflake TargetId), ActionData> _kicks = new(); private readonly ConcurrentDictionary<(Snowflake GuildId, Snowflake TargetId), ActionData> _bans = new(); public void SetKick(Snowflake guildId, string targetId, Snowflake moderatorId, Optional reason) { if (!DiscordSnowflake.TryParse(targetId, out var targetUser)) throw new CataloggerError("Target ID was not a valid snowflake"); _kicks[(guildId, targetUser.Value)] = new ActionData(moderatorId, reason.OrDefault()); } public bool TryGetKick(Snowflake guildId, Snowflake targetId, out ActionData data) => _kicks.TryGetValue((guildId, targetId), out data); public void SetBan(Snowflake guildId, string targetId, Snowflake moderatorId, Optional reason) { if (!DiscordSnowflake.TryParse(targetId, out var targetUser)) throw new CataloggerError("Target ID was not a valid snowflake"); _bans[(guildId, targetUser.Value)] = new ActionData(moderatorId, reason.OrDefault()); } public bool TryGetBan(Snowflake guildId, Snowflake targetId, out ActionData data) => _bans.TryGetValue((guildId, targetId), out data); public record struct ActionData(Snowflake ModeratorId, string? Reason); }