From 096375344ef87fe53ca009b7a7eaa34c9c9f5407 Mon Sep 17 00:00:00 2001 From: Rory& Date: Fri, 15 Mar 2024 18:10:58 +0100 Subject: Bot changes, move named filters to subclass --- .../Extensions/NamedCaches/NamedCache.cs | 37 ++++++++++++++++++++++ .../Extensions/NamedCaches/NamedFileCache.cs | 3 ++ .../Extensions/NamedCaches/NamedFilterCache.cs | 33 +++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 LibMatrix/Homeservers/Extensions/NamedCaches/NamedCache.cs create mode 100644 LibMatrix/Homeservers/Extensions/NamedCaches/NamedFileCache.cs create mode 100644 LibMatrix/Homeservers/Extensions/NamedCaches/NamedFilterCache.cs (limited to 'LibMatrix/Homeservers/Extensions/NamedCaches') 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(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()); + } +} \ No newline at end of file diff --git a/LibMatrix/Homeservers/Extensions/NamedCaches/NamedFileCache.cs b/LibMatrix/Homeservers/Extensions/NamedCaches/NamedFileCache.cs new file mode 100644 index 0000000..87b7636 --- /dev/null +++ b/LibMatrix/Homeservers/Extensions/NamedCaches/NamedFileCache.cs @@ -0,0 +1,3 @@ +namespace LibMatrix.Homeservers.Extensions.NamedCaches; + +public class NamedFileCache(AuthenticatedHomeserverGeneric hs) : NamedCache(hs, "gay.rory.libmatrix.named_cache.media") { } \ No newline at end of file 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(hs, "gay.rory.libmatrix.named_cache.filter") { + /// + /// + /// Allows passing a filter directly, or using a common filter. + /// Substitutes @me for the user's ID. + /// + /// Filter name + /// Filter to upload if not cached, otherwise defaults to common filters if that exists. + /// + /// + public async Task 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 -- cgit 1.4.1