about summary refs log tree commit diff
path: root/LibMatrix/Helpers/RoomBuilder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'LibMatrix/Helpers/RoomBuilder.cs')
-rw-r--r--LibMatrix/Helpers/RoomBuilder.cs37
1 files changed, 32 insertions, 5 deletions
diff --git a/LibMatrix/Helpers/RoomBuilder.cs b/LibMatrix/Helpers/RoomBuilder.cs

index 601f001..6dfb056 100644 --- a/LibMatrix/Helpers/RoomBuilder.cs +++ b/LibMatrix/Helpers/RoomBuilder.cs
@@ -4,11 +4,13 @@ using LibMatrix.EventTypes.Spec.State.RoomInfo; using LibMatrix.Homeservers; using LibMatrix.Responses; using LibMatrix.RoomTypes; +using LibMatrix.StructuredData; namespace LibMatrix.Helpers; public class RoomBuilder { private static readonly string[] V12PlusRoomVersions = ["org.matrix.hydra.11", "12"]; + public bool SynapseAdminAutoAcceptLocalInvites { get; set; } public string? Type { get; set; } public string Version { get; set; } = "11"; public RoomNameEventContent Name { get; set; } = new(); @@ -130,6 +132,8 @@ public class RoomBuilder { AdditionalCreators.RemoveAll(string.IsNullOrWhiteSpace); if (V12PlusRoomVersions.Contains(Version) && AdditionalCreators is { Count: > 0 }) { crq.CreationContent.Add("additional_creators", AdditionalCreators); + foreach (var user in AdditionalCreators) + PowerLevels.Users?.Remove(user); } foreach (var kvp in AdditionalCreationContent) { @@ -150,6 +154,23 @@ public class RoomBuilder { private async Task SendInvites(GenericRoom room) { if (Invites.Count == 0) return; + if (SynapseAdminAutoAcceptLocalInvites && room.Homeserver is AuthenticatedHomeserverSynapse synapse) { + var localJoinTasks = Invites.Where(u => UserId.Parse(u.Key).ServerName == synapse.ServerName).Select(async entry => { + var user = entry.Key; + var reason = entry.Value; + try { + var uhs = await synapse.Admin.GetHomeserverForUserAsync(user, TimeSpan.FromHours(1)); + var userRoom = uhs.GetRoom(room.RoomId); + await userRoom.JoinAsync([uhs.ServerName], reason); + await uhs.Logout(); + } + catch (MatrixException e) { + Console.WriteLine("Failed to auto-accept invite for {0} in {1}: {2}", user, room.RoomId, e.Message); + } + }).ToList(); + await Task.WhenAll(localJoinTasks); + } + var inviteTasks = Invites.Select(async kvp => { try { await room.InviteUserAsync(kvp.Key, kvp.Value); @@ -163,11 +184,17 @@ public class RoomBuilder { } private async Task SetStatesAsync(GenericRoom room, List<StateEvent> state) { - foreach (var ev in state) { - await (string.IsNullOrWhiteSpace(ev.StateKey) - ? room.SendStateEventAsync(ev.Type, ev.RawContent) - : room.SendStateEventAsync(ev.Type, ev.StateKey, ev.RawContent)); - } + // foreach (var ev in state) { + // await (string.IsNullOrWhiteSpace(ev.StateKey) + // ? room.SendStateEventAsync(ev.Type, ev.RawContent) + // : room.SendStateEventAsync(ev.Type, ev.StateKey, ev.RawContent)); + // } + + foreach (var group in state.Chunk(100)) + await room.BulkSendEventsAsync(group); + + // var tasks = state.Chunk(50).Select(room.BulkSendEventsAsync).ToList(); + // await Task.WhenAll(tasks); } private async Task SetBasicRoomInfoAsync(GenericRoom room) {