about summary refs log tree commit diff
path: root/BugMine.Sdk
diff options
context:
space:
mode:
Diffstat (limited to 'BugMine.Sdk')
-rw-r--r--BugMine.Sdk/BugMineClient.cs17
-rw-r--r--BugMine.Sdk/BugMineProject.cs28
-rw-r--r--BugMine.Sdk/Events/State/BugMineRoomMetadata.cs2
3 files changed, 29 insertions, 18 deletions
diff --git a/BugMine.Sdk/BugMineClient.cs b/BugMine.Sdk/BugMineClient.cs

index db47b85..21be614 100644 --- a/BugMine.Sdk/BugMineClient.cs +++ b/BugMine.Sdk/BugMineClient.cs
@@ -11,10 +11,11 @@ namespace BugMine.Web.Classes; public class BugMineClient(AuthenticatedHomeserverGeneric homeserver) { public AuthenticatedHomeserverGeneric Homeserver { get; } = homeserver; - public async IAsyncEnumerable<BugMineProject> GetProjects() { + public async IAsyncEnumerable<BugMineProject> GetProjects(SemaphoreSlim? semaphore = null) { List<Task<BugMineProject>> tasks = []; - await foreach (var room in homeserver.GetJoinedRoomsByType(BugMineProject.RoomType)) { - tasks.Add(room.AsBugMineProject()); + int count = 0; + await foreach (var room in homeserver.GetJoinedRoomsByType(BugMineProject.RoomType, 64)) { + tasks.Add(room.AsBugMineProject(semaphore)); } var results = tasks.ToAsyncEnumerable(); @@ -46,10 +47,14 @@ public class BugMineClient(AuthenticatedHomeserverGeneric homeserver) { ] }; - var response = await Homeserver.CreateRoom(crr); - // await response.SendStateEventAsync(ProjectInfo.EventId, request); + var newRoom = await Homeserver.CreateRoom(crr); + var timeline = await newRoom.GetMessagesAsync(); + + await newRoom.SendStateEventAsync(BugMineRoomMetadata.EventId, new BugMineRoomMetadata() { + RoomCreationEventId = timeline.Chunk.Single(m => m.Type == "m.room.create").EventId! + }); - return await response.AsBugMineProject(); + return await newRoom.AsBugMineProject(); } public async Task<BugMineProject?> GetProject(string projectSlug) { diff --git a/BugMine.Sdk/BugMineProject.cs b/BugMine.Sdk/BugMineProject.cs
index babb680..1f56659 100644 --- a/BugMine.Sdk/BugMineProject.cs +++ b/BugMine.Sdk/BugMineProject.cs
@@ -1,6 +1,4 @@ -using System.Text.Json.Nodes; -using LibMatrix.EventTypes.Spec.State; -using LibMatrix.Homeservers; +using ArcaneLibs.Extensions; using LibMatrix.RoomTypes; namespace BugMine.Web.Classes; @@ -9,43 +7,51 @@ public class BugMineProject(GenericRoom room) { public const string RoomType = "gay.rory.bugmine.project"; public GenericRoom Room { get; } = room; public ProjectInfo Info { get; set; } + public BugMineRoomMetadata Metadata { get; set; } public string ProjectSlug { get; set; } public async Task<BugMineProject> InitializeAsync() { - Info = (await Room.GetStateAsync<ProjectInfo>(ProjectInfo.EventId))!; + var infoTask = Room.GetStateAsync<ProjectInfo>(ProjectInfo.EventId); + var metadataTask = Room.GetStateAsync<BugMineRoomMetadata>(BugMineRoomMetadata.EventId)!; var alias = await room.GetCanonicalAliasAsync(); if (alias != null) ProjectSlug = alias.Alias?[1..] ?? room.RoomId; else ProjectSlug = room.RoomId; + Info = (await infoTask)!; + Metadata = (await metadataTask)!; return this; } public async Task<BugMineIssue> CreateIssue(BugMineIssueData issue) { // add relation to room creation event issue.RelatesTo = new() { - EventId = await room.GetStateEventIdAsync(RoomCreateEventContent.EventId), + EventId = Metadata.RoomCreationEventId, RelationType = "gay.rory.bugmine.issue" }; var eventId = await Room.SendTimelineEventAsync(BugMineIssueData.EventId, issue); - // return new BugMineIssueAccessor(Room, await Room.GetEventAsync<>(eventId)); var evt = await room.GetEventAsync(eventId.EventId); - Console.WriteLine(evt); + Console.WriteLine(evt.ToJson(indent: false)); return new BugMineIssue(Room, evt); } public async IAsyncEnumerable<BugMineIssue> GetIssues() { - var creationEventId = await room.GetStateEventIdAsync(RoomCreateEventContent.EventId); - await foreach (var evt in room.GetRelatedEventsAsync(creationEventId, "gay.rory.bugmine.issue", BugMineIssueData.EventId)) { + await foreach (var evt in room.GetRelatedEventsAsync(Metadata.RoomCreationEventId, "gay.rory.bugmine.issue", BugMineIssueData.EventId)) { yield return new BugMineIssue(Room, evt); } } } public static class ProjectRoomExtensions { - public static async Task<BugMineProject> AsBugMineProject(this GenericRoom room) { - return await new BugMineProject(room).InitializeAsync(); + public static async Task<BugMineProject> AsBugMineProject(this GenericRoom room, SemaphoreSlim? semaphore = null) { + try { + await (semaphore?.WaitAsync() ?? Task.CompletedTask); + return await new BugMineProject(room).InitializeAsync(); + } + finally { + semaphore?.Release(); + } } } \ No newline at end of file diff --git a/BugMine.Sdk/Events/State/BugMineRoomMetadata.cs b/BugMine.Sdk/Events/State/BugMineRoomMetadata.cs
index a6686d3..734fd37 100644 --- a/BugMine.Sdk/Events/State/BugMineRoomMetadata.cs +++ b/BugMine.Sdk/Events/State/BugMineRoomMetadata.cs
@@ -7,5 +7,5 @@ public class BugMineRoomMetadata : EventContent { public const string EventId = "gay.rory.bugmine.room_metadata"; public string RoomCreationEventId { get; set; } - + } \ No newline at end of file