Add state cache
1 files changed, 38 insertions, 3 deletions
diff --git a/MatrixRoomUtils.Core/Room.cs b/MatrixRoomUtils.Core/Room.cs
index be470fa..3ef6ffa 100644
--- a/MatrixRoomUtils.Core/Room.cs
+++ b/MatrixRoomUtils.Core/Room.cs
@@ -16,17 +16,52 @@ public class Room
public async Task<JsonElement?> GetStateAsync(string type, string state_key="", bool logOnFailure = false)
{
- var url = $"/_matrix/client/r0/rooms/{RoomId}/state";
+ var url = $"/_matrix/client/v3/rooms/{RoomId}/state";
if (!string.IsNullOrEmpty(state_key)) url += $"/{type}/{state_key}";
else if (!string.IsNullOrEmpty(type)) url += $"/{type}";
-
+ var cache_key = "room_states_"+type;
+ if (!RuntimeCache.GenericResponseCache.ContainsKey(cache_key))
+ {
+ Console.WriteLine($"[!!] No cache for {cache_key}, creating...");
+ RuntimeCache.GenericResponseCache.Add(cache_key, new ObjectCache<object?>()
+ {
+ DefaultExpiry = type switch
+ {
+ "m.room.name" => TimeSpan.FromMinutes(15),
+ _ => TimeSpan.FromMinutes(5)
+ }
+ });
+ }
+
+ if (RuntimeCache.GenericResponseCache[cache_key][url] != null)
+ {
+ if(RuntimeCache.GenericResponseCache[cache_key][url].ExpiryTime > DateTime.Now)
+ {
+ Console.WriteLine($"[:3] Found cached state: {RuntimeCache.GenericResponseCache[cache_key][url].Result}");
+ return (JsonElement?)RuntimeCache.GenericResponseCache[cache_key][url].Result;
+ }
+ else
+ {
+ Console.WriteLine($"[!!] Cached state expired at {RuntimeCache.GenericResponseCache[cache_key][url].ExpiryTime}: {RuntimeCache.GenericResponseCache[cache_key][url].Result}");
+ }
+ }
+ else
+ {
+ Console.WriteLine($"[!!] No cached state for {url}");
+ }
+
var res = await _httpClient.GetAsync(url);
if (!res.IsSuccessStatusCode)
{
if(logOnFailure) Console.WriteLine($"{RoomId}/{state_key}/{type} - got status: {res.StatusCode}");
return null;
}
- return await res.Content.ReadFromJsonAsync<JsonElement>();
+ var result = await res.Content.ReadFromJsonAsync<JsonElement>();
+ RuntimeCache.GenericResponseCache[cache_key][url] = new GenericResult<object>()
+ {
+ Result = result
+ };
+ return result;
}
public async Task<string?> GetNameAsync()
{
|