using Quasar.Server.Networking; using Quasar.Server.Utilities; using System; using System.Globalization; using System.Net.Sockets; using System.Windows.Forms; using Quasar.Server.Models; namespace Quasar.Server.Forms { public partial class FrmSettings : Form { private readonly QuasarServer _listenServer; public FrmSettings(QuasarServer listenServer) { this._listenServer = listenServer; InitializeComponent(); ToggleListenerSettings(!listenServer.Listening); ShowPassword(false); } private void FrmSettings_Load(object sender, EventArgs e) { ncPort.Value = Settings.ListenPort; chkIPv6Support.Checked = Settings.IPv6Support; chkAutoListen.Checked = Settings.AutoListen; chkPopup.Checked = Settings.ShowPopup; chkUseUpnp.Checked = Settings.UseUPnP; chkShowTooltip.Checked = Settings.ShowToolTip; chkNoIPIntegration.Checked = Settings.EnableNoIPUpdater; txtNoIPHost.Text = Settings.NoIPHost; txtNoIPUser.Text = Settings.NoIPUsername; txtNoIPPass.Text = Settings.NoIPPassword; } private ushort GetPortSafe() { var portValue = ncPort.Value.ToString(CultureInfo.InvariantCulture); ushort port; return (!ushort.TryParse(portValue, out port)) ? (ushort)0 : port; } private void btnListen_Click(object sender, EventArgs e) { ushort port = GetPortSafe(); if (port == 0) { MessageBox.Show("Please enter a valid port > 0.", "Please enter a valid port", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (btnListen.Text == "Start listening" && !_listenServer.Listening) { try { if(chkNoIPIntegration.Checked) NoIpUpdater.Start(); _listenServer.Listen(port, chkIPv6Support.Checked, chkUseUpnp.Checked); ToggleListenerSettings(false); } catch (SocketException ex) { if (ex.ErrorCode == 10048) { MessageBox.Show(this, "The port is already in use.", "Socket Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { MessageBox.Show(this, $"An unexpected socket error occurred: {ex.Message}\n\nError Code: {ex.ErrorCode}\n\n", "Unexpected Socket Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } _listenServer.Disconnect(); } catch (Exception) { _listenServer.Disconnect(); } } else if (btnListen.Text == "Stop listening" && _listenServer.Listening) { _listenServer.Disconnect(); ToggleListenerSettings(true); } } private void btnSave_Click(object sender, EventArgs e) { ushort port = GetPortSafe(); if (port == 0) { MessageBox.Show("Please enter a valid port > 0.", "Please enter a valid port", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } Settings.ListenPort = port; Settings.IPv6Support = chkIPv6Support.Checked; Settings.AutoListen = chkAutoListen.Checked; Settings.ShowPopup = chkPopup.Checked; Settings.UseUPnP = chkUseUpnp.Checked; Settings.ShowToolTip = chkShowTooltip.Checked; Settings.EnableNoIPUpdater = chkNoIPIntegration.Checked; Settings.NoIPHost = txtNoIPHost.Text; Settings.NoIPUsername = txtNoIPUser.Text; Settings.NoIPPassword = txtNoIPPass.Text; this.Close(); } private void btnCancel_Click(object sender, EventArgs e) { if (MessageBox.Show("Discard your changes?", "Cancel", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) this.Close(); } private void chkNoIPIntegration_CheckedChanged(object sender, EventArgs e) { NoIPControlHandler(chkNoIPIntegration.Checked); } private void ToggleListenerSettings(bool enabled) { btnListen.Text = enabled ? "Start listening" : "Stop listening"; ncPort.Enabled = enabled; chkIPv6Support.Enabled = enabled; chkUseUpnp.Enabled = enabled; } private void NoIPControlHandler(bool enable) { lblHost.Enabled = enable; lblUser.Enabled = enable; lblPass.Enabled = enable; txtNoIPHost.Enabled = enable; txtNoIPUser.Enabled = enable; txtNoIPPass.Enabled = enable; chkShowPassword.Enabled = enable; } private void ShowPassword(bool show = true) { txtNoIPPass.PasswordChar = (show) ? (char)0 : (char)'●'; } private void chkShowPassword_CheckedChanged(object sender, EventArgs e) { ShowPassword(chkShowPassword.Checked); } } }