about summary refs log tree commit diff
path: root/BugMine.CLI/Program.cs
blob: 6471e43cbbf9614b5c2eaec6fde193abb4bf63e9 (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
using System.Text.Json;
using ArcaneLibs;
using ArcaneLibs.Extensions;
using BugMine.CLI;
using BugMine.CLI.Interfaces;
using BugMine.CLI.TUIMenus;
using BugMine.Web.Classes;using LibMatrix.Responses;
using LibMatrix.Services;

var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddBugMine(new() { AppName = "BugMine CLI" });

builder.Services.AddSingleton<BugMineClient>(a => {
    var hsp = a.GetRequiredService<HomeserverProviderService>();
    return getClient(hsp, args.Length == 0).GetAwaiter().GetResult(); // We can't use async here, so we have to block
});

if (args.Length == 0) {
    Console.WriteLine("Starting interactive client...");
    builder.Services.AddHostedService<InteractiveClient>();
    // builder.Services.AddSingleton<BaseTUIMenu, MainTUIMenu>();
    var menus = new ClassCollector<BaseTUIMenu>().ResolveFromAllAccessibleAssemblies();
    foreach (var menu in menus) {
        Console.WriteLine($"Adding menu {menu.Name}");
        builder.Services.AddSingleton(menu);
        builder.Services.AddSingleton(typeof(BaseTUIMenu), menu);
    }
}
else {
    Console.WriteLine($"Starting CLI client with {args.Length} args: {string.Join(",", args)}");
    builder.Services.AddHostedService<CLIClient>();
}

var host = builder.Build();
host.Run();


async Task<LoginResponse> findAuth(HomeserverProviderService hsProvider, bool interactive = true) {
    Console.WriteLine($"findAuth entered with hsProvider={{{hsProvider.GetHashCode()}}}, interactive={interactive}");
    if (File.Exists("auth.json")) {
        return JsonSerializer.Deserialize<LoginResponse>(File.ReadAllText("auth.json"));
    }
    else {
        if (!interactive) {
            Console.WriteLine("Could not locate account information. Please log in interactively or use `BugMine.CLI login <mxid> <password>`.");
            Environment.Exit(1);
        }
        Console.Write("Homeserver: ");
        var homeserver = Console.ReadLine()!;
        Console.Write("Username: ");
        var username = Console.ReadLine()!;
        Console.Write("Password: ");
        var password = Console.ReadLine()!;

        var login = hsProvider.Login(homeserver, username, password).GetAwaiter().GetResult();
        File.WriteAllText("auth.json", login.ToJson());
        return login;
    }
}

async Task<BugMineClient> getClient(HomeserverProviderService hsProvider, bool interactive) {
    var auth = await findAuth(hsProvider, interactive);
    return new BugMineClient(await hsProvider.GetAuthenticatedWithToken(auth.Homeserver, auth.AccessToken, useGeneric: true));
}