about summary refs log tree commit diff
path: root/MatrixRoomUtils.Web
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixRoomUtils.Web')
-rw-r--r--MatrixRoomUtils.Web/Classes/LocalStorageProviderService.cs6
-rw-r--r--MatrixRoomUtils.Web/Classes/MRUStorageWrapper.cs13
-rw-r--r--MatrixRoomUtils.Web/Classes/RoomCreationTemplates/DefaultRoomCreationTemplate.cs4
-rw-r--r--MatrixRoomUtils.Web/Classes/RoomInfo.cs4
-rw-r--r--MatrixRoomUtils.Web/Classes/SessionStorageProviderService.cs6
-rw-r--r--MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor3
-rw-r--r--MatrixRoomUtils.Web/Pages/Index.razor9
-rw-r--r--MatrixRoomUtils.Web/Pages/InvalidSession.razor17
-rw-r--r--MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor8
-rw-r--r--MatrixRoomUtils.Web/Pages/MediaLocator.razor3
-rw-r--r--MatrixRoomUtils.Web/Pages/ModalTest.razor8
-rw-r--r--MatrixRoomUtils.Web/Pages/Rooms/Create.razor13
-rw-r--r--MatrixRoomUtils.Web/Pages/Rooms/Index.razor46
-rw-r--r--MatrixRoomUtils.Web/Pages/Rooms/PolicyList.razor2
-rw-r--r--MatrixRoomUtils.Web/Pages/Rooms/Space.razor32
-rw-r--r--MatrixRoomUtils.Web/Pages/Rooms/StateEditor.razor14
-rw-r--r--MatrixRoomUtils.Web/Pages/Rooms/StateViewer.razor12
-rw-r--r--MatrixRoomUtils.Web/Pages/Rooms/Timeline.razor2
-rw-r--r--MatrixRoomUtils.Web/Program.cs2
-rw-r--r--MatrixRoomUtils.Web/Shared/EditablePre.razor5
-rw-r--r--MatrixRoomUtils.Web/Shared/InlineUserItem.razor2
-rw-r--r--MatrixRoomUtils.Web/Shared/ModalWindow.razor14
-rw-r--r--MatrixRoomUtils.Web/Shared/RoomList.razor2
-rw-r--r--MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListCategory.razor10
-rw-r--r--MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListSpace.razor9
-rw-r--r--MatrixRoomUtils.Web/Shared/RoomListItem.razor2
-rw-r--r--MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor44
-rw-r--r--MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMessageItem.razor2
-rw-r--r--MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomCreateItem.razor2
29 files changed, 151 insertions, 145 deletions
diff --git a/MatrixRoomUtils.Web/Classes/LocalStorageProviderService.cs b/MatrixRoomUtils.Web/Classes/LocalStorageProviderService.cs
index 02d691a..51aee12 100644
--- a/MatrixRoomUtils.Web/Classes/LocalStorageProviderService.cs
+++ b/MatrixRoomUtils.Web/Classes/LocalStorageProviderService.cs
@@ -10,9 +10,11 @@ public class LocalStorageProviderService : IStorageProvider {
         _localStorageService = localStorageService;
     }
 
-    async Task IStorageProvider.SaveAllChildrenAsync<T>(string key, T value) => throw new NotImplementedException();
+    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();
+    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);
 
