diff --git a/MatrixUtils.RoomUpgradeCLI/Commands/NewFileCommand.cs b/MatrixUtils.RoomUpgradeCLI/Commands/NewFileCommand.cs
index da2ad2f..0959857 100644
--- a/MatrixUtils.RoomUpgradeCLI/Commands/NewFileCommand.cs
+++ b/MatrixUtils.RoomUpgradeCLI/Commands/NewFileCommand.cs
@@ -2,8 +2,7 @@ using ArcaneLibs.Extensions;
using LibMatrix.EventTypes.Spec.State.RoomInfo;
using LibMatrix.Helpers;
using LibMatrix.Homeservers;
-using LibMatrix.RoomTypes;
-using LibMatrix.Utilities.Bot.Interfaces;
+using MatrixUtils.RoomUpgradeCLI.Extensions;
namespace MatrixUtils.RoomUpgradeCLI.Commands;
@@ -19,171 +18,7 @@ public class NewFileCommand(ILogger<NewFileCommand> logger, IHost host, RuntimeC
Console.WriteLine("Filename cannot start with --, please provide a valid filename.");
await PrintHelp();
}
- for (int i = 2; i < ctx.Args.Length; i++) {
- switch (ctx.Args[i]) {
- case "--alias":
- rb.AliasLocalPart = ctx.Args[++i];
- break;
- case "--avatar-url":
- rb.Avatar!.Url = ctx.Args[++i];
- break;
- case "--copy-avatar": {
- var room = hs.GetRoom(ctx.Args[++i]);
- rb.Avatar = await room.GetAvatarUrlAsync() ?? throw new ArgumentException($"Room {room.RoomId} does not have an avatar");
- break;
- }
- case "--copy-powerlevels": {
- var room = hs.GetRoom(ctx.Args[++i]);
- rb.PowerLevels = await room.GetPowerLevelsAsync() ?? throw new ArgumentException($"Room {room.RoomId} does not have power levels???");
- break;
- }
- case "--invite-admin":
- var inviteAdmin = ctx.Args[++i];
- if (!inviteAdmin.StartsWith('@')) {
- throw new ArgumentException("Invalid user reference: " + inviteAdmin);
- }
-
- rb.Invites.Add(inviteAdmin, "Marked explicitly as admin to be invited");
- break;
- case "--invite":
- var inviteUser = ctx.Args[++i];
- if (!inviteUser.StartsWith('@')) {
- throw new ArgumentException("Invalid user reference: " + inviteUser);
- }
-
- rb.Invites.Add(inviteUser, "Marked explicitly to be invited");
- break;
- case "--name":
- var nameEvt = rb.Name = new() { Name = "" };
- while (i + 1 < ctx.Args.Length && !ctx.Args[i + 1].StartsWith("--")) {
- nameEvt.Name += (nameEvt.Name.Length > 0 ? " " : "") + ctx.Args[++i];
- }
-
- break;
- case "--topic":
- var topicEvt = rb.Topic = new() { Topic = "" };
- while (i + 1 < ctx.Args.Length && !ctx.Args[i + 1].StartsWith("--")) {
- topicEvt.Topic += (topicEvt.Topic.Length > 0 ? " " : "") + ctx.Args[++i];
- }
-
- break;
- case "--federate":
- rb.IsFederatable = bool.Parse(ctx.Args[++i]);
- break;
- case "--public":
- case "--invite-only":
- case "--knock":
- case "--restricted":
- case "--knock_restricted":
- case "--private":
- rb.JoinRules.JoinRule = ctx.Args[i].Replace("--", "").ToLowerInvariant() switch {
- "public" => RoomJoinRulesEventContent.JoinRules.Public,
- "invite-only" => RoomJoinRulesEventContent.JoinRules.Invite,
- "knock" => RoomJoinRulesEventContent.JoinRules.Knock,
- "restricted" => RoomJoinRulesEventContent.JoinRules.Restricted,
- "knock_restricted" => RoomJoinRulesEventContent.JoinRules.KnockRestricted,
- "private" => RoomJoinRulesEventContent.JoinRules.Private,
- _ => throw new ArgumentException("Unknown join rule: " + ctx.Args[i])
- };
- break;
- case "--join-rule":
- if (i + 1 >= ctx.Args.Length || !ctx.Args[i + 1].StartsWith("--")) {
- throw new ArgumentException("Expected join rule after --join-rule");
- }
-
- rb.JoinRules.JoinRule = ctx.Args[++i].ToLowerInvariant() switch {
- "public" => RoomJoinRulesEventContent.JoinRules.Public,
- "invite" => RoomJoinRulesEventContent.JoinRules.Invite,
- "knock" => RoomJoinRulesEventContent.JoinRules.Knock,
- "restricted" => RoomJoinRulesEventContent.JoinRules.Restricted,
- "knock_restricted" => RoomJoinRulesEventContent.JoinRules.KnockRestricted,
- "private" => RoomJoinRulesEventContent.JoinRules.Private,
- _ => throw new ArgumentException("Unknown join rule: " + ctx.Args[i])
- };
- break;
- case "--history-visibility":
- rb.HistoryVisibility = new RoomHistoryVisibilityEventContent {
- HistoryVisibility = ctx.Args[++i].ToLowerInvariant() switch {
- "shared" => RoomHistoryVisibilityEventContent.HistoryVisibilityTypes.Shared,
- "invited" => RoomHistoryVisibilityEventContent.HistoryVisibilityTypes.Invited,
- "joined" => RoomHistoryVisibilityEventContent.HistoryVisibilityTypes.Joined,
- "world_readable" => RoomHistoryVisibilityEventContent.HistoryVisibilityTypes.WorldReadable,
- _ => throw new ArgumentException("Unknown history visibility: " + ctx.Args[i])
- }
- };
- break;
- case "--type":
- rb.Type = ctx.Args[++i];
- break;
- case "--version":
- rb.Version = ctx.Args[++i];
- // if (!RoomBuilder.V12PlusRoomVersions.Contains(rb.Version)) {
- // logger.LogWarning("Using room version {Version} which is not v12 or higher, this may cause issues with some features.", rb.Version);
- // }
- break;
- // upgrade options
- case "--invite-members":
- if (rb is not RoomUpgradeBuilder upgradeBuilder) {
- throw new InvalidOperationException("Invite members can only be used with room upgrades");
- }
-
- upgradeBuilder.UpgradeOptions.InviteMembers = true;
- break;
- case "--invite-powerlevel-users":
- if (rb is not RoomUpgradeBuilder upgradeBuilderInvite) {
- throw new InvalidOperationException("Invite powerlevel users can only be used with room upgrades");
- }
-
- upgradeBuilderInvite.UpgradeOptions.InvitePowerlevelUsers = 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;
- 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;
- 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;
- break;
- case "--msc4321-policy-list-upgrade":
- if (rb is not RoomUpgradeBuilder upgradeBuilderPolicy) {
- throw new InvalidOperationException("MSC4321 policy list upgrade can only be used with room upgrades");
- }
-
- upgradeBuilderPolicy.UpgradeOptions.Msc4321PolicyListUpgradeOptions.Enable = true;
- upgradeBuilderPolicy.UpgradeOptions.Msc4321PolicyListUpgradeOptions.UpgradeType = ctx.Args[++i].ToLowerInvariant() switch {
- "move" => RoomUpgradeBuilder.Msc4321PolicyListUpgradeOptions.Msc4321PolicyListUpgradeType.Move,
- "transition" => RoomUpgradeBuilder.Msc4321PolicyListUpgradeOptions.Msc4321PolicyListUpgradeType.Transition,
- _ => throw new ArgumentException("Unknown MSC4321 policy list upgrade type: " + ctx.Args[i])
- };
- break;
-
- case "--upgrade":
- if (rb is not RoomUpgradeBuilder upgradeBuilderUpgrade) {
- throw new InvalidOperationException("Upgrade can only be used with room upgrades");
- }
- upgradeBuilderUpgrade.OldRoomId = ctx.Args[++i];
- break;
- case "--help":
- await PrintHelp();
- return;
- default:
- throw new ArgumentException("Unknown argument: " + ctx.Args[i]);
- }
- }
-
+ await rb.ApplyRoomUpgradeCLIArgs(hs, ctx.Args[2..], isNewState: true);
await File.WriteAllTextAsync(filename, rb.ToJson(), cancellationToken);
await host.StopAsync(cancellationToken);
@@ -224,7 +59,7 @@ public class NewFileCommand(ILogger<NewFileCommand> logger, IHost host, RuntimeC
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("WARNING: The --upgrade option is incompatible with options listed under \"New room\", please use the equivalent options in the `apply-upgrade` command instead.");
+ 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
|