about summary refs log tree commit diff
path: root/BugMine.Sdk/BugMineClient.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2024-04-20 23:48:43 +0200
committerRory& <root@rory.gay>2024-04-20 23:48:43 +0200
commit68fe1a2284045908d92ef06c1c26cd937ded784e (patch)
tree71144f404f060888dcc5e4036e038abe857adc4e /BugMine.Sdk/BugMineClient.cs
parentStart adding pages (diff)
downloadBugMine-68fe1a2284045908d92ef06c1c26cd937ded784e.tar.xz
Add basic project management
Diffstat (limited to 'BugMine.Sdk/BugMineClient.cs')
-rw-r--r--BugMine.Sdk/BugMineClient.cs55
1 files changed, 55 insertions, 0 deletions
diff --git a/BugMine.Sdk/BugMineClient.cs b/BugMine.Sdk/BugMineClient.cs
new file mode 100644

index 0000000..be80c3a --- /dev/null +++ b/BugMine.Sdk/BugMineClient.cs
@@ -0,0 +1,55 @@ +using System.Text.RegularExpressions; +using ArcaneLibs.Extensions; +using LibMatrix.Homeservers; +using LibMatrix.Responses; + +namespace BugMine.Web.Classes; + +public class BugMineClient(AuthenticatedHomeserverGeneric homeserver) { + public AuthenticatedHomeserverGeneric Homeserver { get; } = homeserver; + + public async IAsyncEnumerable<BugMineProject> GetProjects() { + List<Task<BugMineProject>> tasks = []; + await foreach (var room in homeserver.GetJoinedRoomsByType(BugMineProject.RoomType)) { + tasks.Add(room.AsBugMineProject()); + } + + var results = tasks.ToAsyncEnumerable(); + await foreach (var result in results) { + yield return result; + } + } + + 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 crr = new CreateRoomRequest() { + CreationContent = new() { + ["type"] = "gay.rory.bugmine.project" + }, + Name = $"{request.Name} (BugMine project)", + RoomAliasName = alias + }; + + var response = await Homeserver.CreateRoom(crr); + 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; + + return await (await room.AsBugMineProject()).InitializeAsync(); + } + 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(); + } + } +} \ No newline at end of file