From 257019113200d714d86d22ccab6c18b37cd28283 Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Mon, 3 Jul 2023 00:43:34 +0200 Subject: Local changes --- .../Pages/RoomManager/RoomManagerCreateRoom.razor | 339 --------------------- MatrixRoomUtils.Web/Pages/Rooms/Create.razor | 322 +++++++++++++++++++ MatrixRoomUtils.Web/Pages/Rooms/Index.razor | 132 +++++++- 3 files changed, 450 insertions(+), 343 deletions(-) delete mode 100644 MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerCreateRoom.razor create mode 100644 MatrixRoomUtils.Web/Pages/Rooms/Create.razor (limited to 'MatrixRoomUtils.Web/Pages') diff --git a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerCreateRoom.razor b/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerCreateRoom.razor deleted file mode 100644 index 8368aa5..0000000 --- a/MatrixRoomUtils.Web/Pages/RoomManager/RoomManagerCreateRoom.razor +++ /dev/null @@ -1,339 +0,0 @@ -@* @page "/RoomManagerCreateRoom" *@ -@* @using MatrixRoomUtils.Core.Responses *@ -@* @using System.Text.Json *@ -@* @using System.Reflection *@ -@* @using MatrixRoomUtils.Core.Helpers *@ -@* @using MatrixRoomUtils.Core.StateEventTypes *@ -@* @using MatrixRoomUtils.Web.Classes.RoomCreationTemplates *@ -@* $1$ ReSharper disable once RedundantUsingDirective - Must not remove this, Rider marks this as "unused" when it's not #1# *@ -@* @using MatrixRoomUtils.Web.Shared.SimpleComponents *@ -@* *@ -@*

Room Manager - Create Room

*@ -@* *@ -@* $1$
@JsonString
#1# *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* @if (creationEvent is not null) { *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@*
*@ -@* @creationEvent.PowerLevelContentOverride.Users.Count members *@ -@* @foreach (var user in creationEvent.PowerLevelContentOverride.Events.Keys) { *@ -@* var _event = user; *@ -@*
*@ -@* *@ -@* *@ -@* *@ -@* } *@ -@* @foreach (var user in creationEvent.PowerLevelContentOverride.Users.Keys) { *@ -@* var _user = user; *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* } *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* $1$ Initial states, should remain at bottom? #1# *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* } *@ -@*
Preset: *@ -@* *@ -@* @foreach (var createRoomRequest in Presets) { *@ -@* *@ -@* } *@ -@* *@ -@*
Room name: *@ -@* *@ -@*
Room alias (localpart): *@ -@* *@ -@*
Room type: *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@*
History visibility: *@ -@* $1$ #1# *@ -@* $1$ #1# *@ -@* $1$ #1# *@ -@* $1$ #1# *@ -@* $1$ #1# *@ -@* $1$ #1# *@ -@*
Guest access: *@ -@* @(guestAccessEvent.IsGuestAccessEnabled ? "Guests can join" : "Guests cannot join") (@guestAccessEvent.GuestAccess) *@ -@* $1$ #1# *@ -@* $1$ #1# *@ -@* $1$ #1# *@ -@* $1$ #1# *@ -@*
Room icon: *@ -@* *@ -@*
*@ -@*
*@ -@* *@ -@*
*@ -@* *@ -@*
Permissions:
: *@ -@* *@ -@*
: *@ -@* *@ -@*
Server ACLs: *@ -@*
*@ -@* @(creationEvent["server"].ServerACLs.Allow.Count) allow rules *@ -@* *@ -@*
*@ -@*
*@ -@* @creationEvent.ServerACLs.Deny.Count deny rules *@ -@* *@ -@*
*@ -@*
Invited members: *@ -@*
*@ -@* @creationEvent.InitialState.Count(x => x.Type == "m.room.member") members *@ -@* *@ -@* @foreach (var member in creationEvent.InitialState.Where(x => x.Type == "m.room.member" && x.StateKey != RuntimeCache.CurrentHomeServer.UserId)) { *@ -@* *@ -@* } *@ -@*
*@ -@*
Initial states: *@ -@*
*@ -@* *@ -@* @code{ *@ -@* *@ -@* private static readonly string[] ImplementedStates = { "m.room.avatar", "m.room.history_visibility", "m.room.guest_access", "m.room.server_acl" }; *@ -@* *@ -@* } *@ -@* *@ -@* @creationEvent.InitialState.Count(x => !ImplementedStates.Contains(x.Type)) custom states *@ -@* *@ -@* @foreach (var initialState in creationEvent.InitialState.Where(x => !ImplementedStates.Contains(x.Type))) { *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* } *@ -@*
*@ -@* @(initialState.Type): *@ -@* @if (!string.IsNullOrEmpty(initialState.StateKey)) { *@ -@*
*@ -@* (@initialState.StateKey) *@ -@* } *@ -@*
*@ -@*
@JsonSerializer.Serialize(initialState.Content, new JsonSerializerOptions { WriteIndented = true })
*@ -@*
*@ -@*
*@ -@*
*@ -@* @creationEvent.InitialState.Count initial states *@ -@* *@ -@* @foreach (var initialState in creationEvent.InitialState) { *@ -@* var _state = initialState; *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* *@ -@* } *@ -@*
*@ -@* @(_state.Type):
*@ -@* *@ -@*
*@ -@*
@JsonSerializer.Serialize(_state.Content, new JsonSerializerOptions { WriteIndented = true })
*@ -@*
*@ -@*
*@ -@*
*@ -@* *@ -@*
*@ -@*
*@ -@* Creation JSON *@ -@*
 *@
-@*         @creationEvent.ToJson(ignoreNull: true) *@
-@*     
*@ -@*
*@ -@*
*@ -@* Creation JSON (with null values) *@ -@*
 *@
-@*     @creationEvent.ToJson() *@
-@*     
*@ -@*
*@ -@* *@ -@* *@ -@* @code { *@ -@* *@ -@* private string RoomPreset { *@ -@* get { *@ -@* if (Presets.ContainsValue(creationEvent)) { *@ -@* return Presets.First(x => x.Value == creationEvent).Key; *@ -@* } *@ -@* return "Not a preset"; *@ -@* } *@ -@* set { *@ -@* creationEvent = Presets[value]; *@ -@* JsonChanged(); *@ -@* OverwriteWrappedPropertiesFromEvent(); *@ -@* creationEvent.PowerLevelContentOverride.Events = creationEvent.PowerLevelContentOverride.Events.OrderByDescending(x => x.Value).ThenBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); *@ -@* creationEvent.PowerLevelContentOverride.Users = creationEvent.PowerLevelContentOverride.Users.OrderByDescending(x => x.Value).ThenBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); *@ -@* guestAccessEvent = creationEvent["m.room.guest_access"].As().Content; *@ -@* *@ -@* Console.WriteLine($"Creation event uncasted: {creationEvent["m.room.guest_access"].ToJson()}"); *@ -@* Console.WriteLine($"Creation event casted: {creationEvent["m.room.guest_access"].As().ToJson()}"); *@ -@* creationEvent["m.room.guest_access"].As().Content.IsGuestAccessEnabled = true; *@ -@* Console.WriteLine("-- Created new guest access content --"); *@ -@* Console.WriteLine($"Creation event uncasted: {creationEvent["m.room.guest_access"].ToJson()}"); *@ -@* Console.WriteLine($"Creation event casted: {creationEvent["m.room.guest_access"].As().ToJson()}"); *@ -@* Console.WriteLine($"Creation event casted back: {creationEvent["m.room.guest_access"].As().ToJson()}"); *@ -@* StateHasChanged(); *@ -@* } *@ -@* } *@ -@* *@ -@* private Dictionary creationEventValidationErrors { get; set; } = new(); *@ -@* *@ -@* private CreateRoomRequest creationEvent { get; set; } *@ -@* GuestAccessData guestAccessEvent { get; set; } *@ -@* *@ -@* private Dictionary Presets { get; set; } = new(); *@ -@* *@ -@* protected override async Task OnInitializedAsync() { *@ -@* *@ -@* //creationEvent = Presets["Default room"] = *@ -@* foreach (var x in Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsClass && !x.IsAbstract && x.GetInterfaces().Contains(typeof(IRoomCreationTemplate))).ToList()) { *@ -@* Console.WriteLine($"Found room creation template in class: {x.FullName}"); *@ -@* var instance = (IRoomCreationTemplate)Activator.CreateInstance(x); *@ -@* Presets[instance.Name] = instance.CreateRoomRequest; *@ -@* } *@ -@* Presets = Presets.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); *@ -@* *@ -@* if (!Presets.ContainsKey("Default")) { *@ -@* Console.WriteLine($"No default room found in {Presets.Count} presets: {string.Join(", ", Presets.Keys)}"); *@ -@* } *@ -@* else RoomPreset = "Default"; *@ -@* *@ -@* await base.OnInitializedAsync(); *@ -@* } *@ -@* *@ -@* private void JsonChanged() => Console.WriteLine(creationEvent.ToJson()); *@ -@* *@ -@* //wrappers *@ -@* private List ServerACLAllowRules { get; set; } = new(); *@ -@* private List ServerACLDenyRules { get; set; } = new(); *@ -@* *@ -@* private void OverwriteWrappedPropertiesFromEvent() { *@ -@* Console.WriteLine("Overwriting wrapped properties from event"); *@ -@* ServerACLAllowRules = creationEvent.ServerACLs.Allow; *@ -@* ServerACLDenyRules = creationEvent.ServerACLs.Deny; *@ -@* } *@ -@* *@ -@* private async Task OverwriteWrappedProperties() { *@ -@* Console.WriteLine("Overwriting wrapped properties"); *@ -@* Console.WriteLine($"Allow: {ServerACLAllowRules.Count}: {string.Join(", ", ServerACLAllowRules)}"); *@ -@* Console.WriteLine($"Deny: {ServerACLDenyRules.Count}: {string.Join(", ", ServerACLDenyRules)}"); *@ -@* creationEvent.ServerACLs = new ServerACLData { *@ -@* Allow = ServerACLAllowRules, *@ -@* Deny = ServerACLDenyRules, *@ -@* AllowIpLiterals = creationEvent.ServerACLs.AllowIpLiterals *@ -@* }; *@ -@* *@ -@* StateHasChanged(); *@ -@* } *@ -@* *@ -@* private async Task RoomIconFilePicked(InputFileChangeEventArgs obj) { *@ -@* var res = await RuntimeCache.CurrentHomeServer.UploadFile(obj.File.Name, obj.File.OpenReadStream(), obj.File.ContentType); *@ -@* Console.WriteLine(res); *@ -@* creationEvent.RoomIcon = res; *@ -@* StateHasChanged(); *@ -@* } *@ -@* *@ -@* private async Task CreateRoom() { *@ -@* Console.WriteLine("Create room"); *@ -@* Console.WriteLine(creationEvent.ToJson()); *@ -@* creationEvent.CreationContent.Add("rory.gay.created_using", "Rory&::MatrixRoomUtils (https://mru.rory.gay)"); *@ -@* //creationEvent.CreationContent.Add(); *@ -@* var id = await RuntimeCache.CurrentHomeServer.CreateRoom(creationEvent); *@ -@* // NavigationManager.NavigateTo($"/RoomManager/{id.RoomId.Replace('.','~')}"); *@ -@* } *@ -@* *@ -@* private void InviteMember(string mxid) { *@ -@* if (!creationEvent.InitialState.Any(x => x.Type == "m.room.member" && x.StateKey == mxid) && RuntimeCache.CurrentHomeServer.UserId != mxid) *@ -@* creationEvent.InitialState.Add(new StateEvent { *@ -@* Type = "m.room.member", *@ -@* StateKey = mxid, *@ -@* Content = new { *@ -@* membership = "invite", *@ -@* reason = "Automatically invited at room creation time." *@ -@* } *@ -@* }); *@ -@* } *@ -@* *@ -@* private string GetStateFriendlyName(string key) => key switch { *@ -@* "m.room.history_visibility" => "History visibility", *@ -@* "m.room.guest_access" => "Guest access", *@ -@* "m.room.join_rules" => "Join rules", *@ -@* "m.room.server_acl" => "Server ACL", *@ -@* "m.room.avatar" => "Avatar", *@ -@* _ => key *@ -@* }; *@ -@* *@ -@* private string GetPermissionFriendlyName(string key) => key switch { *@ -@* "m.reaction" => "Send reaction", *@ -@* "m.room.avatar" => "Change room icon", *@ -@* "m.room.canonical_alias" => "Change room alias", *@ -@* "m.room.encryption" => "Enable encryption", *@ -@* "m.room.history_visibility" => "Change history visibility", *@ -@* "m.room.name" => "Change room name", *@ -@* "m.room.power_levels" => "Change power levels", *@ -@* "m.room.tombstone" => "Upgrade room", *@ -@* "m.room.topic" => "Change room topic", *@ -@* "m.room.pinned_events" => "Pin events", *@ -@* "m.room.server_acl" => "Change server ACLs", *@ -@* _ => key *@ -@* }; *@ -@* *@ -@* } *@ -@* *@ diff --git a/MatrixRoomUtils.Web/Pages/Rooms/Create.razor b/MatrixRoomUtils.Web/Pages/Rooms/Create.razor new file mode 100644 index 0000000..4255424 --- /dev/null +++ b/MatrixRoomUtils.Web/Pages/Rooms/Create.razor @@ -0,0 +1,322 @@ +@page "/Rooms/Create" +@using MatrixRoomUtils.Core.Responses +@using System.Text.Json +@using System.Reflection +@using MatrixRoomUtils.Core.Helpers +@using MatrixRoomUtils.Core.StateEventTypes +@using MatrixRoomUtils.Core.StateEventTypes.Spec +@using MatrixRoomUtils.Web.Classes.RoomCreationTemplates +@* @* ReSharper disable once RedundantUsingDirective - Must not remove this, Rider marks this as "unused" when it's not */ *@ +@using MatrixRoomUtils.Web.Shared.SimpleComponents + +

Room Manager - Create Room

+ +@*
@JsonString
*@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ @creationEvent.PowerLevelContentOverride.Users.Count members + @foreach (var user in creationEvent.PowerLevelContentOverride.Events.Keys) { + var _event = user; +
+ + + + } + @foreach (var user in creationEvent.PowerLevelContentOverride.Users.Keys) { + var _user = user; + + + + + } + + + + + + + + + + + + @* Initial states, should remain at bottom *@ + + + + + } +
Preset: + + @foreach (var createRoomRequest in Presets) { + + } + +
Room name: + +
Room alias (localpart): + +
Room type: + + + + + +
History visibility: + @{ + var historyVisibility = creationEvent["m.room.history_visibility"].TypedContent as HistoryVisibilityEventData; + } + + + + + + +
Guest access: + @{ + var guestAccessEvent = creationEvent["m.room.guest_access"].TypedContent as GuestAccessEventData; + } + + @(guestAccessEvent.IsGuestAccessEnabled ? "Guests can join" : "Guests cannot join") (@guestAccessEvent.GuestAccess) + + + + + +
Room icon: + @{ + var roomAvatarEvent = creationEvent["m.room.avatar"].TypedContent as RoomAvatarEventData; + } + +
+
+ +
+ +
Permissions:
+ + : + + +
: + +
Server ACLs: + @{ + var serverAcl = creationEvent["m.room.server_acls"].TypedContent as ServerACLEventData; + } +
+ @((creationEvent["m.room.server_acls"].TypedContent as ServerACLEventData).Allow.Count) allow rules + +
+
+ @(creationEvent["m.room.server_acls"].TypedContent as ServerACLEventData).Deny.Count deny rules + +
+
Invited members: +
+ @creationEvent.InitialState.Count(x => x.Type == "m.room.member") members + @* *@ + @foreach (var member in creationEvent.InitialState.Where(x => x.Type == "m.room.member" && x.StateKey != HomeServer.UserId)) { + + } +
+
Initial states: +
+ + @code + { + private static readonly string[] ImplementedStates = { "m.room.avatar", "m.room.history_visibility", "m.room.guest_access", "m.room.server_acl" }; + } + + @creationEvent.InitialState.Count(x => !ImplementedStates.Contains(x.Type)) custom states + + @foreach (var initialState in creationEvent.InitialState.Where(x => !ImplementedStates.Contains(x.Type))) { + + + + + } +
+ @(initialState.Type): + @if (!string.IsNullOrEmpty(initialState.StateKey)) { +
+ (@initialState.StateKey) + } + +
+
@JsonSerializer.Serialize(initialState.RawContent, new JsonSerializerOptions { WriteIndented = true })
+
+
+
+ @creationEvent.InitialState.Count initial states + + @foreach (var initialState in creationEvent.InitialState) { + var _state = initialState; + + + + + + } +
+ @(_state.Type):
+ +
+
@JsonSerializer.Serialize(_state.RawContent, new JsonSerializerOptions { WriteIndented = true })
+
+
+
+ +
+
+ Creation JSON +
+         @creationEvent.ToJson(ignoreNull: true) 
+     
+
+
+ Creation JSON (with null values) +
+     @creationEvent.ToJson()
+     
+
+ + +@code { + + private string RoomPreset { + get { + if (Presets.ContainsValue(creationEvent)) { + return Presets.First(x => x.Value == creationEvent).Key; + } + return "Not a preset"; + } + set { + creationEvent = Presets[value]; + JsonChanged(); + + creationEvent.PowerLevelContentOverride.Events = creationEvent.PowerLevelContentOverride.Events.OrderByDescending(x => x.Value).ThenBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); + creationEvent.PowerLevelContentOverride.Users = creationEvent.PowerLevelContentOverride.Users.OrderByDescending(x => x.Value).ThenBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); + guestAccessEvent = creationEvent["m.room.guest_access"].TypedContent as GuestAccessEventData; + StateHasChanged(); + } + } + + private Dictionary creationEventValidationErrors { get; set; } = new(); + + private CreateRoomRequest creationEvent { get; set; } + GuestAccessEventData guestAccessEvent { get; set; } + + private Dictionary Presets { get; set; } = new(); + private AuthenticatedHomeServer? HomeServer { get; set; } + + protected override async Task OnInitializedAsync() { + HomeServer = await MRUStorage.GetCurrentSessionOrNavigate(); + if (HomeServer is null) return; + + foreach (var x in Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsClass && !x.IsAbstract && x.GetInterfaces().Contains(typeof(IRoomCreationTemplate))).ToList()) { + Console.WriteLine($"Found room creation template in class: {x.FullName}"); + var instance = (IRoomCreationTemplate)Activator.CreateInstance(x); + Presets[instance.Name] = instance.CreateRoomRequest; + } + Presets = Presets.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); + + if (!Presets.ContainsKey("Default")) { + Console.WriteLine($"No default room found in {Presets.Count} presets: {string.Join(", ", Presets.Keys)}"); + } + else RoomPreset = "Default"; + + await base.OnInitializedAsync(); + } + + private void JsonChanged() => Console.WriteLine(creationEvent.ToJson()); + + private async Task RoomIconFilePicked(InputFileChangeEventArgs obj) { + var res = await HomeServer.UploadFile(obj.File.Name, obj.File.OpenReadStream(), obj.File.ContentType); + Console.WriteLine(res); + (creationEvent["m.room.avatar"].TypedContent as RoomAvatarEventData).Url = res; + StateHasChanged(); + } + + private async Task CreateRoom() { + Console.WriteLine("Create room"); + Console.WriteLine(creationEvent.ToJson()); + creationEvent.CreationContent.Add("rory.gay.created_using", "Rory&::MatrixRoomUtils (https://mru.rory.gay)"); + var id = await HomeServer.CreateRoom(creationEvent); + } + + private void InviteMember(string mxid) { + if (!creationEvent.InitialState.Any(x => x.Type == "m.room.member" && x.StateKey == mxid) && HomeServer.UserId != mxid) + creationEvent.InitialState.Add(new StateEvent { + Type = "m.room.member", + StateKey = mxid, + TypedContent = new RoomMemberEventData() { + Membership = "invite", + Reason = "Automatically invited at room creation time." + } + }); + } + + private string GetStateFriendlyName(string key) => key switch { + "m.room.history_visibility" => "History visibility", + "m.room.guest_access" => "Guest access", + "m.room.join_rules" => "Join rules", + "m.room.server_acl" => "Server ACL", + "m.room.avatar" => "Avatar", + _ => key + }; + + private string GetPermissionFriendlyName(string key) => key switch { + "m.reaction" => "Send reaction", + "m.room.avatar" => "Change room icon", + "m.room.canonical_alias" => "Change room alias", + "m.room.encryption" => "Enable encryption", + "m.room.history_visibility" => "Change history visibility", + "m.room.name" => "Change room name", + "m.room.power_levels" => "Change power levels", + "m.room.tombstone" => "Upgrade room", + "m.room.topic" => "Change room topic", + "m.room.pinned_events" => "Pin events", + "m.room.server_acl" => "Change server ACLs", + _ => key + }; + +} \ No newline at end of file diff --git a/MatrixRoomUtils.Web/Pages/Rooms/Index.razor b/MatrixRoomUtils.Web/Pages/Rooms/Index.razor index d88d5b2..a70ed9d 100644 --- a/MatrixRoomUtils.Web/Pages/Rooms/Index.razor +++ b/MatrixRoomUtils.Web/Pages/Rooms/Index.razor @@ -1,25 +1,149 @@ @page "/Rooms" @using MatrixRoomUtils.Core.StateEventTypes @using MatrixRoomUtils.Core.StateEventTypes.Spec +@using MatrixRoomUtils.Core.Filters +@using MatrixRoomUtils.Core.Helpers +@using MatrixRoomUtils.Core.Responses

