From 3054b456dcb54f069a5d8aaa615c1dfe060eef9b Mon Sep 17 00:00:00 2001 From: Rory& Date: Thu, 25 Apr 2024 06:31:52 +0200 Subject: Add projects logic, start of issues --- BugMine.Sdk/BugMineClient.cs | 54 ++++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 14 deletions(-) (limited to 'BugMine.Sdk/BugMineClient.cs') diff --git a/BugMine.Sdk/BugMineClient.cs b/BugMine.Sdk/BugMineClient.cs index be80c3a..db47b85 100644 --- a/BugMine.Sdk/BugMineClient.cs +++ b/BugMine.Sdk/BugMineClient.cs @@ -1,15 +1,18 @@ using System.Text.RegularExpressions; using ArcaneLibs.Extensions; +using BugMine.Web.Classes.Exceptions; +using LibMatrix; using LibMatrix.Homeservers; using LibMatrix.Responses; +using LibMatrix.RoomTypes; namespace BugMine.Web.Classes; public class BugMineClient(AuthenticatedHomeserverGeneric homeserver) { public AuthenticatedHomeserverGeneric Homeserver { get; } = homeserver; - + public async IAsyncEnumerable GetProjects() { - List> tasks = []; + List> tasks = []; await foreach (var room in homeserver.GetJoinedRoomsByType(BugMineProject.RoomType)) { tasks.Add(room.AsBugMineProject()); } @@ -21,35 +24,58 @@ public class BugMineClient(AuthenticatedHomeserverGeneric homeserver) { } public async Task CreateProject(ProjectInfo request) { - var alias = string.Join('_', Regex.Matches(request.Name, @"[a-zA-Z0-9]+").Select(x => x.Value))+"-bugmine"; - + var alias = string.Join('_', Regex.Matches(request.Name, @"[a-zA-Z0-9]+").Select(x => x.Value)) + "-bugmine"; + var crr = new CreateRoomRequest() { CreationContent = new() { ["type"] = "gay.rory.bugmine.project" }, Name = $"{request.Name} (BugMine project)", - RoomAliasName = alias + RoomAliasName = alias, + InitialState = [ + new StateEvent() { + Type = "m.room.join_rules", + RawContent = new() { + ["join_rule"] = "public" + } + }, + new StateEvent() { + Type = ProjectInfo.EventId, + TypedContent = request + } + ] }; - + var response = await Homeserver.CreateRoom(crr); - await response.SendStateEventAsync(ProjectInfo.EventId, request); - + // await response.SendStateEventAsync(ProjectInfo.EventId, request); + return await response.AsBugMineProject(); } public async Task GetProject(string projectSlug) { - if (projectSlug.StartsWith('!')) { - var room = homeserver.GetRoom(projectSlug); - if (room == null) return null; + var room = await ResolveProjectSlug(projectSlug); + + if (room == null) return null; - return await (await room.AsBugMineProject()).InitializeAsync(); + var rooms = await Homeserver.GetJoinedRooms(); + if (!rooms.Any(r => r.RoomId == room.RoomId)) throw new BugMineException(BugMineException.ErrorCodes.UserNotInRoom); + + return await (await room.AsBugMineProject()).InitializeAsync(); + } + + public async Task ResolveProjectSlug(string projectSlug) { + GenericRoom? room; + if (projectSlug.StartsWith('!')) { + room = homeserver.GetRoom(projectSlug); } else { var alias = $"#{projectSlug}"; var resolveResult = await Homeserver.ResolveRoomAliasAsync(alias); if (string.IsNullOrEmpty(resolveResult?.RoomId)) return null; //TODO: fallback to finding via joined rooms' canonical alias event? - - return await (await homeserver.GetRoom(resolveResult.RoomId).AsBugMineProject()).InitializeAsync(); + + room = homeserver.GetRoom(resolveResult.RoomId); } + + return room; } } \ No newline at end of file -- cgit 1.5.1