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));
}
|