diff --git a/MatrixRoomUtils.Web/Classes/MRUStorageWrapper.cs b/MatrixRoomUtils.Web/Classes/MRUStorageWrapper.cs
index e9d56b9..14625fd 100644
--- a/MatrixRoomUtils.Web/Classes/MRUStorageWrapper.cs
+++ b/MatrixRoomUtils.Web/Classes/MRUStorageWrapper.cs
@@ -45,10 +45,7 @@ public class MRUStorageWrapper {
     }
 
     public async Task AddToken(LoginResponse loginResponse) {
-        var tokens = await GetAllTokens();
-        if (tokens == null) {
-            tokens = new List<LoginResponse>();
-        }
+        var tokens = await GetAllTokens() ?? new List<LoginResponse>();
 
         tokens.Add(loginResponse);
         await _storageService.DataStorageProvider.SaveObjectAsync("mru.tokens", tokens);
@@ -92,9 +89,9 @@ public class MRUStorageWrapper {
     }
 
     public class DeveloperSettings {
-        public bool EnableLogViewers { get; set; } = false;
+        public bool EnableLogViewers { get; set; }
         public bool EnableConsoleLogging { get; set; } = true;
-        public bool EnablePortableDevtools { get; set; } = false;
+        public bool EnablePortableDevtools { get; set; }
     }
 
     public async Task RemoveToken(LoginResponse auth) {
@@ -107,7 +104,5 @@ public class MRUStorageWrapper {
         await _storageService.DataStorageProvider.SaveObjectAsync("mru.tokens", tokens);
     }
 
-    public async Task SetCurrentToken(LoginResponse? auth) {
-        _storageService.DataStorageProvider.SaveObjectAsync("token", auth);
-    }
+    public async Task SetCurrentToken(LoginResponse? auth) => await _storageService.DataStorageProvider.SaveObjectAsync("token", auth);
 }
diff --git a/MatrixRoomUtils.Web/Classes/RoomCreationTemplates/DefaultRoomCreationTemplate.cs b/MatrixRoomUtils.Web/Classes/RoomCreationTemplates/DefaultRoomCreationTemplate.cs
index b6f6d56..bb2eab9 100644
--- a/MatrixRoomUtils.Web/Classes/RoomCreationTemplates/DefaultRoomCreationTemplate.cs
+++ b/MatrixRoomUtils.Web/Classes/RoomCreationTemplates/DefaultRoomCreationTemplate.cs
@@ -28,7 +28,7 @@ public class DefaultRoomCreationTemplate : IRoomCreationTemplate {
                 },
                 new() {
                     Type = "m.room.join_rules",
-                    TypedContent = new JoinRulesEventData() {
+                    TypedContent = new JoinRulesEventData {
                         JoinRule = "public"
                     }
                 },
@@ -42,7 +42,7 @@ public class DefaultRoomCreationTemplate : IRoomCreationTemplate {
                 },
                 new() {
                     Type = "m.room.avatar",
-                    TypedContent = new RoomAvatarEventData() {
+                    TypedContent = new RoomAvatarEventData {
                         Url = "mxc://feline.support/UKNhEyrVsrAbYteVvZloZcFj"
                     }
                 }
diff --git a/MatrixRoomUtils.Web/Classes/RoomInfo.cs b/MatrixRoomUtils.Web/Classes/RoomInfo.cs
index 4df81ec..111bfe0 100644
--- a/MatrixRoomUtils.Web/Classes/RoomInfo.cs
+++ b/MatrixRoomUtils.Web/Classes/RoomInfo.cs
@@ -11,10 +11,10 @@ public class RoomInfo {
     public async Task<StateEventResponse?> GetStateEvent(string type, string stateKey = "") {
         var @event = StateEvents.FirstOrDefault(x => x.Type == type && x.StateKey == stateKey);
         if (@event is not null) return @event;
-        @event = new StateEventResponse() {
+        @event = new StateEventResponse {
             RoomId = Room.RoomId,
             Type = type,
-            StateKey = stateKey,
+            StateKey = stateKey
         };
         try {
             @event.TypedContent = await Room.GetStateAsync<object>(type, stateKey);
diff --git a/MatrixRoomUtils.Web/Classes/SessionStorageProviderService.cs b/MatrixRoomUtils.Web/Classes/SessionStorageProviderService.cs
index 6f11cad..a923015 100644
--- a/MatrixRoomUtils.Web/Classes/SessionStorageProviderService.cs
+++ b/MatrixRoomUtils.Web/Classes/SessionStorageProviderService.cs
@@ -10,9 +10,11 @@ public class SessionStorageProviderService : IStorageProvider {
         _sessionStorageService = sessionStorage;
     }
 
-    async Task IStorageProvider.SaveAllChildrenAsync<T>(string key, T value) => throw new NotImplementedException();
+    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();
+    Task<T?> IStorageProvider.LoadAllChildrenAsync<T>(string key) where T : default => throw new NotImplementedException();
 
     async Task IStorageProvider.SaveObjectAsync<T>(string key, T value) => await _sessionStorageService.SetItemAsync(key, value);
 
diff --git a/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor b/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor
index b2928ee..679f324 100644
--- a/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor
+++ b/MatrixRoomUtils.Web/Pages/HSAdmin/RoomQuery.razor
@@ -158,10 +158,11 @@
 
     public LocalRoomQueryFilter Filter { get; set; } = new();
 
-    protected override async Task OnParametersSetAsync() {
+    protected override Task OnParametersSetAsync() {
         if (Ascending == null)
             Ascending = true;
         OrderBy ??= "name";
+        return Task.CompletedTask;
     }
 
     private async Task Search() {
diff --git a/MatrixRoomUtils.Web/Pages/Index.razor b/MatrixRoomUtils.Web/Pages/Index.razor
index 65ba68b..1004ee3 100644
--- a/MatrixRoomUtils.Web/Pages/Index.razor
+++ b/MatrixRoomUtils.Web/Pages/Index.razor
@@ -15,16 +15,15 @@ Small collection of tools to do not-so-everyday things.
 <form>
     @foreach (var (auth, user) in _users.OrderByDescending(x=>x.Value.RoomCount)) {
         var _auth = auth;
-        var _user = user;
         <div style="margin-bottom: 1em;">
-            <img style="border-radius: 50%; height: 3em; width: 3em;" src="@_user.AvatarUrl"/>
+            <img style="border-radius: 50%; height: 3em; width: 3em;" src="@user.AvatarUrl"/>
             <p style="margin-left: 1em; margin-top: -0.5em; display: inline-block;">
                 <input type="radio" name="csa" checked="@(_currentSession.AccessToken == _auth.AccessToken)" @onclick="@(()=>SwitchSession(_auth))" style="text-decoration-line: unset;"/>
-                <b>@_user.DisplayName</b> on <b>@_auth.Homeserver</b>
+                <b>@user.DisplayName</b> on <b>@_auth.Homeserver</b>
                 <a role="button" @onclick="@(() => RemoveUser(_auth))">Remove</a>
 
             </p>
-            <p style="margin-top: -1.5em; margin-left: 4em;">Member of @_user.RoomCount rooms</p>
+            <p style="margin-top: -1.5em; margin-left: 4em;">Member of @user.RoomCount rooms</p>
 
         </div>
     }
@@ -69,7 +68,7 @@ Small collection of tools to do not-so-everyday things.
     private class UserInfo {
         internal string AvatarUrl { get; set; }
         internal string DisplayName { get; set; }
-        internal int RoomCount { get; set; } = 0;
+        internal int RoomCount { get; set; }
     }
 
     private async Task RemoveUser(LoginResponse auth) {
diff --git a/MatrixRoomUtils.Web/Pages/InvalidSession.razor b/MatrixRoomUtils.Web/Pages/InvalidSession.razor
index 2b030ce..f555be5 100644
--- a/MatrixRoomUtils.Web/Pages/InvalidSession.razor
+++ b/MatrixRoomUtils.Web/Pages/InvalidSession.razor
@@ -23,6 +23,9 @@
         </ModalWindow>
     }
 }
+else {
+    <b>Something has gone wrong and the login was not passed along!</b>
+}
 
 @code
 {
@@ -30,13 +33,13 @@
     [SupplyParameterFromQuery(Name = "ctx")]
     public string Context { get; set; }
 
-    private LoginResponse _login { get; set; }
+    private LoginResponse? _login { get; set; }
 
-    private bool _showRefreshDialog { get; set; } = false;
+    private bool _showRefreshDialog { get; set; }
 
     private string _password { get; set; } = "";
 
-    private MatrixException _loginException { get; set; }
+    private MatrixException? _loginException { get; set; }
 
     protected override async Task OnInitializedAsync() {
         var tokens = await MRUStorage.GetAllTokens();
@@ -55,15 +58,16 @@
     }
 
     private async Task RemoveUser() {
-        await MRUStorage.RemoveToken(_login);
-        if ((await MRUStorage.GetCurrentToken()).AccessToken == _login.AccessToken)
-            MRUStorage.SetCurrentToken((await MRUStorage.GetAllTokens()).FirstOrDefault());
+        await MRUStorage.RemoveToken(_login!);
+        if ((await MRUStorage.GetCurrentToken())!.AccessToken == _login!.AccessToken)
+            await MRUStorage.SetCurrentToken((await MRUStorage.GetAllTokens())?.FirstOrDefault());
         await OnInitializedAsync();
     }
 
     private async Task OpenRefreshDialog() {
         _showRefreshDialog = true;
         StateHasChanged();
+        await Task.CompletedTask;
     }
 
     private async Task SwitchSession(LoginResponse auth) {
@@ -73,6 +77,7 @@
     }
 
     private async Task TryLogin() {
+        if(_login is null) throw new NullReferenceException("Login is null!");
         try {
             var result = await HomeserverProvider.Login(_login.Homeserver, _login.UserId, _password);
             if (result is null) {
diff --git a/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor b/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor
index 10a2929..22a004d 100644
--- a/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor
+++ b/MatrixRoomUtils.Web/Pages/KnownHomeserverList.razor
@@ -78,10 +78,10 @@ else {
             await foreach (var state in states) {
                 if (state.Type is not "m.room.member") continue;
                 progress.ProcessedUsers[room].Total++;
-                if (!homeServers.Any(x => x.Server == state.StateKey.Split(':')[1])) {
-                    homeServers.Add(new HomeServerInfo { Server = state.StateKey.Split(':')[1] });
-                    Console.WriteLine($"Added new homeserver {state.StateKey.Split(':')[1]}");
-                }
+
+                if (homeServers.Any(x => x.Server == state.StateKey.Split(':')[1])) continue;
+                homeServers.Add(new HomeServerInfo { Server = state.StateKey.Split(':')[1] });
+                Console.WriteLine($"Added new homeserver {state.StateKey.Split(':')[1]}");
             }
             semaphore.Release();
             progress.ProcessedUsers[room].IsFinished = true;
diff --git a/MatrixRoomUtils.Web/Pages/MediaLocator.razor b/MatrixRoomUtils.Web/Pages/MediaLocator.razor
index 8c41440..af6e67a 100644
--- a/MatrixRoomUtils.Web/Pages/MediaLocator.razor
+++ b/MatrixRoomUtils.Web/Pages/MediaLocator.razor
@@ -56,7 +56,7 @@
         });
     }
 
-    async Task executeSearch() {
+    Task executeSearch() {
         var sem = new SemaphoreSlim(128, 128);
         homeservers.ForEach(async hs => {
             await sem.WaitAsync();
@@ -80,6 +80,7 @@
             }
             StateHasChanged();
         });
+        return Task.CompletedTask;
     }
 
     async Task addMoreHomeservers() {
diff --git a/MatrixRoomUtils.Web/Pages/ModalTest.razor b/MatrixRoomUtils.Web/Pages/ModalTest.razor
index 79c7fcd..2b1c9bc 100644
--- a/MatrixRoomUtils.Web/Pages/ModalTest.razor
+++ b/MatrixRoomUtils.Web/Pages/ModalTest.razor
@@ -5,10 +5,10 @@
 @foreach (var (key, value) in _windowInfos) {
    @* <ModalWindow X="@value.X" Y="@value.Y" Title="@value.Title">@value.Content</ModalWindow> *@
 }
-@for (int i = 0; i < 5; i++) {
+@for (var i = 0; i < 5; i++) {
      var i1 = i;
      <ModalWindow X="@Random.Shared.Next(1400)" Y="@Random.Shared.Next(1000)" Title="@("Window " + i1)" OnCloseClicked="() => OnCloseClicked(i1)">
-          @for (int j = 0; j < i1; j++) {
+          @for (var j = 0; j < i1; j++) {
               <h1>@j</h1>
           } 
      </ModalWindow>
@@ -31,9 +31,9 @@
         double _y = 0;
         double multiplier = 1;
 
-        for (int i = 0; i < 200; i++) {
+        for (var i = 0; i < 200; i++) {
             var i1 = i;
-            _windowInfos.Add(_windowInfos.Count, new WindowInfo() {
+            _windowInfos.Add(_windowInfos.Count, new WindowInfo {
                 X = _x,
                 Y = _y,
                 Title = "Win" + i1,
diff --git a/MatrixRoomUtils.Web/Pages/Rooms/Create.razor b/MatrixRoomUtils.Web/Pages/Rooms/Create.razor
index ebf6444..3b7d000 100644
--- a/MatrixRoomUtils.Web/Pages/Rooms/Create.razor
+++ b/MatrixRoomUtils.Web/Pages/Rooms/Create.razor
@@ -131,7 +131,7 @@
             <td>
                 @if (serverAcl?.Allow is null) {
                     <p>No allow rules exist!</p>
-                    <button @onclick="@(() => { serverAcl.Allow = new() { "*" }; })">Create sane defaults</button>
+                    <button @onclick="@(() => { serverAcl.Allow = new List<string> { "*" }; })">Create sane defaults</button>
                 }
                 else {
                     <details>
@@ -141,7 +141,7 @@
                 }
                 @if (serverAcl?.Deny is null) {
                     <p>No deny rules exist!</p>
-                    <button @onclick="@(() => { serverAcl.Allow = new(); })">Create sane defaults</button>
+                    <button @onclick="@(() => { serverAcl.Allow = new List<string>(); })">Create sane defaults</button>
                 }
                 else {
                     <details>
@@ -240,12 +240,7 @@
 @code {
 
     private string RoomPreset {
-        get {
-            if (Presets.ContainsValue(creationEvent)) {
-                return Presets.First(x => x.Value == creationEvent).Key;
-            }
-            return "Not a preset";
-        }
+        get => Presets.ContainsValue(creationEvent) ? Presets.First(x => x.Value == creationEvent).Key : "Not a preset";
         set {
             creationEvent = Presets[value];
             JsonChanged();
@@ -310,7 +305,7 @@
             creationEvent.InitialState.Add(new StateEvent {
                 Type = "m.room.member",
                 StateKey = mxid,
-                TypedContent = new RoomMemberEventData() {
+                TypedContent = new RoomMemberEventData {
                     Membership = "invite",
                     Reason = "Automatically invited at room creation time."
                 }
diff --git a/MatrixRoomUtils.Web/Pages/Rooms/Index.razor b/MatrixRoomUtils.Web/Pages/Rooms/Index.razor
index 89ededf..ad3a714 100644
--- a/MatrixRoomUtils.Web/Pages/Rooms/Index.razor
+++ b/MatrixRoomUtils.Web/Pages/Rooms/Index.razor
@@ -19,25 +19,25 @@
     private ProfileResponseEventData GlobalProfile { get; set; }
 
     private SyncFilter filter = new() {
-        AccountData = new() {
-            NotTypes = new() { "*" },
+        AccountData = new SyncFilter.EventFilter {
+            NotTypes = new List<string> { "*" },
             Limit = 1
         },
-        Presence = new() {
-            NotTypes = new() { "*" },
+        Presence = new SyncFilter.EventFilter {
+            NotTypes = new List<string> { "*" },
             Limit = 1
         },
-        Room = new() {
-            AccountData = new() {
-                NotTypes = new() { "*" },
+        Room = new SyncFilter.RoomFilter {
+            AccountData = new SyncFilter.RoomFilter.StateFilter {
+                NotTypes = new List<string> { "*" },
                 Limit = 1
             },
-            Ephemeral = new() {
-                NotTypes = new() { "*" },
+            Ephemeral = new SyncFilter.RoomFilter.StateFilter {
+                NotTypes = new List<string> { "*" },
                 Limit = 1
             },
-            State = new() {
-                Types = new List<string>() {
+            State = new SyncFilter.RoomFilter.StateFilter {
+                Types = new List<string> {
                     "m.room.name",
                     "m.room.avatar",
                     "m.room.create",
@@ -45,8 +45,8 @@
                     "m.room.power_levels"
                 }
             },
-            Timeline = new() {
-                NotTypes = new() { "*" },
+            Timeline = new SyncFilter.RoomFilter.StateFilter {
+                NotTypes = new List<string> { "*" },
                 Limit = 1
             }
         }
@@ -74,9 +74,9 @@
                     room = Rooms.First(x => x.Room.RoomId == roomId);
                 }
                 else {
-                    room = new RoomInfo() {
+                    room = new RoomInfo {
                         Room = await hs.GetRoom(roomId),
-                        StateEvents = new()
+                        StateEvents = new List<StateEventResponse?>()
                     };
                     Rooms.Add(room);
                     KnownRooms.Add(room);
@@ -91,23 +91,23 @@
         Status = "Sync complete!";
         foreach (var roomInfo in Rooms) {
             if (!roomInfo.StateEvents.Any(x => x.Type == "m.room.name")) {
-                roomInfo.StateEvents.Add(new StateEventResponse() {
+                roomInfo.StateEvents.Add(new StateEventResponse {
                     Type = "m.room.name",
-                    TypedContent = new RoomNameEventData() {
+                    TypedContent = new RoomNameEventData {
                         Name = roomInfo.Room.RoomId
                     }
                 });
             }
             if (!roomInfo.StateEvents.Any(x => x.Type == "m.room.avatar")) {
-                roomInfo.StateEvents.Add(new StateEventResponse() {
+                roomInfo.StateEvents.Add(new StateEventResponse {
                     Type = "m.room.avatar",
-                    TypedContent = new RoomAvatarEventData() {
+                    TypedContent = new RoomAvatarEventData {
 
                     }
                 });
             }
             if (!roomInfo.StateEvents.Any(x => x.Type == "org.matrix.mjolnir.shortcode")) {
-                roomInfo.StateEvents.Add(new StateEventResponse() {
+                roomInfo.StateEvents.Add(new StateEventResponse {
                     Type = "org.matrix.mjolnir.shortcode"
                 });
             }
@@ -118,10 +118,10 @@
         var memberTasks = Rooms.Select(async roomInfo => {
             if (!roomInfo.StateEvents.Any(x => x.Type == "m.room.member" && x.StateKey == hs.WhoAmI.UserId)) {
                 await semaphore.WaitAsync();
-                roomInfo.StateEvents.Add(new StateEventResponse() {
+                roomInfo.StateEvents.Add(new StateEventResponse {
                     Type = "m.room.member",
                     StateKey = hs.WhoAmI.UserId,
-                    TypedContent = await roomInfo.Room.GetStateAsync<RoomMemberEventData>("m.room.member", hs.WhoAmI.UserId) ?? new RoomMemberEventData() {
+                    TypedContent = await roomInfo.Room.GetStateAsync<RoomMemberEventData>("m.room.member", hs.WhoAmI.UserId) ?? new RoomMemberEventData {
                         Membership = "unknown"
                     }
                 });
@@ -148,7 +148,7 @@
         await base.OnInitializedAsync();
     }
 
-    private bool RenderContents { get; set; } = false;
+    private bool RenderContents { get; set; }
 
     private string _status;
 
diff --git a/MatrixRoomUtils.Web/Pages/Rooms/PolicyList.razor b/MatrixRoomUtils.Web/Pages/Rooms/PolicyList.razor
index 3297bcb..2b31389 100644
--- a/MatrixRoomUtils.Web/Pages/Rooms/PolicyList.razor
+++ b/MatrixRoomUtils.Web/Pages/Rooms/PolicyList.razor
@@ -114,7 +114,7 @@ else {
             @foreach (var policyEvent in PolicyEvents.Where(x => x.Type == "m.policy.rule.room" && (x.TypedContent as PolicyRuleStateEventData).Entity == null)) {
                 <tr>
                     <td>@policyEvent.StateKey</td>
-                    <td>@policyEvent.RawContent.ToJson(false, true)</td>
+                    <td>@policyEvent.RawContent!.ToJson(false, true)</td>
                 </tr>
             }
             </tbody>
diff --git a/MatrixRoomUtils.Web/Pages/Rooms/Space.razor b/MatrixRoomUtils.Web/Pages/Rooms/Space.razor
index 15c7c70..c37b8ab 100644
--- a/MatrixRoomUtils.Web/Pages/Rooms/Space.razor
+++ b/MatrixRoomUtils.Web/Pages/Rooms/Space.razor
@@ -39,17 +39,21 @@
 
         var state = Room.GetFullStateAsync();
         await foreach (var stateEvent in state) {
-            if (stateEvent.Type == "m.space.child") {
-                var roomId = stateEvent.StateKey;
-                var room = await hs.GetRoom(roomId);
-                if (room is not null) {
-                    Rooms.Add(room);
+            switch (stateEvent.Type) {
+                case "m.space.child": {
+                    var roomId = stateEvent.StateKey;
+                    var room = await hs.GetRoom(roomId);
+                    if (room is not null) {
+                        Rooms.Add(room);
+                    }
+                    break;
                 }
-            }
-            else if (stateEvent.Type == "m.room.member") {
-                var serverName = stateEvent.StateKey.Split(':').Last();
-                if (!ServersInSpace.Contains(serverName)) {
-                    ServersInSpace.Add(serverName);
+                case "m.room.member": {
+                    var serverName = stateEvent.StateKey.Split(':').Last();
+                    if (!ServersInSpace.Contains(serverName)) {
+                        ServersInSpace.Add(serverName);
+                    }
+                    break;
                 }
             }
         }
@@ -89,10 +93,10 @@
     // await base.OnInitializedAsync();
     }
 
-    private async Task JoinAllRooms() {
-        foreach (var room in Rooms) {
-            room.JoinAsync(ServersInSpace.ToArray());
-        }
+    private Task JoinAllRooms() {
+        List<Task> tasks = Rooms.Select(room => room.JoinAsync(ServersInSpace.ToArray())).ToList();
+        Task.WaitAll(tasks.ToArray());
+        return Task.CompletedTask;
     }
 
 }
diff --git a/MatrixRoomUtils.Web/Pages/Rooms/StateEditor.razor b/MatrixRoomUtils.Web/Pages/Rooms/StateEditor.razor
index e01fca8..ef7cd51 100644
--- a/MatrixRoomUtils.Web/Pages/Rooms/StateEditor.razor
+++ b/MatrixRoomUtils.Web/Pages/Rooms/StateEditor.razor
@@ -73,12 +73,12 @@
                 FilteredEvents.Add(_ev);
             }
             StateLoaded++;
-            if ((DateTime.Now - _lastUpdate).TotalMilliseconds > 100) {
-                _lastUpdate = DateTime.Now;
-                status = $"Loaded {StateLoaded} state events";
-                StateHasChanged();
-                await Task.Delay(0);
-            }
+
+            if (!((DateTime.Now - _lastUpdate).TotalMilliseconds > 100)) continue;
+            _lastUpdate = DateTime.Now;
+            status = $"Loaded {StateLoaded} state events";
+            StateHasChanged();
+            await Task.Delay(0);
         }
 
         StateHasChanged();
@@ -98,7 +98,7 @@
         FilteredEvents = _FilteredEvents;
 
         if (_shownType is not null)
-            shownEventJson = _FilteredEvents.Where(x => x.Type == _shownType).First().RawContent.ToJson(indent: true, ignoreNull: true);
+            shownEventJson = _FilteredEvents.First(x => x.Type == _shownType).RawContent.ToJson(indent: true, ignoreNull: true);
 
         StateHasChanged();
     }
diff --git a/MatrixRoomUtils.Web/Pages/Rooms/StateViewer.razor b/MatrixRoomUtils.Web/Pages/Rooms/StateViewer.razor
index cf23c36..5a48b32 100644
--- a/MatrixRoomUtils.Web/Pages/Rooms/StateViewer.razor
+++ b/MatrixRoomUtils.Web/Pages/Rooms/StateViewer.razor
@@ -91,12 +91,12 @@
                 FilteredEvents.Add(_ev);
             }
             StateLoaded++;
-            if ((DateTime.Now - _lastUpdate).TotalMilliseconds > 100) {
-                _lastUpdate = DateTime.Now;
-                status = $"Loaded {StateLoaded} state events";
-                StateHasChanged();
-                await Task.Delay(0);
-            }
+
+            if (!((DateTime.Now - _lastUpdate).TotalMilliseconds > 100)) continue;
+            _lastUpdate = DateTime.Now;
+            status = $"Loaded {StateLoaded} state events";
+            StateHasChanged();
+            await Task.Delay(0);
         }
 
         StateHasChanged();
diff --git a/MatrixRoomUtils.Web/Pages/Rooms/Timeline.razor b/MatrixRoomUtils.Web/Pages/Rooms/Timeline.razor
index 7fe89cc..4a5298b 100644
--- a/MatrixRoomUtils.Web/Pages/Rooms/Timeline.razor
+++ b/MatrixRoomUtils.Web/Pages/Rooms/Timeline.razor
@@ -45,7 +45,7 @@
 
     private StateEventResponse GetProfileEventBefore(StateEventResponse Event) => Events.TakeWhile(x => x != Event).Last(e => e.Type == "m.room.member" && e.StateKey == Event.Sender);
 
-    private Type ComponentType(StateEventResponse Event) => Event.TypedContent switch {
+    private Type ComponentType(StateEvent Event) => Event.TypedContent switch {
         RoomMessageEventData => typeof(TimelineMessageItem),
         RoomMemberEventData => typeof(TimelineMemberItem),
         _ => typeof(TimelineUnknownItem)
diff --git a/MatrixRoomUtils.Web/Program.cs b/MatrixRoomUtils.Web/Program.cs
index c760108..a670378 100644
--- a/MatrixRoomUtils.Web/Program.cs
+++ b/MatrixRoomUtils.Web/Program.cs
@@ -33,7 +33,7 @@ builder.Services.AddBlazoredSessionStorage(config => {
 });
 
 builder.Services.AddScoped<TieredStorageService>(x =>
-    new(
+    new TieredStorageService(
         cacheStorageProvider: new SessionStorageProviderService(x.GetRequiredService<ISessionStorageService>()),
         dataStorageProvider: new LocalStorageProviderService(x.GetRequiredService<ILocalStorageService>())
     )
diff --git a/MatrixRoomUtils.Web/Shared/EditablePre.razor b/MatrixRoomUtils.Web/Shared/EditablePre.razor
index e759015..acb477c 100644
--- a/MatrixRoomUtils.Web/Shared/EditablePre.razor
+++ b/MatrixRoomUtils.Web/Shared/EditablePre.razor
@@ -11,6 +11,9 @@
 
     public object Id { get; set; }
 
-    private async Task Callback() => Console.WriteLine("beep");
+    private Task Callback() {
+        Console.WriteLine("beep");
+        return Task.CompletedTask;
+    }
 
 }
\ No newline at end of file
diff --git a/MatrixRoomUtils.Web/Shared/InlineUserItem.razor b/MatrixRoomUtils.Web/Shared/InlineUserItem.razor
index f3a7162..db66309 100644
--- a/MatrixRoomUtils.Web/Shared/InlineUserItem.razor
+++ b/MatrixRoomUtils.Web/Shared/InlineUserItem.razor
@@ -50,7 +50,7 @@
             throw new ArgumentNullException(nameof(UserId));
 
         if (MemberEvent != null) {
-            User = new() {
+            User = new ProfileResponseEventData {
                 AvatarUrl = MemberEvent.AvatarUrl,
                 DisplayName = MemberEvent.DisplayName
             };
diff --git a/MatrixRoomUtils.Web/Shared/ModalWindow.razor b/MatrixRoomUtils.Web/Shared/ModalWindow.razor
index 2f001e1..beb7198 100644
--- a/MatrixRoomUtils.Web/Shared/ModalWindow.razor
+++ b/MatrixRoomUtils.Web/Shared/ModalWindow.razor
@@ -74,13 +74,13 @@
     }
 
     private void MouseMove(MouseEventArgs obj) {
-        if (isDragging) {
-            _x += obj.ClientX - dragX;
-            _y += obj.ClientY - dragY;
-            dragX = obj.ClientX;
-            dragY = obj.ClientY;
-            StateHasChanged();
-        }
+        if (!isDragging) return;
+
+        _x += obj.ClientX - dragX;
+        _y += obj.ClientY - dragY;
+        dragX = obj.ClientX;
+        dragY = obj.ClientY;
+        StateHasChanged();
     }
 
 }
diff --git a/MatrixRoomUtils.Web/Shared/RoomList.razor b/MatrixRoomUtils.Web/Shared/RoomList.razor
index dc06d90..3b057a4 100644
--- a/MatrixRoomUtils.Web/Shared/RoomList.razor
+++ b/MatrixRoomUtils.Web/Shared/RoomList.razor
@@ -51,7 +51,7 @@ else {
         await _semaphoreSlim.WaitAsync();
         string roomType;
         try {
-            RoomCreateEventData createEvent = (await room.GetStateEvent("m.room.create")).TypedContent as RoomCreateEventData;
+            var createEvent = (await room.GetStateEvent("m.room.create")).TypedContent as RoomCreateEventData;
             roomType = GetRoomTypeName(createEvent.Type);
 
             if (roomType == "Room") {
diff --git a/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListCategory.razor b/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListCategory.razor
index c04df3f..381ecd1 100644
--- a/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListCategory.razor
+++ b/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListCategory.razor
@@ -38,13 +38,11 @@
     private List<RoomInfo> rooms => Category.Value;
 
     private int RoomVersionDangerLevel(RoomInfo room) {
-        var roomVersion = room.StateEvents.FirstOrDefault(x=>x.Type == "m.room.create");
+        var roomVersion = room.StateEvents.FirstOrDefault(x => x.Type == "m.room.create");
         if (roomVersion is null) return 0;
-        var roomVersionContent = roomVersion.TypedContent as RoomCreateEventData;
-        if (roomVersionContent is null) return 0;
-        if (RoomConstants.DangerousRoomVersions.Contains(roomVersionContent.RoomVersion)) return 2;
-        if (roomVersionContent.RoomVersion != RoomConstants.RecommendedRoomVersion) return 1;
-        return 0;
+        return roomVersion.TypedContent is not RoomCreateEventData roomVersionContent ? 0
+            : RoomConstants.DangerousRoomVersions.Contains(roomVersionContent.RoomVersion) ? 2
+                : roomVersionContent.RoomVersion != RoomConstants.RecommendedRoomVersion ? 1 : 0;
     }
 
 }
diff --git a/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListSpace.razor b/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListSpace.razor
index a113f0b..0867b48 100644
--- a/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListSpace.razor
+++ b/MatrixRoomUtils.Web/Shared/RoomListComponents/RoomListSpace.razor
@@ -33,9 +33,9 @@
         var rooms = Space.Room.AsSpace.GetRoomsAsync();
         await foreach (var room in rooms) {
             if (Breadcrumbs.Contains(room.RoomId)) continue;
-            RoomInfo roomInfo = KnownRooms.FirstOrDefault(x => x.Room.RoomId == room.RoomId);
+            var roomInfo = KnownRooms.FirstOrDefault(x => x.Room.RoomId == room.RoomId);
             if (roomInfo is null) {
-                roomInfo = new() {
+                roomInfo = new RoomInfo {
                     Room = room
                 };
                 KnownRooms.Add(roomInfo);
@@ -48,10 +48,11 @@
     private bool _shouldRenderChildren = false;
     private string? _breadcrumbs;
 
-    private async Task SpaceChildrenOpened() {
-        if (_shouldRenderChildren) return;
+    private Task SpaceChildrenOpened() {
+        if (_shouldRenderChildren) return Task.CompletedTask;
         _shouldRenderChildren = true;
         Console.WriteLine($"[RoomList] Rendering children of {Space.Room.RoomId}");
+        return Task.CompletedTask;
     }
 
 }
diff --git a/MatrixRoomUtils.Web/Shared/RoomListItem.razor b/MatrixRoomUtils.Web/Shared/RoomListItem.razor
index 6e3adc6..79844ef 100644
--- a/MatrixRoomUtils.Web/Shared/RoomListItem.razor
+++ b/MatrixRoomUtils.Web/Shared/RoomListItem.razor
@@ -77,7 +77,7 @@
 
         //sweep from id to roominfo
         if(RoomId is not null) Room ??= await hs.GetRoom(RoomId);
-        if(Room is not null) RoomInfo ??= new RoomInfo() {
+        if(Room is not null) RoomInfo ??= new RoomInfo {
             Room = Room
         };
 
diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor
index 8239367..d67fdab 100644
--- a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor
+++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMemberItem.razor
@@ -4,31 +4,31 @@
 @inherits BaseTimelineItem
 
 @if (roomMemberData is not null) {
-    @if (roomMemberData.Membership == "ban") {
-        <i>@Event.StateKey was banned</i>
-    }
-    else if (roomMemberData.Membership == "invite") {
-        <i>@Event.StateKey was invited</i>
-    }
-    else if (roomMemberData.Membership == "join") {
-        @if (Event.ReplacesState is not null) {
+    @switch (roomMemberData.Membership) {
+        case "ban":
+            <i>@Event.StateKey was banned</i>
+            break;
+        case "invite":
+            <i>@Event.StateKey was invited</i>
+            break;
+        case "join" when Event.ReplacesState is not null:
             <i>@Event.StateKey changed their display name to @(roomMemberData.Displayname ?? Event.Sender)</i>
-        }
-        else {
-            <i><InlineUserItem User="new ProfileResponseEventData()" HomeServer="HomeServer" UserId="@Event.StateKey"></InlineUserItem> joined</i>
-        }
-    }
-    else if (roomMemberData.Membership == "leave") {
-        <i>@Event.StateKey left</i>
-    }
-    else if (roomMemberData.Membership == "knock") {
-        <i>@Event.StateKey knocked</i>
-    }
-    else {
-        <i>@Event.StateKey has an unknown state:</i>
-        <pre>
+            break;
+        case "join":
+            <i><InlineUserItem User="@(new ProfileResponseEventData())" HomeServer="@HomeServer" UserId="@Event.StateKey"></InlineUserItem> joined</i>
+            break;
+        case "leave":
+            <i>@Event.StateKey left</i>
+            break;
+        case "knock":
+            <i>@Event.StateKey knocked</i>
+            break;
+        default:
+            <i>@Event.StateKey has an unknown state:</i>
+            <pre>
         @Event.ToJson()
     </pre>
+            break;
     }
 }
 else {
diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMessageItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMessageItem.razor
index 411b750..13cce88 100644
--- a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMessageItem.razor
+++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineMessageItem.razor
@@ -2,7 +2,7 @@
 @inherits BaseTimelineItem
 
 <pre>
-    @ObjectExtensions.ToJson(Event.RawContent, indent: false)
+    @Event.RawContent?.ToJson(indent: false)
 </pre>
 
 @code {
diff --git a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomCreateItem.razor b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomCreateItem.razor
index b20cc1a..8053a47 100644
--- a/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomCreateItem.razor
+++ b/MatrixRoomUtils.Web/Shared/TimelineComponents/TimelineRoomCreateItem.razor
@@ -8,7 +8,7 @@
     This room is of type @(CreationEventContent.Type ?? "Untyped room (usually a chat room)")
 </p>
 <pre>
-    @ObjectExtensions.ToJson(Event.RawContent, indent: false)
+    @Event.RawContent?.ToJson(indent: false)
 </pre>
 
 @code {