using System.Text.Json; using Remora.Discord.API; using Remora.Discord.API.Abstractions.Objects; using Remora.Discord.API.Objects; using Remora.Rest.Json; using StackExchange.Redis; namespace Catalogger.Backend.Database.Redis; public class RedisService(Config config) { private readonly ConnectionMultiplexer _multiplexer = ConnectionMultiplexer.Connect(config.Database.Redis!); private readonly JsonSerializerOptions _options = new() { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower }; public IDatabase GetDatabase(int db = -1) => _multiplexer.GetDatabase(db); public async Task SetAsync(string key, T value, TimeSpan? expiry = null) { var json = JsonSerializer.Serialize(value, _options); await GetDatabase().StringSetAsync(key, json, expiry); } public async Task GetAsync(string key) { var value = await GetDatabase().StringGetAsync(key); return value.IsNull ? default : JsonSerializer.Deserialize(value!, _options); } public async Task SetHashAsync(string hashKey, string fieldKey, T value) { var json = JsonSerializer.Serialize(value, _options); await GetDatabase().HashSetAsync(hashKey, fieldKey, json); } public async Task SetHashAsync(string hashKey, IEnumerable values, Func keySelector) { var hashEntries = values .Select(v => new { Key = keySelector(v), Value = JsonSerializer.Serialize(v, _options) }) .Select(v => new HashEntry(v.Key, v.Value)); await GetDatabase().HashSetAsync(hashKey, hashEntries.ToArray()); } public async Task GetHashAsync(string hashKey, string fieldKey) { var value = await GetDatabase().HashGetAsync(hashKey, fieldKey); return value.IsNull ? default : JsonSerializer.Deserialize(value!, _options); } }