about summary refs log tree commit diff
path: root/LibMatrix/Homeservers/Extensions/NamedCaches/NamedFilterCache.cs
diff options
context:
space:
mode:
Diffstat (limited to 'LibMatrix/Homeservers/Extensions/NamedCaches/NamedFilterCache.cs')
-rw-r--r--LibMatrix/Homeservers/Extensions/NamedCaches/NamedFilterCache.cs33
1 files changed, 33 insertions, 0 deletions
diff --git a/LibMatrix/Homeservers/Extensions/NamedCaches/NamedFilterCache.cs b/LibMatrix/Homeservers/Extensions/NamedCaches/NamedFilterCache.cs
new file mode 100644
index 0000000..76533a4
--- /dev/null
+++ b/LibMatrix/Homeservers/Extensions/NamedCaches/NamedFilterCache.cs
@@ -0,0 +1,33 @@
+using LibMatrix.Filters;
+using LibMatrix.Utilities;
+
+namespace LibMatrix.Homeservers.Extensions.NamedCaches;
+
+public class NamedFilterCache(AuthenticatedHomeserverGeneric hs) : NamedCache<string>(hs, "gay.rory.libmatrix.named_cache.filter") {
+    /// <summary>
+    ///   <inheritdoc cref="NamedCache{T}.GetOrSetValueAsync"/>
+    ///   Allows passing a filter directly, or using a common filter.
+    ///   Substitutes @me for the user's ID.
+    /// </summary>
+    /// <param name="key">Filter name</param>
+    /// <param name="filter">Filter to upload if not cached, otherwise defaults to common filters if that exists.</param>
+    /// <returns></returns>
+    /// <exception cref="ArgumentNullException"></exception>
+    public async Task<string> GetOrSetValueAsync(string key, SyncFilter? filter = null) {
+        var existingValue = await GetValueAsync(key);
+        if (existingValue != null) {
+            return existingValue;
+        }
+
+        if (filter is null) {
+            if(CommonSyncFilters.FilterMap.TryGetValue(key, out var commonFilter)) {
+                filter = commonFilter;
+            } else {
+                throw new ArgumentNullException(nameof(filter));
+            }
+        }
+
+        var filterUpload = await hs.UploadFilterAsync(filter);
+        return await SetValueAsync(key, filterUpload.FilterId);
+    }
+}
\ No newline at end of file