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(); private readonly ConcurrentDictionary< (Snowflake GuildId, Snowflake TargetId), ActionData > _unbans = new(); private readonly ConcurrentDictionary< (Snowflake GuildId, Snowflake TargetId), ActionData > _memberUpdates = 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 void SetUnban( 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"); _unbans[(guildId, targetUser.Value)] = new ActionData(moderatorId, reason.OrDefault()); } public bool TryGetUnban(Snowflake guildId, Snowflake targetId, out ActionData data) => _unbans.TryGetValue((guildId, targetId), out data); public void SetMemberUpdate( 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"); _memberUpdates[(guildId, targetUser.Value)] = new ActionData( moderatorId, reason.OrDefault() ); } public bool TryGetMemberUpdate(Snowflake guildId, Snowflake targetId, out ActionData data) => _memberUpdates.TryGetValue((guildId, targetId), out data); public record struct ActionData(Snowflake ModeratorId, string? Reason); }