diff --git a/app/.idea/.idea.DiscordHistoryTracker/.idea/avalonia.xml b/app/.idea/.idea.DiscordHistoryTracker/.idea/avalonia.xml index 0642693..39aca8e 100644 --- a/app/.idea/.idea.DiscordHistoryTracker/.idea/avalonia.xml +++ b/app/.idea/.idea.DiscordHistoryTracker/.idea/avalonia.xml @@ -9,9 +9,11 @@ + + diff --git a/app/Desktop/Main/Controls/ServerConfigurationPanel.axaml b/app/Desktop/Main/Controls/ServerConfigurationPanel.axaml new file mode 100644 index 0000000..f1a504b --- /dev/null +++ b/app/Desktop/Main/Controls/ServerConfigurationPanel.axaml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/Desktop/Main/Controls/ServerConfigurationPanel.axaml.cs b/app/Desktop/Main/Controls/ServerConfigurationPanel.axaml.cs new file mode 100644 index 0000000..cac5153 --- /dev/null +++ b/app/Desktop/Main/Controls/ServerConfigurationPanel.axaml.cs @@ -0,0 +1,16 @@ +using System.Diagnostics.CodeAnalysis; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace DHT.Desktop.Main.Controls { + [SuppressMessage("ReSharper", "MemberCanBeInternal")] + public sealed class ServerConfigurationPanel : UserControl { + public ServerConfigurationPanel() { + InitializeComponent(); + } + + private void InitializeComponent() { + AvaloniaXamlLoader.Load(this); + } + } +} diff --git a/app/Desktop/Main/Controls/ServerConfigurationPanelModel.cs b/app/Desktop/Main/Controls/ServerConfigurationPanelModel.cs new file mode 100644 index 0000000..b96767e --- /dev/null +++ b/app/Desktop/Main/Controls/ServerConfigurationPanelModel.cs @@ -0,0 +1,116 @@ +using System; +using Avalonia.Controls; +using DHT.Desktop.Dialogs.Message; +using DHT.Desktop.Server; +using DHT.Server.Database; +using DHT.Server.Service; +using DHT.Utils.Models; + +namespace DHT.Desktop.Main.Controls { + sealed class ServerConfigurationPanelModel : BaseModel, IDisposable { + private string inputPort; + + public string InputPort { + get => inputPort; + set { + Change(ref inputPort, value); + OnPropertyChanged(nameof(HasMadeChanges)); + } + } + + private string inputToken; + + public string InputToken { + get => inputToken; + set { + Change(ref inputToken, value); + OnPropertyChanged(nameof(HasMadeChanges)); + } + } + + public bool HasMadeChanges => ServerManager.Port.ToString() != InputPort || ServerManager.Token != InputToken; + + private bool isToggleServerButtonEnabled = true; + + public bool IsToggleServerButtonEnabled { + get => isToggleServerButtonEnabled; + set => Change(ref isToggleServerButtonEnabled, value); + } + + public string ToggleServerButtonText => serverManager.IsRunning ? "Stop Server" : "Start Server"; + + public event EventHandler? ServerStatusChanged; + + private readonly Window window; + private readonly ServerManager serverManager; + + [Obsolete("Designer")] + public ServerConfigurationPanelModel() : this(null!, new ServerManager(DummyDatabaseFile.Instance)) {} + + public ServerConfigurationPanelModel(Window window, ServerManager serverManager) { + this.window = window; + this.serverManager = serverManager; + this.inputPort = ServerManager.Port.ToString(); + this.inputToken = ServerManager.Token; + } + + public void Initialize() { + ServerLauncher.ServerStatusChanged += ServerLauncherOnServerStatusChanged; + } + + public void Dispose() { + ServerLauncher.ServerStatusChanged -= ServerLauncherOnServerStatusChanged; + } + + private void ServerLauncherOnServerStatusChanged(object? sender, EventArgs e) { + ServerStatusChanged?.Invoke(this, serverManager.IsRunning ? StatusBarModel.Status.Ready : StatusBarModel.Status.Stopped); + OnPropertyChanged(nameof(ToggleServerButtonText)); + IsToggleServerButtonEnabled = true; + } + + private void BeforeServerStart() { + IsToggleServerButtonEnabled = false; + ServerStatusChanged?.Invoke(this, StatusBarModel.Status.Starting); + } + + private void StartServer() { + BeforeServerStart(); + serverManager.Launch(); + } + + private void StopServer() { + IsToggleServerButtonEnabled = false; + ServerStatusChanged?.Invoke(this, StatusBarModel.Status.Stopping); + serverManager.Stop(); + } + + public void OnClickToggleServerButton() { + if (serverManager.IsRunning) { + StopServer(); + } + else { + StartServer(); + } + } + + public void OnClickRandomizeToken() { + InputToken = ServerUtils.GenerateRandomToken(20); + } + + public async void OnClickApplyChanges() { + if (!ushort.TryParse(InputPort, out ushort port)) { + await Dialog.ShowOk(window, "Invalid Port", "Port must be a number between 0 and 65535."); + return; + } + + BeforeServerStart(); + serverManager.Relaunch(port, InputToken); + OnPropertyChanged(nameof(HasMadeChanges)); + } + + public void OnClickCancelChanges() { + InputPort = ServerManager.Port.ToString(); + InputToken = ServerManager.Token; + } + } +} diff --git a/app/Desktop/Main/MainContentScreen.axaml b/app/Desktop/Main/MainContentScreen.axaml index 64b3154..32cf416 100644 --- a/app/Desktop/Main/MainContentScreen.axaml +++ b/app/Desktop/Main/MainContentScreen.axaml @@ -12,7 +12,7 @@ - - - - - To start tracking messages, copy the tracking script and paste it into the console of either the Discord app, or your browser. The console is usually opened by pressing Ctrl+Shift+I. - - - - - - - - - - + By default, the Discord app does not allow opening the console. The button below will change a hidden setting in the Discord app that controls whether the Ctrl+Shift+I shortcut is enabled.