about summary refs log tree commit diff
path: root/BugMine.DevTools.CLI/Worker.cs
blob: 8cd931e87b06aa20f0ac9817c7ab7e1aeacff484 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
using System.Text.Json;
using ArcaneLibs.Extensions;
using BugMine.Web.Classes;
using LibMatrix.EventTypes.Spec.State;
using LibMatrix.Responses;
using LibMatrix.Services;

namespace BugMine.DevTools.CLI;

public class Worker(ILogger<Worker> logger, HomeserverProviderService hsProvider) : BackgroundService {
    private readonly ILogger<Worker> _logger = logger;
    private BugMineClient? Client { get; set; }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
        if (!File.Exists("auth.json")) {
            Console.Write("Homeserver: ");
            var homeserver = Console.ReadLine()!;
            Console.Write("Username: ");
            var username = Console.ReadLine()!;
            Console.Write("Password: ");
            var password = Console.ReadLine()!;

            var login = await hsProvider.Login(homeserver, username, password);
            await File.WriteAllTextAsync("auth.json", login.ToJson(), stoppingToken);
        }

        var auth = await JsonSerializer.DeserializeAsync<LoginResponse>(File.OpenRead("auth.json"));
        Client = new BugMineClient(await hsProvider.GetAuthenticatedWithToken(auth.Homeserver, auth.AccessToken, useGeneric: true));

        while (!stoppingToken.IsCancellationRequested) {
            Console.WriteLine("""
                              1) List all projects
                              2) Create 500 projects
                              3) Destroy all projects
                              4) Get room count
                              """);

            var input = Console.ReadKey();
            Console.WriteLine();
            switch (input.Key) {
                case ConsoleKey.D1: {
                    if (Client is null) {
                        _logger.LogError("No client available.");
                        break;
                    }

                    var projects = Client.GetProjects();
                    await foreach (var project in projects) {
                        Console.WriteLine(project.ToJson(indent: false));
                    }

                    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 rooms = await Client.Homeserver.GetJoinedRooms();
                    Console.WriteLine(rooms.Count());
                    break;
                }
            }
        }
    }

    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;
            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.LeaveAsync("Disbanded room.");
                // ss.Release();
            });
        }
    }

    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();
        for (int i = 0; i < 500; i++) {
            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"
                // });
            });
        }
    }
}