Room list

- -@if (Rooms is not null) { +

@Status

+@if (RenderContents) { } @code { - private List Rooms { get; set; } + private List Rooms { get; set; } = new(); private ProfileResponseEventData GlobalProfile { get; set; } protected override async Task OnInitializedAsync() { var hs = await MRUStorage.GetCurrentSessionOrNavigate(); if (hs is null) return; GlobalProfile = await hs.GetProfile(hs.WhoAmI.UserId); - Rooms = (await hs.GetJoinedRooms()).Select(x => new RoomInfo() { Room = x }).ToList(); + var filter = new SyncFilter() { + AccountData = new() { + NotTypes = new() { "*" } + }, + Presence = new() { + NotTypes = new() { "*" } + }, + Room = new RoomFilter() { + AccountData = new() { + NotTypes = new() { "*" } + }, + Ephemeral = new() { + NotTypes = new() { "*" } + }, + State = new RoomFilter.StateFilter() { + Types = new List() { + "m.room.name", + "m.room.avatar", + "m.room.create", + "org.matrix.mjolnir.shortcode", + } + }, + Timeline = new() { + NotTypes = new() { "*" }, + Limit = 1 + } + } + }; + Status = "Syncing..."; + SyncResult? sync = null; + string? nextBatch = null; + while (sync is null or { Rooms.Join.Count: > 10}) { + sync = await hs.SyncHelper.Sync(since: nextBatch, filter: filter); + nextBatch = sync?.NextBatch ?? nextBatch; + if (sync is null) continue; + Console.WriteLine($"Got sync, next batch: {nextBatch}!"); + + if (sync.Rooms is null) continue; + if (sync.Rooms.Join is null) continue; + foreach (var (roomId, roomData) in sync.Rooms.Join) { + RoomInfo room; + if (Rooms.Any(x => x.Room.RoomId == roomId)) { + room = Rooms.First(x => x.Room.RoomId == roomId); + } + else { + room = new RoomInfo() { + Room = await hs.GetRoom(roomId), + StateEvents = new() + }; + Rooms.Add(room); + } + room.StateEvents.AddRange(roomData.State.Events); + } + Status = $"Got {Rooms.Count} rooms so far!"; + StateHasChanged(); + } + Console.WriteLine("Sync done!"); + Status = "Sync complete!"; + foreach (var roomInfo in Rooms) { + if (!roomInfo.StateEvents.Any(x => x.Type == "m.room.name")) { + roomInfo.StateEvents.Add(new StateEventResponse() { + Type = "m.room.name", + TypedContent = new RoomNameEventData() { + Name = roomInfo.Room.RoomId + } + }); + } + if (!roomInfo.StateEvents.Any(x => x.Type == "m.room.avatar")) { + roomInfo.StateEvents.Add(new StateEventResponse() { + Type = "m.room.avatar", + TypedContent = new RoomAvatarEventData() { + + } + }); + } + if (!roomInfo.StateEvents.Any(x => x.Type == "org.matrix.mjolnir.shortcode")) { + roomInfo.StateEvents.Add(new StateEventResponse() { + Type = "org.matrix.mjolnir.shortcode" + }); + } + } + Console.WriteLine("Set stub data!"); + Status = "Set stub data!"; + var memberTasks = Rooms.Select(async roomInfo => { + if (!roomInfo.StateEvents.Any(x => x.Type == "m.room.member" && x.StateKey == hs.WhoAmI.UserId)) { + roomInfo.StateEvents.Add(new StateEventResponse() { + Type = "m.room.member", + StateKey = hs.WhoAmI.UserId, + TypedContent = await roomInfo.Room.GetStateAsync("m.room.member", hs.WhoAmI.UserId) ?? new RoomMemberEventData() { + Membership = "unknown" + } + }); + } + }).ToList(); + await Task.WhenAll(memberTasks); + Console.WriteLine("Set all room member data!"); + Status = "Set all room member data!"; + // var res = await hs.SyncHelper.Sync(filter: filter); + // if (res is not null) { + // foreach (var (roomId, roomData) in res.Rooms.Join) { + // var room = new RoomInfo() { + // Room = await hs.GetRoom(roomId), + // StateEvents = roomData.State.Events.Where(x => x.Type == "m.room.member" && x.StateKey == hs.WhoAmI.UserId).ToList() + // }; + // Rooms.Add(room); + // } + // } + // Rooms = (await hs.GetJoinedRooms()).Select(x => new RoomInfo() { Room = x }).ToList(); + RenderContents = true; + Status = ""; await base.OnInitializedAsync(); } + private bool RenderContents { get; set; } = false; + + private string _status; + + public string Status { + get => _status; + set { + _status = value; + StateHasChanged(); + } + } + } \ No newline at end of file -- cgit 1.5.1