about summary refs log tree commit diff
path: root/ModerationClient/Views/UserManagementWindow.axaml.cs
blob: f5b4d5698a11f245ca25a9a10fb1677a5f25deb3 (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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using System;
using System.IO;
using ArcaneLibs.Extensions;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Diagnostics;
using Avalonia.Input;
using Avalonia.Interactivity;
using LibMatrix.Homeservers;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using ModerationClient.Services;
using ModerationClient.ViewModels;

namespace ModerationClient.Views;

public partial class UserManagementWindow : Window {
    private readonly CommandLineConfiguration _cfg;
    private readonly MatrixAuthenticationService _auth;

    public UserManagementWindow(CommandLineConfiguration cfg, MainWindowViewModel dataContext, IHostApplicationLifetime appLifetime,
        UserManagementViewModel userManagementViewModel, MatrixAuthenticationService auth) {
        _cfg = cfg;
        _auth = auth;
        InitializeComponent();
        DataContext = dataContext;
        dataContext.CurrentViewModel = userManagementViewModel;
        Console.WriteLine("mainwnd");
#if DEBUG
        this.AttachDevTools(new DevToolsOptions() {
            ShowAsChildWindow = true,
            LaunchView = DevToolsViewKind.LogicalTree,
        });
#endif
        PropertyChanged += (sender, args) => {
            // Console.WriteLine($"MainWindow PropertyChanged: {args.Property.Name} ({args.OldValue} -> {args.NewValue})");
            switch (args.Property.Name) {
                case nameof(ClientSize): {
                    if (DataContext is not MainWindowViewModel viewModel) {
                        Console.WriteLine("WARN: MainWindowViewModel is null, ignoring ClientSize change!");
                        return;
                    }

                    viewModel.PhysicalSize = new Size(ClientSize.Width, ClientSize.Height - TopPanel.Bounds.Height);
                    break;
                }
            }
        };

        TopPanel.PropertyChanged += (_, args) => {
            if (args.Property.Name == nameof(TopPanel.Bounds)) {
                if (DataContext is not MainWindowViewModel viewModel) {
                    Console.WriteLine("WARN: MainWindowViewModel is null, ignoring TopPanel.Bounds change!");
                    return;
                }

                viewModel.PhysicalSize = new Size(ClientSize.Width, ClientSize.Height - TopPanel.Bounds.Height);
            }
        };

        dataContext.AuthService.PropertyChanged += (sender, args) => {
            if (args.PropertyName == nameof(MatrixAuthenticationService.IsLoggedIn)) {
                if (dataContext.AuthService.IsLoggedIn) {
                    // dataContext.CurrentViewModel = new ClientViewModel(dataContext.AuthService);
                    dataContext.CurrentViewModel = App.Current.Host.Services.GetRequiredService<ClientViewModel>();
                }
                else {
                    Close();
                }
            }
        };

        dataContext.Scale = cfg.Scale;
        Width *= cfg.Scale;
        Height *= cfg.Scale;

        appLifetime.ApplicationStopping.Register(() => {
            Console.WriteLine("ApplicationStopping triggered");
            Close();
        });
    }

    protected override void OnKeyDown(KeyEventArgs e) => OnKeyDown(this, e);

    private void OnKeyDown(object? _, KeyEventArgs e) {
        if (DataContext is not MainWindowViewModel viewModel) {
            Console.WriteLine($"WARN: DataContext is {DataContext?.GetType().Name ?? "null"}, ignoring key press!");
            return;
        }

        // Console.WriteLine("MainWindow KeyDown: " + e.Key);
        if (e.Key == Key.Escape) {
            viewModel.Scale = 1.0f;
        }
        else if (e.Key == Key.F1) {
            viewModel.Scale -= 0.1f;
            if (viewModel.Scale < 0.1f) {
                viewModel.Scale = 0.1f;
            }
        }
        else if (e.Key == Key.F2) {
            viewModel.Scale += 0.1f;
            if (viewModel.Scale > 5.0f) {
                viewModel.Scale = 5.0f;
            }
        }
        else if (e.Key == Key.K && e.KeyModifiers == KeyModifiers.Control) {
            if (viewModel.CurrentViewModel is ClientViewModel clientViewModel) {
                Console.WriteLine("QuickSwitcher invoked");
            }
            else Console.WriteLine("WARN: CurrentViewModel is not ClientViewModel, ignoring Quick Switcher");
        }
    }

    // ReSharper disable once AsyncVoidMethod
    private async void PuppetButtonClicked(object? sender, RoutedEventArgs e) {
        if (e.Source is not Button button) {
            Console.WriteLine("WARN: Source is not Button, ignoring PuppetButtonClicked!");
            return;
        }

        if (button.Tag is not SynapseAdminUser user) {
            Console.WriteLine("WARN: Tag is not User, ignoring PuppetButtonClicked!");
            return;
        }

        if (_auth.Homeserver is not AuthenticatedHomeserverSynapse synapse) {
            Console.WriteLine("WARN: Homeserver is not Synapse, ignoring PuppetButtonClicked!");
            return;
        }

        var puppet = await synapse.Admin.LoginUserAsync(user.Name, TimeSpan.FromMinutes(5));
        // var currentProcess = System.Diagnostics.Process.GetCurrentProcess().MainModule!.FileName;
        // if(Path.GetFileName(currentProcess) == "dotnet") {
        //     Console.WriteLine("WARN: Running in dotnet, trying again...!");
        //     // get the path to the current executable
        //     var path = System.Reflection.Assembly.GetEntryAssembly()!.Location;
        //     Console.WriteLine(path);
        //     return;
        // }
        System.Diagnostics.Process.Start("steam-run", ["dotnet", System.Reflection.Assembly.GetEntryAssembly()!.Location, "--", ..(_cfg with { IsTemporary = true, LoginData = puppet.ToJson() }).Serialise()]);
    }
}