about summary refs log tree commit diff
path: root/BugMine.Sdk/BugMineClient.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2024-04-25 06:31:52 +0200
committerRory& <root@rory.gay>2024-04-25 06:31:52 +0200
commit3054b456dcb54f069a5d8aaa615c1dfe060eef9b (patch)
treece89fbd1478206ac19fefa23035b68801bd25d4e /BugMine.Sdk/BugMineClient.cs
parentAdd basic project management (diff)
downloadBugMine-3054b456dcb54f069a5d8aaa615c1dfe060eef9b.tar.xz
Add projects logic, start of issues
Diffstat (limited to 'BugMine.Sdk/BugMineClient.cs')
-rw-r--r--BugMine.Sdk/BugMineClient.cs54
1 files changed, 40 insertions, 14 deletions
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<BugMineProject> GetProjects() { - List<Task<BugMineProject>> tasks = []; + List<Task<BugMineProject>> 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<BugMineProject> 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<BugMineProject?> 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<GenericRoom?> 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