diff --git a/MatrixRoomUtils.Web/Classes/LocalStorageProviderService.cs b/MatrixRoomUtils.Web/Classes/LocalStorageProviderService.cs
index 2a9082d..256c43d 100644
--- a/MatrixRoomUtils.Web/Classes/LocalStorageProviderService.cs
+++ b/MatrixRoomUtils.Web/Classes/LocalStorageProviderService.cs
@@ -4,7 +4,23 @@ using MatrixRoomUtils.Core.Interfaces.Services;
namespace MatrixRoomUtils.Web.Classes;
public class LocalStorageProviderService : IStorageProvider {
+ private readonly ILocalStorageService _localStorageService;
+
public LocalStorageProviderService(ILocalStorageService localStorageService) {
-
+ _localStorageService = localStorageService;
}
+
+ async Task IStorageProvider.SaveAllChildrenAsync<T>(string key, T value) => throw new NotImplementedException();
+
+ async Task<T?> IStorageProvider.LoadAllChildrenAsync<T>(string key) where T : default => throw new NotImplementedException();
+
+ async Task IStorageProvider.SaveObjectAsync<T>(string key, T value) => await _localStorageService.SetItemAsync(key, value);
+
+ async Task<T?> IStorageProvider.LoadObjectAsync<T>(string key) where T : default => await _localStorageService.GetItemAsync<T>(key);
+
+ async Task<bool> IStorageProvider.ObjectExistsAsync(string key) => await _localStorageService.ContainKeyAsync(key);
+
+ async Task<List<string>> IStorageProvider.GetAllKeysAsync() => (await _localStorageService.KeysAsync()).ToList();
+
+ async Task IStorageProvider.DeleteObjectAsync(string key) => await _localStorageService.RemoveItemAsync(key);
}
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Classes/LocalStorageWrapper.cs b/MatrixRoomUtils.Web/Classes/LocalStorageWrapper.cs
deleted file mode 100644
index 59c1ab6..0000000
--- a/MatrixRoomUtils.Web/Classes/LocalStorageWrapper.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-using Blazored.LocalStorage;
-using MatrixRoomUtils.Core;
-
-namespace MatrixRoomUtils.Web.Classes;
-
-public class LocalStorageWrapper {
- private readonly SemaphoreSlim _semaphoreSlim = new(1);
- public Settings Settings { get; set; } = new();
-
- //some basic logic
- public async Task InitialiseRuntimeVariables(ILocalStorageService localStorage) {
- //RuntimeCache stuff
- // async Task Save() => await SaveToLocalStorage(localStorage);
- // async Task SaveObject(string key, object obj) => await localStorage.SetItemAsync(key, obj);
- // async Task RemoveObject(string key) => await localStorage.RemoveItemAsync(key);
- //
- // RuntimeCache.Save = Save;
- // RuntimeCache.SaveObject = SaveObject;
- // RuntimeCache.RemoveObject = RemoveObject;
- if (RuntimeCache.LastUsedToken != null) {
- Console.WriteLine("Access token is not null, creating authenticated home server");
- Console.WriteLine($"Homeserver cache: {RuntimeCache.HomeserverResolutionCache.Count} entries");
- // Console.WriteLine(RuntimeCache.HomeserverResolutionCache.ToJson());
- RuntimeCache.CurrentHomeServer = await new AuthenticatedHomeServer(RuntimeCache.LoginSessions[RuntimeCache.LastUsedToken].LoginResponse.HomeServer, RuntimeCache.LastUsedToken, null).Configure();
- Console.WriteLine("Created authenticated home server");
- }
- }
-
- public async Task LoadFromLocalStorage(ILocalStorageService localStorage) {
- await _semaphoreSlim.WaitAsync();
- if (RuntimeCache.WasLoaded) {
- _semaphoreSlim.Release();
- return;
- }
-
- Console.WriteLine("Loading from local storage...");
- Settings = await localStorage.GetItemAsync<Settings>("rory.matrixroomutils.settings") ?? new Settings();
-
- RuntimeCache.LastUsedToken = await localStorage.GetItemAsync<string>("rory.matrixroomutils.last_used_token");
- RuntimeCache.LoginSessions = await localStorage.GetItemAsync<Dictionary<string, UserInfo>>("rory.matrixroomutils.login_sessions") ?? new Dictionary<string, UserInfo>();
- RuntimeCache.HomeserverResolutionCache = await localStorage.GetItemAsync<Dictionary<string, HomeServerResolutionResult>>("rory.matrixroomutils.homeserver_resolution_cache") ?? new Dictionary<string, HomeServerResolutionResult>();
- Console.WriteLine($"[LocalStorageWrapper] Loaded {RuntimeCache.LoginSessions.Count} login sessions, {RuntimeCache.HomeserverResolutionCache.Count} homeserver resolution cache entries");
-
- //RuntimeCache.GenericResponseCache = await localStorage.GetItemAsync<Dictionary<string, ObjectCache<object>>>("rory.matrixroomutils.generic_cache") ?? new();
-
- foreach (var s in (await localStorage.KeysAsync()).Where(x => x.StartsWith("rory.matrixroomutils.generic_cache:")).ToList()) {
- Console.WriteLine($"Loading generic cache entry {s}");
- RuntimeCache.GenericResponseCache[s.Replace("rory.matrixroomutils.generic_cache:", "")] = await localStorage.GetItemAsync<ObjectCache<object>>(s);
- }
-
- await InitialiseRuntimeVariables(localStorage);
- RuntimeCache.WasLoaded = true;
- _semaphoreSlim.Release();
- }
-
- public async Task SaveToLocalStorage(ILocalStorageService localStorage) {
- Console.WriteLine("Saving to local storage...");
- await localStorage.SetItemAsync("rory.matrixroomutils.settings", Settings);
- if (RuntimeCache.LoginSessions != null) await localStorage.SetItemAsync("rory.matrixroomutils.login_sessions", RuntimeCache.LoginSessions);
- if (RuntimeCache.LastUsedToken != null) await localStorage.SetItemAsync("rory.matrixroomutils.last_used_token", RuntimeCache.LastUsedToken);
- }
-
- public async Task SaveCacheToLocalStorage(ILocalStorageService localStorage, bool awaitSave = true, bool saveGenericCache = true) {
- await localStorage.SetItemAsync("rory.matrixroomutils.homeserver_resolution_cache",
- RuntimeCache.HomeserverResolutionCache.DistinctBy(x => x.Key)
- .ToDictionary(x => x.Key, x => x.Value));
- //await localStorage.SetItemAsync("rory.matrixroomutils.generic_cache", RuntimeCache.GenericResponseCache);
- if (saveGenericCache)
- foreach (var s in RuntimeCache.GenericResponseCache.Keys) {
- var t = localStorage.SetItemAsync($"rory.matrixroomutils.generic_cache:{s}", RuntimeCache.GenericResponseCache[s]);
- if (awaitSave) await t;
- }
- }
-}
-
-public class Settings {
- public DeveloperSettings DeveloperSettings { get; set; } = new();
-}
-
-public class DeveloperSettings {
- public bool EnableLogViewers { get; set; } = false;
- public bool EnableConsoleLogging { get; set; } = true;
- public bool EnablePortableDevtools { get; set; } = false;
-}
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Classes/MRUStorageWrapper.cs b/MatrixRoomUtils.Web/Classes/MRUStorageWrapper.cs
new file mode 100644
index 0000000..41f604d
--- /dev/null
+++ b/MatrixRoomUtils.Web/Classes/MRUStorageWrapper.cs
@@ -0,0 +1,91 @@
+using MatrixRoomUtils.Core;
+using MatrixRoomUtils.Core.Responses;
+using MatrixRoomUtils.Core.Services;
+using Microsoft.AspNetCore.Components;
+
+namespace MatrixRoomUtils.Web.Classes;
+
+public class MRUStorageWrapper {
+ private readonly TieredStorageService _storageService;
+ private readonly HomeserverProviderService _homeserverProviderService;
+ private readonly NavigationManager _navigationManager;
+
+ public MRUStorageWrapper(
+ TieredStorageService storageService,
+ HomeserverProviderService homeserverProviderService,
+ NavigationManager navigationManager
+ ) {
+ _storageService = storageService;
+ _homeserverProviderService = homeserverProviderService;
+ _navigationManager = navigationManager;
+ }
+
+ public async Task<List<LoginResponse>?> GetAllTokens() {
+ return await _storageService.DataStorageProvider.LoadObjectAsync<List<LoginResponse>>("mru.tokens") ?? new List<LoginResponse>();
+ }
+ public async Task<LoginResponse?> GetCurrentToken() {
+ var currentToken = await _storageService.DataStorageProvider.LoadObjectAsync<LoginResponse>("token");
+ var allTokens = await GetAllTokens();
+ if (allTokens is null or { Count: 0 }) {
+ await SetCurrentToken(null);
+ return null;
+ }
+ if (currentToken is null) {
+ await SetCurrentToken(currentToken = allTokens[0]);
+ }
+ if(!allTokens.Any(x=>x.AccessToken == currentToken.AccessToken)) {
+ await SetCurrentToken(currentToken = allTokens[0]);
+ }
+ return currentToken;
+ }
+
+ public async Task AddToken(LoginResponse loginResponse) {
+ var tokens = await GetAllTokens();
+ if (tokens == null) {
+ tokens = new List<LoginResponse>();
+ }
+
+ tokens.Add(loginResponse);
+ await _storageService.DataStorageProvider.SaveObjectAsync("mru.tokens", tokens);
+ }
+
+ public async Task<AuthenticatedHomeServer?> GetCurrentSession() {
+ var token = await GetCurrentToken();
+ if (token == null) {
+ return null;
+ }
+
+ return await _homeserverProviderService.GetAuthenticatedWithToken(token.Homeserver, token.AccessToken);
+ }
+
+ public async Task<AuthenticatedHomeServer?> GetCurrentSessionOrNavigate() {
+ var session = await GetCurrentSession();
+ if (session == null) {
+ _navigationManager.NavigateTo("/Login");
+ }
+ return session;
+ }
+ public class Settings {
+ public DeveloperSettings DeveloperSettings { get; set; } = new();
+ }
+
+ public class DeveloperSettings {
+ public bool EnableLogViewers { get; set; } = false;
+ public bool EnableConsoleLogging { get; set; } = true;
+ public bool EnablePortableDevtools { get; set; } = false;
+ }
+
+ public async Task RemoveToken(LoginResponse auth) {
+ var tokens = await GetAllTokens();
+ if (tokens == null) {
+ return;
+ }
+
+ tokens.RemoveAll(x=>x.AccessToken == auth.AccessToken);
+ await _storageService.DataStorageProvider.SaveObjectAsync("mru.tokens", tokens);
+ }
+
+ public async Task SetCurrentToken(LoginResponse? auth) {
+ _storageService.DataStorageProvider.SaveObjectAsync("token", auth);
+ }
+}
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Classes/RoomCreationTemplates/DefaultRoomCreationTemplate.cs b/MatrixRoomUtils.Web/Classes/RoomCreationTemplates/DefaultRoomCreationTemplate.cs
index 4a31928..ca6345f 100644
--- a/MatrixRoomUtils.Web/Classes/RoomCreationTemplates/DefaultRoomCreationTemplate.cs
+++ b/MatrixRoomUtils.Web/Classes/RoomCreationTemplates/DefaultRoomCreationTemplate.cs
@@ -15,25 +15,25 @@ public class DefaultRoomCreationTemplate : IRoomCreationTemplate {
InitialState = new List<StateEvent> {
new() {
Type = "m.room.history_visibility",
- Content = new {
+ TypedContent = new {
history_visibility = "world_readable"
}
},
- new StateEvent<GuestAccessData> {
+ new() {
Type = "m.room.guest_access",
- Content = new GuestAccessData {
+ TypedContent = new GuestAccessData {
GuestAccess = "can_join"
}
},
new() {
Type = "m.room.join_rules",
- Content = new {
- join_rule = "public"
+ TypedContent = new JoinRulesEventData() {
+ JoinRule = "public"
}
},
new() {
Type = "m.room.server_acl",
- Content = new {
+ TypedContent = new {
allow = new[] { "*" },
deny = Array.Empty<string>(),
allow_ip_literals = false
@@ -41,8 +41,8 @@ public class DefaultRoomCreationTemplate : IRoomCreationTemplate {
},
new() {
Type = "m.room.avatar",
- Content = new {
- url = "mxc://feline.support/UKNhEyrVsrAbYteVvZloZcFj"
+ TypedContent = new RoomAvatarEventData() {
+ Url = "mxc://feline.support/UKNhEyrVsrAbYteVvZloZcFj"
}
}
},
@@ -78,7 +78,8 @@ public class DefaultRoomCreationTemplate : IRoomCreationTemplate {
{ "org.matrix.msc3401.call.member", 50 }
},
Users = new Dictionary<string, int> {
- { RuntimeCache.CurrentHomeServer.UserId, 100 }
+ // { RuntimeCache.CurrentHomeServer.UserId, 100 }
+ //TODO: re-implement this
}
},
CreationContent = new JsonObject {
|