2024-08-19 16:12:28 +02:00
|
|
|
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<Snowflake, byte> _guilds = new();
|
|
|
|
|
|
|
|
|
|
#pragma warning disable CS8619 // Nullability of reference types in value doesn't match target type.
|
|
|
|
|
public Task<IGuildMember?> TryGetAsync(Snowflake guildId, Snowflake userId) =>
|
|
|
|
|
_members.TryGetValue((guildId, userId), out var member)
|
|
|
|
|
? Task.FromResult(member)
|
|
|
|
|
: Task.FromResult<IGuildMember?>(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())
|
2024-09-02 17:00:33 +02:00
|
|
|
throw new CataloggerError("Member with undefined User passed to InMemoryMemberCache.SetAsync");
|
2024-08-19 16:12:28 +02:00
|
|
|
_members[(guildId, member.User.Value.ID)] = member;
|
|
|
|
|
return Task.CompletedTask;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task SetManyAsync(Snowflake guildId, IReadOnlyList<IGuildMember> members)
|
|
|
|
|
{
|
|
|
|
|
foreach (var member in members)
|
|
|
|
|
await SetAsync(guildId, member);
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-02 17:00:33 +02:00
|
|
|
public Task RemoveAsync(Snowflake guildId, Snowflake userId)
|
|
|
|
|
{
|
|
|
|
|
_members.Remove((guildId, userId), out _);
|
|
|
|
|
return Task.CompletedTask;
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-19 16:12:28 +02:00
|
|
|
public Task<bool> 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;
|
|
|
|
|
}
|
|
|
|
|
}
|