feat: role delete logging, used invite logging, also some random changes
This commit is contained in:
parent
4f54077c68
commit
c906a4d6b6
18 changed files with 386 additions and 76 deletions
|
|
@ -1,12 +1,19 @@
|
|||
using System.Collections.Concurrent;
|
||||
using Remora.Discord.API.Abstractions.Gateway.Events;
|
||||
using Remora.Discord.API.Abstractions.Objects;
|
||||
using Remora.Discord.API.Abstractions.Rest;
|
||||
using Remora.Discord.API.Objects;
|
||||
using Remora.Rest.Core;
|
||||
|
||||
namespace Catalogger.Backend.Cache.InMemoryCache;
|
||||
|
||||
public class InMemoryMemberCache : IMemberCache
|
||||
public class InMemoryMemberCache(IDiscordRestGuildAPI guildApi, ILogger logger) : IMemberCache
|
||||
{
|
||||
private readonly ConcurrentDictionary<(Snowflake, Snowflake), IGuildMember> _members = new();
|
||||
private readonly ILogger _logger = logger.ForContext<InMemoryMemberCache>();
|
||||
private readonly ConcurrentDictionary<
|
||||
(Snowflake GuildId, Snowflake UserId),
|
||||
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.
|
||||
|
|
@ -52,4 +59,56 @@ public class InMemoryMemberCache : IMemberCache
|
|||
_guilds.Remove(guildId, out _);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public async Task UpdateAsync(IGuildMemberUpdate newMember)
|
||||
{
|
||||
if (!_members.TryGetValue((newMember.GuildID, newMember.User.ID), out var oldMember))
|
||||
{
|
||||
_logger.Warning(
|
||||
"Received member update event for {MemberId} in {GuildId}, but member wasn't found in cache. Fetching them and storing.",
|
||||
newMember.User.ID,
|
||||
newMember.GuildID
|
||||
);
|
||||
|
||||
var memberResult = await guildApi.GetGuildMemberAsync(
|
||||
newMember.GuildID,
|
||||
newMember.User.ID
|
||||
);
|
||||
if (!memberResult.IsSuccess)
|
||||
{
|
||||
_logger.Error(
|
||||
"Could not get uncached member {MemberId} in {GuildId} via REST: {Error}",
|
||||
newMember.User.ID,
|
||||
newMember.GuildID,
|
||||
memberResult.Error
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
_members[(newMember.GuildID, newMember.User.ID)] = memberResult.Entity;
|
||||
return;
|
||||
}
|
||||
|
||||
// Unwrapping the interface because fuck it, we ball
|
||||
var member = (GuildMember)oldMember with
|
||||
{
|
||||
User = new Optional<IUser>(newMember.User),
|
||||
Nickname = newMember.Nickname.HasValue ? newMember.Nickname.Value : oldMember.Nickname,
|
||||
Avatar = newMember.Avatar.HasValue ? newMember.Avatar : oldMember.Avatar,
|
||||
Roles = newMember.Roles.ToArray(),
|
||||
JoinedAt = newMember.JoinedAt ?? oldMember.JoinedAt,
|
||||
PremiumSince = newMember.PremiumSince.HasValue
|
||||
? newMember.PremiumSince.Value
|
||||
: oldMember.PremiumSince,
|
||||
IsPending = newMember.IsPending.HasValue
|
||||
? newMember.IsPending.Value
|
||||
: oldMember.IsPending,
|
||||
CommunicationDisabledUntil = newMember.CommunicationDisabledUntil.HasValue
|
||||
? newMember.CommunicationDisabledUntil.Value
|
||||
: oldMember.CommunicationDisabledUntil,
|
||||
};
|
||||
|
||||
_members[(newMember.GuildID, newMember.User.ID)] = member;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue