1 files changed, 72 insertions, 0 deletions
diff --git a/MatrixUtils.RoomUpgradeCLI/Commands/ExecuteCommand.cs b/MatrixUtils.RoomUpgradeCLI/Commands/ExecuteCommand.cs
new file mode 100644
index 0000000..a095f2e
--- /dev/null
+++ b/MatrixUtils.RoomUpgradeCLI/Commands/ExecuteCommand.cs
@@ -0,0 +1,72 @@
+using System.Text.Json;
+using System.Text.Json.Nodes;
+using ArcaneLibs.Extensions;
+using LibMatrix.Helpers;
+using LibMatrix.Homeservers;
+
+namespace MatrixUtils.RoomUpgradeCLI.Commands;
+
+public class ExecuteCommand(ILogger<ExecuteCommand> logger, IHost host, RuntimeContext ctx, AuthenticatedHomeserverGeneric hs) : IHostedService {
+ public async Task StartAsync(CancellationToken cancellationToken) {
+ if (ctx.Args.Length <= 1) {
+ await PrintHelp();
+ return;
+ }
+
+ var filename = ctx.Args[1];
+ if (filename.StartsWith("--")) {
+ Console.WriteLine("Filename cannot start with --, please provide a valid filename.");
+ await PrintHelp();
+ }
+
+ if (Directory.Exists(filename)) {
+ await ExecuteDirectory(filename);
+ }
+ else if (File.Exists(filename)) {
+ await ExecuteFile(filename);
+ }
+ else {
+ Console.WriteLine($"File or directory {filename} does not exist.");
+ await PrintHelp();
+ }
+
+ await host.StopAsync(cancellationToken);
+ }
+
+ public async Task ExecuteFile(string filename) {
+ var rbj = await JsonSerializer.DeserializeAsync<JsonObject>(File.OpenRead(filename));
+ var rb = rbj.ContainsKey(nameof(RoomUpgradeBuilder.OldRoomId))
+ ? rbj.Deserialize<RoomUpgradeBuilder>()
+ : rbj.Deserialize<RoomBuilder>();
+ Console.WriteLine($"Executing room builder file of type {rb.GetType().Name}...");
+ if (rb is RoomUpgradeBuilder { CanUpgrade: false } rub && !(rub.UpgradeOptions.ForceUpgrade || rub.UpgradeOptions.NoopUpgrade)) {
+ Console.WriteLine("Warning: Import state has determined that you cannot upgrade this room.");
+ Console.WriteLine(rub.ToJson());
+ return;
+ }
+
+ await rb!.Create(hs);
+ }
+
+ public async Task ExecuteDirectory(string dirName) {
+ if (!Directory.Exists(dirName)) {
+ Console.WriteLine($"Directory {dirName} does not exist.");
+ return;
+ }
+
+ var files = Directory.GetFiles(dirName, "*.json");
+ foreach (var file in files) {
+ Console.WriteLine($"Executing file: {file}");
+ await ExecuteFile(file);
+ }
+ }
+
+ 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
|