about summary refs log tree commit diff
path: root/MatrixUtils.RoomUpgradeCLI
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-08-22 17:39:57 +0200
committerRory& <root@rory.gay>2025-08-22 17:39:57 +0200
commit93db033377b5e457bd04daf0b16f3d8b8cd77b44 (patch)
tree3a98c0c2704b505b8fc8dca960f2aaa43ef14f70 /MatrixUtils.RoomUpgradeCLI
parentFurther room cleanup work (diff)
downloadMatrixUtils-93db033377b5e457bd04daf0b16f3d8b8cd77b44.tar.xz
Room upgrade CLI changes, policy list work
Diffstat (limited to 'MatrixUtils.RoomUpgradeCLI')
-rw-r--r--MatrixUtils.RoomUpgradeCLI/Commands/DevCommands/DevDeleteAllRoomsCommand.cs32
-rw-r--r--MatrixUtils.RoomUpgradeCLI/Commands/ModifyCommand.cs35
-rw-r--r--MatrixUtils.RoomUpgradeCLI/Extensions/RoomBuilderExtensions.cs70
-rw-r--r--MatrixUtils.RoomUpgradeCLI/Program.cs1
-rw-r--r--MatrixUtils.RoomUpgradeCLI/appsettings.SynapseDev.json0
5 files changed, 96 insertions, 42 deletions
diff --git a/MatrixUtils.RoomUpgradeCLI/Commands/DevCommands/DevDeleteAllRoomsCommand.cs b/MatrixUtils.RoomUpgradeCLI/Commands/DevCommands/DevDeleteAllRoomsCommand.cs
new file mode 100644

