about summary refs log tree commit diff
path: root/BugMine.DevTools.CLI/Worker.cs
diff options
context:
space:
mode:
Diffstat (limited to 'BugMine.DevTools.CLI/Worker.cs')
-rw-r--r--BugMine.DevTools.CLI/Worker.cs132
1 files changed, 95 insertions, 37 deletions
diff --git a/BugMine.DevTools.CLI/Worker.cs b/BugMine.DevTools.CLI/Worker.cs
index 8cd931e..900d742 100644
--- a/BugMine.DevTools.CLI/Worker.cs
+++ b/BugMine.DevTools.CLI/Worker.cs
@@ -1,3 +1,4 @@
+using System.Diagnostics;
 using System.Text.Json;
 using ArcaneLibs.Extensions;
 using BugMine.Web.Classes;
@@ -30,74 +31,90 @@ public class Worker(ILogger<Worker> logger, HomeserverProviderService hsProvider
         while (!stoppingToken.IsCancellationRequested) {
             Console.WriteLine("""
                               1) List all projects
-                              2) Create 500 projects
+                              2) Mass create projects
                               3) Destroy all projects
                               4) Get room count
+                              5) Summarize all projects
+                              6) Mass create regular rooms
+
+                              L) Logout
+                              Q) Quit
                               """);
 
             var input = Console.ReadKey();
             Console.WriteLine();
             switch (input.Key) {
                 case ConsoleKey.D1: {
-                    if (Client is null) {
-                        _logger.LogError("No client available.");
-                        break;
-                    }
-
+                    var sw = Stopwatch.StartNew();
                     var projects = Client.GetProjects();
                     await foreach (var project in projects) {
                         Console.WriteLine(project.ToJson(indent: false));
                     }
 
+                    Console.WriteLine($"Queried in {sw.Elapsed}");
                     break;
                 }
                 case ConsoleKey.D2: {
-                    if (Client is null) {
-                        _logger.LogError("No client available.");
-                        break;
-                    }
-
                     await MassCreateProjects();
                     break;
                 }
                 case ConsoleKey.D3: {
-                    if (Client is null) {
-                        _logger.LogError("No client available.");
-                        break;
-                    }
-
                     await DestroyAllProjects();
                     break;
                 }
                 case ConsoleKey.D4: {
-                    if (Client is null) {
-                        _logger.LogError("No client available.");
-                        break;
+                    var sw = Stopwatch.StartNew();
+                    var rooms = await Client.Homeserver.GetJoinedRooms();
+                    Console.WriteLine(rooms.Count() + " rooms.");
+                    var projectCount = 0;
+                    await foreach (var room in Client.Homeserver.GetJoinedRoomsByType("gay.rory.bugmine.project").WithCancellation(stoppingToken)) {
+                        projectCount++;
                     }
 
-                    var rooms = await Client.Homeserver.GetJoinedRooms();
-                    Console.WriteLine(rooms.Count());
+                    Console.WriteLine($"{projectCount} projects ({rooms.Count} rooms) queried in {sw.Elapsed}");
                     break;
                 }
+                case ConsoleKey.D5: {
+                    await SummarizeAllProjects();
+                    break;
+                }
+                case ConsoleKey.D6: {
+                    var sw = Stopwatch.StartNew();
+                    await Task.WhenAll(Enumerable.Range(0,1000).Select(async _ => {
+                        await Client.Homeserver.CreateRoom(new() {
+                            Name = Guid.NewGuid().ToString()[..8]
+                        });
+                    }));
+                    Console.WriteLine($"Created 1000 rooms in {sw.Elapsed}");
+                    break;
+                }
+                case ConsoleKey.L: {
+                    File.Delete("auth.json");
+                    await ExecuteAsync(stoppingToken);
+                    return;
+                }
+                case ConsoleKey.Q: {
+                    Environment.Exit(0);
+                    return;
+                }
             }
         }
     }
 
     private async Task DestroyAllProjects() {
-        var ss = new SemaphoreSlim(4, 4);
-        await foreach (var proj in Client.Homeserver.GetJoinedRoomsByType(null!)) {
-            if (proj.RoomId == "!UktPWOzit8gmms5FQ6:conduit.matrixunittests.rory.gay") continue;
+        var ss = new SemaphoreSlim(48, 48);
+        await foreach (var proj in Client.Homeserver.GetJoinedRoomsByType("gay.rory.bugmine.project")) {
             Task.Run(async () => {
                 // await ss.WaitAsync();
-                await proj.SendStateEventAsync(RoomNameEventContent.EventId, new RoomNameEventContent() {
-                    Name = "Disbanded BugMine project."
-                });
-                await proj.SendStateEventAsync(RoomJoinRulesEventContent.EventId, new RoomJoinRulesEventContent() {
-                    JoinRule = RoomJoinRulesEventContent.JoinRules.Private
-                });
-                await proj.SendStateEventAsync(RoomCanonicalAliasEventContent.EventId, new RoomCanonicalAliasEventContent() {
-                    Alias = null
-                });
+                // await proj.SendStateEventAsync(RoomNameEventContent.EventId, new RoomNameEventContent() {
+                //     Name = "Disbanded BugMine project."
+                // });
+                // await proj.SendStateEventAsync(RoomJoinRulesEventContent.EventId, new RoomJoinRulesEventContent() {
+                //     JoinRule = RoomJoinRulesEventContent.JoinRules.Private
+                // });
+                // await proj.SendStateEventAsync(RoomCanonicalAliasEventContent.EventId, new RoomCanonicalAliasEventContent() {
+                //     Alias = null
+                // });
                 await proj.LeaveAsync("Disbanded room.");
                 // ss.Release();
             });
@@ -106,18 +123,59 @@ public class Worker(ILogger<Worker> logger, HomeserverProviderService hsProvider
 
     private async Task MassCreateProjects() {
         // var rooms = await Client.Homeserver.GetJoinedRooms();
-        // List<string> roomNames = (await Task.WhenAll(rooms.Select(x => x.GetNameAsync()))).Where(x => x != null).ToList();
+        // List<string> roomNames = (await Task.WhenAll(rooms.Select(x => x.GetNameAsync()))).Where(x => x != 
+        var tasks = new List<Task>();
         for (int i = 0; i < 500; i++) {
-            Task.Run(async () => {
+            tasks.Add(Task.Run(async () => {
                 // var randomName = roomNames[Random.Shared.Next(roomNames.Count)];
                 var proj = await Client.CreateProject(new() {
                     Name = /*randomName + */Guid.NewGuid().ToString()[..8]
                 });
 
                 // await proj.CreateIssue(new() {
-                // Name = "meow"
+                //     Name = "meow"
                 // });
-            });
+                await CreateRandomIssues(proj, Random.Shared.Next(20));
+            }));
+            // await Task.Delay(250);
+        }
+
+        await Task.WhenAll(tasks);
+    }
+
+    private async Task<string> SummarizeProject(BugMineProject project) {
+        string result = $"Project: {project.Info.Name}, slug: {project.ProjectSlug}, metadata: {project.Metadata.ToJson(indent: false)}";
+        await foreach (var issue in project.GetIssues()) {
+            // Console.WriteLine($" - {issue.Data.RawContent.ToJson(indent: false)}");
+            result += $"\n - {issue.Data.RawContent.ToJson(indent: false)}";
+        }
+
+        return result;
+    }
+
+    private async Task SummarizeAllProjects() {
+        var sw = Stopwatch.StartNew();
+        var tasks = new List<Task<string>>();
+        await foreach (var project in Client.GetProjects()) {
+            tasks.Add(SummarizeProject(project));
+        }
+
+        int projects = 0;
+        int issues = 0;
+        await foreach (var res in tasks.ToAsyncEnumerable()) {
+            Console.WriteLine(res + "\n");
+            projects++;
+            issues += res.Count(x => x == '\n');
         }
+
+        Console.WriteLine($"Summarized {projects} projects with {issues} issues in {sw.Elapsed}");
+    }
+
+    private async Task CreateRandomIssues(BugMineProject project, int count) {
+        await Task.WhenAll(Enumerable.Range(0, count).Select(async i => {
+            await project.CreateIssue(new() {
+                Name = $"Issue {i} @ {DateTime.Now}"
+            });
+        }));
     }
 }
\ No newline at end of file