about summary refs log tree commit diff
path: root/LibMatrix/Homeservers/Extensions/NamedCaches/NamedCache.cs
diff options
context:
space:
mode:
Diffstat (limited to 'LibMatrix/Homeservers/Extensions/NamedCaches/NamedCache.cs')
-rw-r--r--LibMatrix/Homeservers/Extensions/NamedCaches/NamedCache.cs37
1 files changed, 37 insertions, 0 deletions
diff --git a/LibMatrix/Homeservers/Extensions/NamedCaches/NamedCache.cs b/LibMatrix/Homeservers/Extensions/NamedCaches/NamedCache.cs
new file mode 100644
index 0000000..622eef6
--- /dev/null
+++ b/LibMatrix/Homeservers/Extensions/NamedCaches/NamedCache.cs
@@ -0,0 +1,37 @@
+namespace LibMatrix.Homeservers.Extensions.NamedCaches;
+
+public class NamedCache<T>(AuthenticatedHomeserverGeneric hs, string name) where T : class {
+    private Dictionary<string, T>? _cache = new();
+    private DateTime _expiry = DateTime.MinValue;
+    
+    public async Task<Dictionary<string, T>> ReadCacheMapAsync() {
+        _cache = await hs.GetAccountDataOrNullAsync<Dictionary<string, T>>(name);
+
+        return _cache ?? new();
+    }
+    
+    public async Task<Dictionary<string,T>> ReadCacheMapCachedAsync() {
+        if (_expiry < DateTime.Now || _cache == null) {
+            _cache = await ReadCacheMapAsync();
+            _expiry = DateTime.Now.AddMinutes(5);
+        }
+
+        return _cache;
+    }
+    
+    public virtual async Task<T?> GetValueAsync(string key) {
+        return (await ReadCacheMapCachedAsync()).GetValueOrDefault(key);
+    }
+    
+    public virtual async Task<T> SetValueAsync(string key, T value) {
+        var cache = await ReadCacheMapCachedAsync();
+        cache[key] = value;
+        await hs.SetAccountDataAsync(name, cache);
+
+        return value;
+    }
+    
+    public virtual async Task<T> GetOrSetValueAsync(string key, Func<Task<T>> value) {
+        return (await ReadCacheMapCachedAsync()).GetValueOrDefault(key) ?? await SetValueAsync(key, await value());
+    }
+}
\ No newline at end of file