using System.Collections.Concurrent; using Remora.Discord.API.Abstractions.Objects; using Remora.Rest.Core; namespace Catalogger.Backend.Cache.InMemoryCache; public class InMemoryMemberCache : IMemberCache { private readonly ConcurrentDictionary<(Snowflake, Snowflake), IGuildMember> _members = new(); private readonly ConcurrentDictionary _guilds = new(); #pragma warning disable CS8619 // Nullability of reference types in value doesn't match target type. public Task TryGetAsync(Snowflake guildId, Snowflake userId) => _members.TryGetValue((guildId, userId), out var member) ? Task.FromResult(member) : Task.FromResult(null); #pragma warning restore CS8619 // Nullability of reference types in value doesn't match target type. public Task SetAsync(Snowflake guildId, IGuildMember member) { if (!member.User.IsDefined()) throw new CataloggerError("Member with undefined User passed to InMemoryMemberCache.SetAsync"); _members[(guildId, member.User.Value.ID)] = member; return Task.CompletedTask; } public async Task SetManyAsync(Snowflake guildId, IReadOnlyList members) { foreach (var member in members) await SetAsync(guildId, member); } public Task RemoveAsync(Snowflake guildId, Snowflake userId) { _members.Remove((guildId, userId), out _); return Task.CompletedTask; } public Task IsGuildCachedAsync(Snowflake guildId) => Task.FromResult(_guilds.ContainsKey(guildId)); public Task MarkAsCachedAsync(Snowflake guildId) { _guilds[guildId] = 1; return Task.CompletedTask; } public Task MarkAsUncachedAsync(Snowflake guildId) { _guilds.Remove(guildId, out _); return Task.CompletedTask; } }