feat(dashboard): working ignored channels page
This commit is contained in:
parent
1c43beb82f
commit
bccf7caf34
13 changed files with 304 additions and 8 deletions
|
|
@ -29,4 +29,21 @@ public interface IMemberCache
|
|||
public Task MarkAsCachedAsync(Snowflake guildId);
|
||||
public Task MarkAsUncachedAsync(Snowflake guildId);
|
||||
public Task UpdateAsync(IGuildMemberUpdate newMember);
|
||||
|
||||
// These methods can be stubbed out for any implementation that isn't intended for use with the dashboard.
|
||||
public Task SetMemberNamesAsync(Snowflake guildId, IEnumerable<IGuildMember> members);
|
||||
|
||||
public Task UpdateMemberNameAsync(
|
||||
Snowflake guildId,
|
||||
Snowflake userId,
|
||||
string prevName,
|
||||
string newName
|
||||
);
|
||||
|
||||
public Task<IEnumerable<(string Name, string Id)>> GetMemberNamesAsync(
|
||||
Snowflake guildId,
|
||||
string prefix
|
||||
);
|
||||
|
||||
public Task TryRemoveMemberNameAsync(Snowflake guildId, string username);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -128,4 +128,21 @@ public class InMemoryMemberCache(IDiscordRestGuildAPI guildApi, ILogger logger)
|
|||
|
||||
_members[(newMember.GuildID, newMember.User.ID)] = member;
|
||||
}
|
||||
|
||||
public Task SetMemberNamesAsync(Snowflake guildId, IEnumerable<IGuildMember> members) =>
|
||||
Task.CompletedTask;
|
||||
|
||||
public Task UpdateMemberNameAsync(
|
||||
Snowflake guildId,
|
||||
Snowflake userId,
|
||||
string prevName,
|
||||
string newName
|
||||
) => Task.CompletedTask;
|
||||
|
||||
public Task<IEnumerable<(string Name, string Id)>> GetMemberNamesAsync(
|
||||
Snowflake guildId,
|
||||
string prefix
|
||||
) => Task.FromResult<IEnumerable<(string, string)>>([]);
|
||||
|
||||
public Task TryRemoveMemberNameAsync(Snowflake guildId, string username) => Task.CompletedTask;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,12 +14,14 @@
|
|||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
using Catalogger.Backend.Database.Redis;
|
||||
using Catalogger.Backend.Extensions;
|
||||
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;
|
||||
using StackExchange.Redis;
|
||||
|
||||
namespace Catalogger.Backend.Cache.RedisCache;
|
||||
|
||||
|
|
@ -146,9 +148,55 @@ public class RedisMemberCache(
|
|||
await SetInnerAsync(newMember.GuildID, member);
|
||||
}
|
||||
|
||||
public async Task SetMemberNamesAsync(Snowflake guildId, IEnumerable<IGuildMember> members)
|
||||
{
|
||||
await redisService
|
||||
.GetDatabase()
|
||||
.HashSetAsync(
|
||||
MemberNamesKey(guildId),
|
||||
members
|
||||
.Select(m => new HashEntry(m.User.Value.Tag(), m.User.Value.ID.ToString()))
|
||||
.ToArray()
|
||||
);
|
||||
}
|
||||
|
||||
public async Task UpdateMemberNameAsync(
|
||||
Snowflake guildId,
|
||||
Snowflake userId,
|
||||
string prevName,
|
||||
string newName
|
||||
) =>
|
||||
await Task.WhenAll(
|
||||
redisService.GetDatabase().HashDeleteAsync(MemberNamesKey(guildId), prevName),
|
||||
redisService
|
||||
.GetDatabase()
|
||||
.HashSetAsync(MemberNamesKey(guildId), newName, userId.ToString())
|
||||
);
|
||||
|
||||
public async Task<IEnumerable<(string Name, string Id)>> GetMemberNamesAsync(
|
||||
Snowflake guildId,
|
||||
string prefix
|
||||
)
|
||||
{
|
||||
var entries = redisService
|
||||
.GetDatabase()
|
||||
.HashScanAsync(MemberNamesKey(guildId), $"{prefix}*", 50);
|
||||
|
||||
var names = new List<(string Name, string Id)>();
|
||||
await foreach (var entry in entries)
|
||||
names.Add((entry.Name, entry.Value)!);
|
||||
|
||||
return names;
|
||||
}
|
||||
|
||||
public async Task TryRemoveMemberNameAsync(Snowflake guildId, string username) =>
|
||||
await redisService.GetDatabase().HashDeleteAsync(MemberNamesKey(guildId), username);
|
||||
|
||||
private const string GuildCacheKey = "cached-guilds";
|
||||
|
||||
private static string GuildMembersKey(Snowflake guildId) => $"guild-members:{guildId}";
|
||||
|
||||
private static string MemberNamesKey(Snowflake guildId) => $"guild-member-names:{guildId}";
|
||||
}
|
||||
|
||||
internal record RedisMember(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue