about summary refs log tree commit diff
path: root/LibMatrix/Helpers
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-08-16 00:17:33 +0200
committerRory& <root@rory.gay>2025-08-16 00:17:33 +0200
commitc660b3e620de241c1158d08edaf0a99028364977 (patch)
tree24ba7d20f7dcbed30fb6adbd9bcc969205db4807 /LibMatrix/Helpers
parentRoom builder/upgrade fixes (diff)
downloadLibMatrix-c660b3e620de241c1158d08edaf0a99028364977.tar.xz
Some cleanup, further room builder work
Diffstat (limited to 'LibMatrix/Helpers')
-rw-r--r--LibMatrix/Helpers/RoomBuilder.cs37
-rw-r--r--LibMatrix/Helpers/RoomUpgradeBuilder.cs30
2 files changed, 58 insertions, 9 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) { diff --git a/LibMatrix/Helpers/RoomUpgradeBuilder.cs b/LibMatrix/Helpers/RoomUpgradeBuilder.cs
index f9ce62b..8eaf9b8 100644 --- a/LibMatrix/Helpers/RoomUpgradeBuilder.cs +++ b/LibMatrix/Helpers/RoomUpgradeBuilder.cs
@@ -1,11 +1,14 @@ using System.Diagnostics; +using System.Reflection; using System.Text.Json.Serialization; using ArcaneLibs; +using LibMatrix.EventTypes; using LibMatrix.EventTypes.Spec; using LibMatrix.EventTypes.Spec.State.Policy; using LibMatrix.EventTypes.Spec.State.RoomInfo; using LibMatrix.Homeservers; using LibMatrix.RoomTypes; +using LibMatrix.StructuredData; namespace LibMatrix.Helpers; @@ -15,11 +18,13 @@ public class RoomUpgradeBuilder : RoomBuilder { public bool CanUpgrade { get; private set; } public Dictionary<string, object> AdditionalTombstoneContent { get; set; } = new(); + private List<Type> basePolicyTypes = []; + public async Task ImportAsync(GenericRoom OldRoom) { var sw = Stopwatch.StartNew(); var total = 0; - var basePolicyTypes = ClassCollector<PolicyRuleEventContent>.ResolveFromAllAccessibleAssemblies().ToList(); + basePolicyTypes = ClassCollector<PolicyRuleEventContent>.ResolveFromAllAccessibleAssemblies().ToList(); Console.WriteLine($"Found {basePolicyTypes.Count} policy types in {sw.ElapsedMilliseconds}ms"); CanUpgrade = ( (await OldRoom.GetPowerLevelsAsync())?.UserHasStatePermission(OldRoom.Homeserver.UserId, RoomTombstoneEventContent.EventId) @@ -39,7 +44,7 @@ public class RoomUpgradeBuilder : RoomBuilder { if (evt.StateKey == "") { if (evt.Type == RoomCreateEventContent.EventId) foreach (var (key, value) in evt.RawContent) { - if (key == "version") continue; + if (key is "room_version" or "creator") continue; if (key == "type") Type = value!.GetValue<string>(); else AdditionalCreationContent[key] = value; @@ -80,8 +85,11 @@ public class RoomUpgradeBuilder : RoomBuilder { }); } else if (evt.Type == RoomMemberEventContent.EventId) { - if (UpgradeOptions.InviteMembers && evt.TypedContent is RoomMemberEventContent { Membership: "join" or "invite" } invitedMember) { - Invites.TryAdd(evt.StateKey!, invitedMember.Reason ?? "Room upgrade"); + if (evt.TypedContent is RoomMemberEventContent { Membership: "join" or "invite" } invitedMember) { + if (UpgradeOptions.InviteMembers) + Invites.TryAdd(evt.StateKey!, invitedMember.Reason ?? "Room upgrade"); + else if (UpgradeOptions.InviteLocalMembers && UserId.Parse(evt.StateKey!).ServerName == OldRoom.Homeserver.ServerName) + Invites.TryAdd(evt.StateKey!, invitedMember.Reason ?? "Room upgrade (local user)"); } else if (UpgradeOptions.MigrateBans && evt.TypedContent is RoomMemberEventContent { Membership: "ban" } bannedMember) Bans.TryAdd(evt.StateKey!, bannedMember.Reason); @@ -100,6 +108,19 @@ public class RoomUpgradeBuilder : RoomBuilder { } private StateEventResponse UpgradeUnstableValues(StateEventResponse evt) { + if (evt.IsLegacyType) { + var oldType = evt.Type; + evt.Type = evt.MappedType.GetCustomAttributes<MatrixEventAttribute>().FirstOrDefault(x => !x.Legacy)!.EventName; + Console.WriteLine($"Upgraded event type from {oldType} to {evt.Type} for event {evt.EventId}"); + } + + if (evt.MappedType.IsAssignableTo(typeof(PolicyRuleEventContent))) { + if (evt.RawContent["recommendation"]?.GetValue<string>() == "org.matrix.mjolnir.ban") { + evt.RawContent["recommendation"] = "m.ban"; + Console.WriteLine($"Upgraded recommendation from 'org.matrix.mjolnir.ban' to 'm.ban' for event {evt.EventId}"); + } + } + return evt; } @@ -158,6 +179,7 @@ public class RoomUpgradeBuilder : RoomBuilder { public class RoomUpgradeOptions { public bool InviteMembers { get; set; } + public bool InviteLocalMembers { get; set; } public bool InvitePowerlevelUsers { get; set; } public bool MigrateBans { get; set; } public bool MigrateEmptyStateEvents { get; set; }