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
|
|
@ -8,14 +8,14 @@ namespace Catalogger.Backend.Cache.RedisCache;
|
|||
|
||||
public class RedisInviteCache(RedisService redisService) : IInviteCache
|
||||
{
|
||||
public async Task<IEnumerable<IInvite>> TryGetAsync(Snowflake guildId)
|
||||
public async Task<IEnumerable<IInviteWithMetadata>> TryGetAsync(Snowflake guildId)
|
||||
{
|
||||
var redisInvites =
|
||||
await redisService.GetAsync<List<RedisInvite>>(InvitesKey(guildId)) ?? [];
|
||||
return redisInvites.Select(r => r.ToRemoraInvite());
|
||||
}
|
||||
|
||||
public async Task SetAsync(Snowflake guildId, IEnumerable<IInvite> invites) =>
|
||||
public async Task SetAsync(Snowflake guildId, IEnumerable<IInviteWithMetadata> invites) =>
|
||||
await redisService.SetAsync(InvitesKey(guildId), invites.Select(RedisInvite.FromIInvite));
|
||||
|
||||
private static string InvitesKey(Snowflake guildId) => $"guild-invites:{guildId}";
|
||||
|
|
@ -25,24 +25,39 @@ internal record RedisInvite(
|
|||
string Code,
|
||||
RedisPartialGuild? Guild,
|
||||
RedisPartialChannel? Channel,
|
||||
int Uses,
|
||||
int MaxUses,
|
||||
TimeSpan MaxAge,
|
||||
bool IsTemporary,
|
||||
DateTimeOffset CreatedAt,
|
||||
RedisUser? Inviter,
|
||||
DateTimeOffset? ExpiresAt
|
||||
)
|
||||
{
|
||||
public static RedisInvite FromIInvite(IInvite invite) =>
|
||||
public static RedisInvite FromIInvite(IInviteWithMetadata invite) =>
|
||||
new(
|
||||
invite.Code,
|
||||
invite.Guild.Map(RedisPartialGuild.FromIPartialGuild).OrDefault(),
|
||||
invite.Channel != null ? RedisPartialChannel.FromIPartialChannel(invite.Channel) : null,
|
||||
invite.Uses,
|
||||
invite.MaxUses,
|
||||
invite.MaxAge,
|
||||
invite.IsTemporary,
|
||||
invite.CreatedAt,
|
||||
invite.Inviter.Map(RedisUser.FromIUser).OrDefault(),
|
||||
invite.ExpiresAt.OrDefault()
|
||||
);
|
||||
|
||||
public Invite ToRemoraInvite() =>
|
||||
public InviteWithMetadata ToRemoraInvite() =>
|
||||
new(
|
||||
Code,
|
||||
Guild?.ToRemoraPartialGuild() ?? new Optional<IPartialGuild>(),
|
||||
Channel?.ToRemoraPartialChannel(),
|
||||
Uses,
|
||||
MaxUses,
|
||||
MaxAge,
|
||||
IsTemporary,
|
||||
CreatedAt,
|
||||
Inviter?.ToRemoraUser() ?? new Optional<IUser>(),
|
||||
ExpiresAt: ExpiresAt
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,32 +1,46 @@
|
|||
using Catalogger.Backend.Database.Redis;
|
||||
using Remora.Discord.API;
|
||||
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.RedisCache;
|
||||
|
||||
public class RedisMemberCache(RedisService redisService) : IMemberCache
|
||||
public class RedisMemberCache(
|
||||
RedisService redisService,
|
||||
IDiscordRestGuildAPI guildApi,
|
||||
ILogger logger
|
||||
) : IMemberCache
|
||||
{
|
||||
private readonly ILogger _logger = logger.ForContext<RedisMemberCache>();
|
||||
|
||||
public async Task<IGuildMember?> TryGetAsync(Snowflake guildId, Snowflake userId)
|
||||
{
|
||||
var redisMember = await redisService.GetHashAsync<RedisMember>(
|
||||
GuildMembersKey(guildId),
|
||||
userId.ToString()
|
||||
);
|
||||
var redisMember = await TryGetInnerAsync(guildId, userId);
|
||||
return redisMember?.ToRemoraMember();
|
||||
}
|
||||
|
||||
private async Task<RedisMember?> TryGetInnerAsync(Snowflake guildId, Snowflake userId) =>
|
||||
await redisService.GetHashAsync<RedisMember>(GuildMembersKey(guildId), userId.ToString());
|
||||
|
||||
public async Task SetAsync(Snowflake guildId, IGuildMember member)
|
||||
{
|
||||
if (!member.User.IsDefined())
|
||||
throw new CataloggerError(
|
||||
"Member with undefined User passed to RedisMemberCache.SetAsync"
|
||||
);
|
||||
|
||||
await SetInnerAsync(guildId, RedisMember.FromIGuildMember(member));
|
||||
}
|
||||
|
||||
private async Task SetInnerAsync(Snowflake guildId, RedisMember member)
|
||||
{
|
||||
await redisService.SetHashAsync(
|
||||
GuildMembersKey(guildId),
|
||||
member.User.Value.ID.ToString(),
|
||||
RedisMember.FromIGuildMember(member)
|
||||
member.User.Id.ToString(),
|
||||
member
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -59,6 +73,58 @@ public class RedisMemberCache(RedisService redisService) : IMemberCache
|
|||
public async Task MarkAsUncachedAsync(Snowflake guildId) =>
|
||||
await redisService.GetDatabase().SetRemoveAsync(GuildCacheKey, guildId.ToString());
|
||||
|
||||
public async Task UpdateAsync(IGuildMemberUpdate newMember)
|
||||
{
|
||||
var oldMember = await TryGetInnerAsync(newMember.GuildID, newMember.User.ID);
|
||||
if (oldMember == null)
|
||||
{
|
||||
_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;
|
||||
}
|
||||
|
||||
await SetAsync(newMember.GuildID, memberResult.Entity);
|
||||
return;
|
||||
}
|
||||
|
||||
var member = oldMember with
|
||||
{
|
||||
User = RedisUser.FromIUser(newMember.User),
|
||||
Nickname = newMember.Nickname.HasValue ? newMember.Nickname.Value : oldMember.Nickname,
|
||||
Avatar = newMember.Avatar.HasValue ? newMember.Avatar.Value?.Value : 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,
|
||||
};
|
||||
|
||||
await SetInnerAsync(newMember.GuildID, member);
|
||||
}
|
||||
|
||||
private const string GuildCacheKey = "cached-guilds";
|
||||
|
||||
private static string GuildMembersKey(Snowflake guildId) => $"guild-members:{guildId}";
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue