private void Shutdown()
 {
     shut = new ShutdownWindow();
     shut.ShowDialog();
 }
        private async Task StartStopServerAsync(Server server)
        {
            if (server == null)
            {
                return;
            }

            var serverRuntime       = server.Runtime;
            var serverProfile       = server.Profile;
            MessageBoxResult result = MessageBoxResult.None;

            switch (serverRuntime.Status)
            {
            case ServerStatus.Initializing:
            case ServerStatus.Running:
                // check if the server is initialising.
                if (serverRuntime.Status == ServerStatus.Initializing)
                {
                    result = MessageBox.Show(_globalizer.GetResourceString("ServerSettings_StartServer_StartingLabel"), _globalizer.GetResourceString("ServerSettings_StartServer_StartingTitle"), MessageBoxButton.YesNo, MessageBoxImage.Warning);
                    if (result == MessageBoxResult.No)
                    {
                        return;
                    }

                    try
                    {
                        PluginHelper.Instance.ProcessAlert(AlertType.Shutdown, serverProfile.ProfileName, Config.Default.Alert_ServerStopMessage);
                        await Task.Delay(2000);

                        await server.StopAsync();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, _globalizer.GetResourceString("ServerSettings_StopServer_FailedTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
                    }
                }
                else
                {
                    try
                    {
                        var shutdownWindow = ShutdownWindow.OpenShutdownWindow(server);
                        if (shutdownWindow == null)
                        {
                            MessageBox.Show(_globalizer.GetResourceString("ServerSettings_ShutdownServer_AlreadyOpenLabel"), _globalizer.GetResourceString("ServerSettings_ShutdownServer_FailedTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
                            return;
                        }

                        shutdownWindow.Owner   = Window.GetWindow(this);
                        shutdownWindow.Closed += Window_Closed;
                        shutdownWindow.Show();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, _globalizer.GetResourceString("ServerSettings_ShutdownServer_FailedTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
                    }
                }
                break;

            case ServerStatus.Stopped:
                Mutex mutex      = null;
                bool  createdNew = false;

                try
                {
                    // try to establish a mutex for the profile.
                    mutex = new Mutex(true, ServerApp.GetMutexName(serverProfile.InstallDirectory), out createdNew);

                    // check if the mutex was established
                    if (createdNew)
                    {
                        serverProfile.Save(false, false, null);

                        if (Config.Default.ServerUpdate_OnServerStart)
                        {
                            if (!await UpdateServerAsync(server, false, true, Config.Default.ServerUpdate_UpdateModsWhenUpdatingServer, true))
                            {
                                if (MessageBox.Show(_globalizer.GetResourceString("ServerUpdate_WarningLabel"), _globalizer.GetResourceString("ServerUpdate_Title"), MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes)
                                {
                                    return;
                                }
                            }
                        }

                        if (!serverProfile.Validate(false, out string validateMessage))
                        {
                            var outputMessage = _globalizer.GetResourceString("ProfileValidation_WarningLabel").Replace("{validateMessage}", validateMessage);
                            if (MessageBox.Show(outputMessage, _globalizer.GetResourceString("ProfileValidation_Title"), MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes)
                            {
                                return;
                            }
                        }

                        await server.StartAsync();

                        var startupMessage = Config.Default.Alert_ServerStartedMessage;
                        if (Config.Default.Alert_ServerStartedMessageIncludeIPandPort)
                        {
                            startupMessage += $" {Config.Default.MachinePublicIP}:{serverProfile.QueryPort}";
                        }
                        PluginHelper.Instance.ProcessAlert(AlertType.Startup, serverProfile.ProfileName, startupMessage);

                        await Task.Delay(2000);
                    }
                    else
                    {
                        // display an error message and exit
                        MessageBox.Show(_globalizer.GetResourceString("ServerSettings_StartServer_MutexFailedLabel"), _globalizer.GetResourceString("ServerSettings_StartServer_FailedTitle"), MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, _globalizer.GetResourceString("ServerSettings_StartServer_FailedTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
                }
                finally
                {
                    if (mutex != null)
                    {
                        if (createdNew)
                        {
                            mutex.ReleaseMutex();
                            mutex.Dispose();
                        }
                        mutex = null;
                    }
                }
                break;
            }
        }