@using LibMatrix.Homeservers
@using LibMatrix.RoomTypes
@using LibMatrix
@using LibMatrix.EventTypes.Spec.State
@using LibMatrix.Responses
@using MatrixUtils.LibDMSpace
@using MatrixUtils.LibDMSpace.StateEvents
@using ArcaneLibs.Extensions
@using System.Text.Json.Serialization
@using MatrixUtils.Abstractions
DM Space setup tool - stage 3: Preview space layout
This gives you a preview of how your settings would impact layout!
@if (!string.IsNullOrWhiteSpace(Status)) {
@Status
}
@if (SetupData is not null) {
@if (SetupData.DMSpaceRoomInfo is not null) {
Create sub-spaces per user
@if (!SetupData.DmSpaceInfo.LayerByUser) {
@foreach (var (userId, room) in SetupData.DMRooms.OrderBy(x => x.Key.DisplayName)) {
@foreach (var roomInfo in room) {
}
}
}
else {
@foreach (var (user, room) in SetupData.DMRooms.OrderBy(x => x.Key.DisplayName)) {
@{
RoomInfo fakeRoom = new(SetupData.DMSpaceRoomInfo.Room) {
RoomName = user.DisplayName ?? user.Id,
RoomIcon = user.AvatarUrl
};
}
@foreach (var roomInfo in room) {
}
}
}
}
else {
Error: SetupData.DMSpaceRoomInfo is null!
}
}
else {
Error: DMSpaceRootPageConfiguration is null!
}
Next
@code {
private string? Status {
get => _status;
set {
_status = value;
StateHasChanged();
}
}
private string? _status;
[CascadingParameter]
public DMSpace.DMSpaceSetupData SetupData { get; set; }
SemaphoreSlim _semaphore = new(1, 1);
protected override async Task OnInitializedAsync() {
if (SetupData is null)
return;
await _semaphore.WaitAsync();
var hs = SetupData.Homeserver;
// var dmSpaceRoom = new DMSpaceRoom(hs, SetupData.DmSpaceConfiguration.DMSpaceId);
// SetupData.
// dmSpaceRoomInfo = new() {
// RoomName = await dmSpaceRoom.GetNameAsync(),
// CreationEventContent = await dmSpaceRoom.GetCreateEventAsync(),
// RoomIcon = "mxc://feline.support/uUxBwaboPkMGtbZcAGZaIzpK",
// Room = dmSpaceRoom
// };
// dmSpaceInfo = await dmSpaceRoom.GetDMSpaceInfo();
// Status = "Loading DM list from account data...";
// var dms = await SetupData.Homeserver.GetAccountDataAsync>>("m.direct");
Status = "DM list optimised, fetching info...";
// var results = dms.Select(async x => {
// var (userId, rooms) = x;
// UserProfileWithId userProfile;
// try {
// var profile = await SetupData.Homeserver.GetProfileAsync(userId);
// userProfile = new() {
// AvatarUrl = profile.AvatarUrl,
// Id = userId,
// DisplayName = profile.DisplayName
// };
// }
// catch {
// userProfile = new() {
// AvatarUrl = "mxc://feline.support/uUxBwaboPkMGtbZcAGZaIzpK",
// DisplayName = userId,
// Id = userId
// };
// }
// var roomList = new List();
// var tasks = rooms.Select(x => GetRoomInfo(hs.GetRoom(x))).ToAsyncEnumerable();
// await foreach (var result in tasks)
// roomList.Add(result);
// return (userProfile, roomList);
// }).ToAsyncEnumerable();
// await foreach (var res in results) {
// dmRooms.Add(new RoomInfo() {
// Room = dmSpaceRoom,
// RoomIcon = res.userProfile.AvatarUrl,
// RoomName = res.userProfile.DisplayName,
// CreationEventContent = await dmSpaceRoom.GetCreateEventAsync()
// }, res.roomList);
// }
await SetupData.DMSpaceRoomInfo!.FetchAllStateAsync();
_semaphore.Release();
Status = null;
await base.OnParametersSetAsync();
}
private async Task Execute() {
var hs = SetupData.Homeserver;
var dmSpaceRoom = new DMSpaceRoom(hs, SetupData.DmSpaceConfiguration!.DMSpaceId!);
await dmSpaceRoom.ImportNativeDMs();
NavigationManager.NavigateTo("/User/DMSpace/Setup?stage=3");
}
private async Task GetRoomInfo(GenericRoom room) {
var roomInfo = new RoomInfo(room);
var roomMembers = new List();
roomInfo.CreationEventContent = await room.GetCreateEventAsync();
try {
roomInfo.RoomName = await room.GetNameAsync();
}
catch { }
var membersEnum = room.GetMembersEnumerableAsync(true);
await foreach (var member in membersEnum)
if (member.TypedContent is RoomMemberEventContent memberEvent)
roomMembers.Add(new() { DisplayName = memberEvent.DisplayName, AvatarUrl = memberEvent.AvatarUrl, Id = member.StateKey });
if (string.IsNullOrWhiteSpace(roomInfo.RoomName) || roomInfo.RoomName == room.RoomId) {
List displayNames = new List();
foreach (var member in roomMembers)
if (!string.IsNullOrWhiteSpace(member.DisplayName))
displayNames.Add(member.DisplayName);
roomInfo.RoomName = string.Join(", ", displayNames);
}
try {
string? roomIcon = (await room.GetAvatarUrlAsync())?.Url;
if (room is not null)
roomInfo.RoomIcon = roomIcon;
}
catch { }
return roomInfo;
}
private async Task> GetRoomInfoForRooms(List rooms) {
var tasks = rooms.Select(GetRoomInfo).ToList();
await Task.WhenAll(tasks);
return tasks.Select(x => x.Result).ToList();
}
private class UserProfileWithId : UserProfileResponse {
[JsonIgnore]
public string Id { get; set; }
}
}