namespace LibMatrix.Homeservers.Extensions.NamedCaches; public class NamedCache(AuthenticatedHomeserverGeneric hs, string name) where T : class { private Dictionary? _cache = new(); private DateTime _expiry = DateTime.MinValue; public async Task> ReadCacheMapAsync() { _cache = await hs.GetAccountDataOrNullAsync>(name); return _cache ?? new(); } public async Task> ReadCacheMapCachedAsync() { if (_expiry < DateTime.Now || _cache == null) { _cache = await ReadCacheMapAsync(); _expiry = DateTime.Now.AddMinutes(5); } return _cache; } public virtual async Task GetValueAsync(string key) { return (await ReadCacheMapCachedAsync()).GetValueOrDefault(key); } public virtual async Task SetValueAsync(string key, T value) { var cache = await ReadCacheMapCachedAsync(); cache[key] = value; await hs.SetAccountDataAsync(name, cache); return value; } public virtual async Task GetOrSetValueAsync(string key, Func> value) { return (await ReadCacheMapCachedAsync()).GetValueOrDefault(key) ?? await SetValueAsync(key, await value()); } }