index 0000000..abae488 --- /dev/null +++ b/MatrixUtils.RoomUpgradeCLI/Commands/DevCommands/DevDeleteAllRoomsCommand.cs
@@ -0,0 +1,32 @@ +using LibMatrix.Homeservers; + +namespace MatrixUtils.RoomUpgradeCLI.Commands; + +public class DevDeleteAllRoomsCommand(ILogger<DevDeleteAllRoomsCommand> logger, IHost host, RuntimeContext ctx, AuthenticatedHomeserverGeneric hs) : IHostedService { + public async Task StartAsync(CancellationToken cancellationToken) { + var synapse = hs as AuthenticatedHomeserverSynapse; + await foreach (var room in synapse.Admin.SearchRoomsAsync()) + { + try + { + await synapse.Admin.DeleteRoom(room.RoomId, new() { ForcePurge = true }); + Console.WriteLine($"Deleted room: {room.RoomId}"); + } + catch (Exception ex) + { + Console.WriteLine($"Failed to delete room {room.RoomId}: {ex.Message}"); + } + } + + await host.StopAsync(cancellationToken); + } + + public async Task StopAsync(CancellationToken cancellationToken) { } + + private async Task PrintHelp() { + Console.WriteLine("Usage: execute [filename]"); + Console.WriteLine("Options:"); + Console.WriteLine(" --help Show this help message"); + await host.StopAsync(); + } +} \ No newline at end of file diff --git a/MatrixUtils.RoomUpgradeCLI/Commands/ModifyCommand.cs b/MatrixUtils.RoomUpgradeCLI/Commands/ModifyCommand.cs
index 35c7bb1..3860448 100644 --- a/MatrixUtils.RoomUpgradeCLI/Commands/ModifyCommand.cs +++ b/MatrixUtils.RoomUpgradeCLI/Commands/ModifyCommand.cs
@@ -33,40 +33,7 @@ public class ModifyCommand(ILogger<ModifyCommand> logger, IHost host, RuntimeCon private async Task PrintHelp() { Console.WriteLine("Usage: new [filename] [options]"); Console.WriteLine("Options:"); - Console.WriteLine(" --help Show this help message"); - Console.WriteLine(" --version <version> Set the room version (e.g. 9, 10, 11, 12)"); - Console.WriteLine("-- New room options --"); - Console.WriteLine(" --alias <alias> Set the room alias (local part)"); - Console.WriteLine(" --avatar-url <url> Set the room avatar URL"); - Console.WriteLine(" --copy-avatar <roomId> Copy the avatar from an existing room"); - Console.WriteLine(" --copy-powerlevels <roomId> Copy power levels from an existing room"); - Console.WriteLine(" --invite-admin <userId> Invite a user as an admin (userId must start with '@')"); - Console.WriteLine(" --invite <userId> Invite a user (userId must start with '@')"); - Console.WriteLine(" --name <name> Set the room name (can be multiple words)"); - Console.WriteLine(" --topic <topic> Set the room topic (can be multiple words)"); - Console.WriteLine(" --federate <true|false> Set whether the room is federatable"); - Console.WriteLine(" --public Set the room join rule to public"); - Console.WriteLine(" --invite-only Set the room join rule to invite-only"); - Console.WriteLine(" --knock Set the room join rule to knock"); - Console.WriteLine(" --restricted Set the room join rule to restricted"); - Console.WriteLine(" --knock_restricted Set the room join rule to knock_restricted"); - Console.WriteLine(" --private Set the room join rule to private"); - Console.WriteLine(" --join-rule <rule> Set the room join rule (public, invite, knock, restricted, knock_restricted, private)"); - Console.WriteLine(" --history-visibility <visibility> Set the room history visibility (shared, invited, joined, world_readable)"); - Console.WriteLine(" --type <type> Set the room type (e.g. m.space, m.room, support.feline.policy.list.msc.v1 etc.)"); - // upgrade opts - Console.WriteLine("-- Upgrade options --"); - Console.WriteLine( - " --upgrade <roomId> Create a room upgrade file instead of a new room file - WARNING: incompatible with non-upgrade options"); - Console.WriteLine(" --invite-members Invite members during room upgrade"); - Console.WriteLine(" --invite-powerlevel-users Invite users with power levels during room upgrade"); - Console.WriteLine(" --migrate-bans Migrate bans during room upgrade"); - Console.WriteLine(" --migrate-empty-state-events Migrate empty state events during room upgrade"); - Console.WriteLine(" --upgrade-unstable-values Upgrade unstable values during room upgrade"); - Console.WriteLine(" --msc4321-policy-list-upgrade <move|transition> Upgrade MSC4321 policy list"); - Console.WriteLine(" --force-upgrade Force upgrade even if you don't have the required permissions"); - Console.WriteLine( - "WARNING: The --upgrade option is incompatible with options listed under \"New room\", please use the equivalent options in the `modify` command instead."); + await host.StopAsync(); } } \ No newline at end of file diff --git a/MatrixUtils.RoomUpgradeCLI/Extensions/RoomBuilderExtensions.cs b/MatrixUtils.RoomUpgradeCLI/Extensions/RoomBuilderExtensions.cs
index 000dd6b..75852bc 100644 --- a/MatrixUtils.RoomUpgradeCLI/Extensions/RoomBuilderExtensions.cs +++ b/MatrixUtils.RoomUpgradeCLI/Extensions/RoomBuilderExtensions.cs
@@ -56,7 +56,7 @@ public static class RoomBuilderExtensions { break; case "--federate": - rb.IsFederatable = bool.Parse(args[++i]); + rb.IsFederatable = GetBoolArg(args, ref i, true); break; case "--public": case "--invite-only": @@ -118,6 +118,7 @@ public static class RoomBuilderExtensions { if (rb.Encryption.Algorithm == "null") rb.Encryption.Algorithm = null; // disable encryption } + break; // upgrade options case "--invite-members": @@ -125,7 +126,7 @@ public static class RoomBuilderExtensions { throw new InvalidOperationException("Invite members can only be used with room upgrades"); } - upgradeBuilder.UpgradeOptions.InviteMembers = true; + upgradeBuilder.UpgradeOptions.InviteMembers = GetBoolArg(args, ref i, true); break; case "--invite-powerlevel-users": case "--invite-power-level-users": @@ -133,28 +134,31 @@ public static class RoomBuilderExtensions { throw new InvalidOperationException("Invite powerlevel users can only be used with room upgrades"); } - upgradeBuilderInvite.UpgradeOptions.InvitePowerlevelUsers = true; + upgradeBuilderInvite.UpgradeOptions.InvitePowerlevelUsers = GetBoolArg(args, ref i, true); + break; + case "--synapse-admin-join-local-users": + rb.SynapseAdminAutoAcceptLocalInvites = GetBoolArg(args, ref i, true); break; case "--migrate-bans": if (rb is not RoomUpgradeBuilder upgradeBuilderBan) { throw new InvalidOperationException("Migrate bans can only be used with room upgrades"); } - upgradeBuilderBan.UpgradeOptions.MigrateBans = true; + upgradeBuilderBan.UpgradeOptions.MigrateBans = GetBoolArg(args, ref i, true); break; case "--migrate-empty-state-events": if (rb is not RoomUpgradeBuilder upgradeBuilderEmpty) { throw new InvalidOperationException("Migrate empty state events can only be used with room upgrades"); } - upgradeBuilderEmpty.UpgradeOptions.MigrateEmptyStateEvents = true; + upgradeBuilderEmpty.UpgradeOptions.MigrateEmptyStateEvents = GetBoolArg(args, ref i, true); break; case "--upgrade-unstable-values": if (rb is not RoomUpgradeBuilder upgradeBuilderUnstable) { throw new InvalidOperationException("Update unstable values can only be used with room upgrades"); } - upgradeBuilderUnstable.UpgradeOptions.UpgradeUnstableValues = true; + upgradeBuilderUnstable.UpgradeOptions.UpgradeUnstableValues = GetBoolArg(args, ref i, true); break; case "--msc4321-policy-list-upgrade": if (rb is not RoomUpgradeBuilder upgradeBuilderPolicy) { @@ -173,9 +177,15 @@ public static class RoomBuilderExtensions { throw new InvalidOperationException("Force upgrade can only be used with room upgrades"); } - upgradeBuilderForce.UpgradeOptions.ForceUpgrade = true; + upgradeBuilderForce.UpgradeOptions.ForceUpgrade = GetBoolArg(args, ref i, true); break; + case "--noop-upgrade": + if (rb is not RoomUpgradeBuilder upgradeBuilderNoop) { + throw new InvalidOperationException("No-op upgrade can only be used with room upgrades"); + } + upgradeBuilderNoop.UpgradeOptions.NoopUpgrade = GetBoolArg(args, ref i, true); + break; case "--upgrade": if (rb is not RoomUpgradeBuilder upgradeBuilderUpgrade) { throw new InvalidOperationException("Upgrade can only be used with room upgrades"); @@ -188,11 +198,55 @@ public static class RoomBuilderExtensions { break; case "--help": - // await PrintHelp(); + PrintHelpAndExit(); return; default: throw new ArgumentException("Unknown argument: " + args[i]); } } } + + private static bool GetBoolArg(string[] args, ref int i, bool defaultValue) { + if (i + 1 < args.Length && bool.TryParse(args[i + 1], out var result)) { + i++; + return result; + } + + return defaultValue; + } + + private static void PrintHelpAndExit() { + Console.WriteLine(""" + --help Show this help message + --version <version> Set the room version (e.g. 9, 10, 11, 12) + -- New room options -- + --federate [True|false] Set whether the room is federatable [WARNING: Cannot be updated later!] + --type <type> Set the room type (e.g. m.space, m.room, support.feline.policy.list.msc.v1 etc.) [WARNING: Cannot be updated later!] + --alias <alias> Set the room alias (local part) + --avatar-url <url> Set the room avatar URL + --copy-avatar <roomId> Copy the avatar from an existing room + --copy-powerlevels <roomId> Copy power levels from an existing room + --invite <userId> Invite a user (userId must start with '@') + --invite-admin <userId> Invite a user as an admin (userId must start with '@') + --synapse-admin-join-local-users [True|false] Automatically accept local user invites during room creation (Synapse only, requires synapse admin access) + --name <name> Set the room name (can be multiple words) + --topic <topic> Set the room topic (can be multiple words) + --join-rule <rule> Set the room join rule (public, invite, knock, restricted, knock_restricted, private) + Aliases: --public, --invite, --knock, --restricted, --knock_restricted, --private + --history-visibility <visibility> Set the room history visibility (shared, invited, joined, world_readable) + -- Upgrade options -- + --upgrade <roomId> Create a room upgrade file instead of a new room file - WARNING: incompatible with non-upgrade options + --invite-members [True|false] Invite members during room upgrade + --invite-local-users [True|false] Invite local users during room upgrade (also see --synapse-admin-join-local-users) + --invite-powerlevel-users [True|false] Invite users with power levels during room upgrade + --migrate-bans [True|false] Migrate bans during room upgrade + --migrate-empty-state-events [True|false] Migrate empty state events during room upgrade + --upgrade-unstable-values [True|false] Upgrade unstable values during room upgrade + --msc4321-policy-list-upgrade <move|transition> Upgrade MSC4321 policy list + --force-upgrade [True|false] Force upgrade even if you don't have the required permissions + --noop-upgrade [True|false] Perform the upgrade, but do not tombstone the old room + WARNING: The --upgrade option is incompatible with options listed under "New room", please use the equivalent options in the `modify` command instead. + """); + Environment.Exit(0); + } } \ No newline at end of file diff --git a/MatrixUtils.RoomUpgradeCLI/Program.cs b/MatrixUtils.RoomUpgradeCLI/Program.cs
index a93a329..e169830 100644 --- a/MatrixUtils.RoomUpgradeCLI/Program.cs +++ b/MatrixUtils.RoomUpgradeCLI/Program.cs
@@ -29,6 +29,7 @@ foreach (var group in args.Split(";")) { else if (argGroup[0] == "execute") builder.Services.AddHostedService<ExecuteCommand>(); // dev cmds else if (argGroup[0] == "dev-delete-room") builder.Services.AddHostedService<DevDeleteRoomCommand>(); + else if (argGroup[0] == "dev-delete-all-rooms") builder.Services.AddHostedService<DevDeleteAllRoomsCommand>(); else if (argGroup[0] == "dev-get-room-dir-state") builder.Services.AddHostedService<DevGetRoomDirStateCommand>(); else { Console.WriteLine("Unknown command. Use 'new', 'modify', 'import-upgrade-state' or 'execute'."); diff --git a/MatrixUtils.RoomUpgradeCLI/appsettings.SynapseDev.json b/MatrixUtils.RoomUpgradeCLI/appsettings.SynapseDev.json new file mode 100644
index 0000000..e69de29 --- /dev/null +++ b/MatrixUtils.RoomUpgradeCLI/appsettings.SynapseDev.json