From 2cd80970a4c23b21fc3607d4ed31a60872c248c5 Mon Sep 17 00:00:00 2001
From: Heavy Bob <ferrettclay@gmail.com>
Date: Mon, 7 Apr 2025 10:11:12 +1000
Subject: [PATCH] Removed Buttons, fixed application detect + other stuff

When attempting to run the app and close, it wouldn't actually close...
Set default states when starcitizen isn't running to unknown.
Start reading file when starcitizen is detected. Stop when starcitizen isn't running.

Issue, Need to fix reading file when game is already running.
---
 AutoTrackR2/HomePage.xaml      | 208 ++++++++++++++++++++-----
 AutoTrackR2/HomePage.xaml.cs   | 270 +++++++++++++++++++++++++++------
 AutoTrackR2/LocalPlayerData.cs |   5 +-
 AutoTrackR2/LogHandler.cs      |  70 +++++----
 AutoTrackR2/MainWindow.xaml.cs |  58 +++----
 5 files changed, 456 insertions(+), 155 deletions(-)

diff --git a/AutoTrackR2/HomePage.xaml b/AutoTrackR2/HomePage.xaml
index d1e2557..9c08122 100644
--- a/AutoTrackR2/HomePage.xaml
+++ b/AutoTrackR2/HomePage.xaml
@@ -1,48 +1,176 @@
 <UserControl x:Class="AutoTrackR2.HomePage"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             Height="396" Width="626">
-    <Grid Background="{DynamicResource BackgroundLightBrush}">
-        <!-- Main Layout Grid -->
-        <Grid Margin="0,0,5,7">
-            <Grid.RowDefinitions>
-                <!-- One row for the content, the other for buttons -->
-                <RowDefinition Height="*" />
-                <RowDefinition Height="Auto" />
-            </Grid.RowDefinitions>
+             Height="396"
+             Width="626">
+        <Grid Background="{DynamicResource BackgroundLightBrush}">
+                <!-- Main Layout Grid -->
+                <Grid Margin="0,0,5,7">
+                        <Grid.RowDefinitions>
+                                <!-- One row for the content, the other for buttons -->
+                                <RowDefinition Height="*"/>
+                                <RowDefinition Height="Auto"/>
+                        </Grid.RowDefinitions>
 
-            <Grid.ColumnDefinitions>
-                <!-- Left column for the main content area -->
-                <ColumnDefinition />
-                <!-- Right column for the buttons -->
-                <ColumnDefinition Width="Auto" MinWidth="173" />
-            </Grid.ColumnDefinitions>
+                        <Grid.ColumnDefinitions>
+                                <!-- Left column for the main content area -->
+                                <ColumnDefinition/>
+                                <!-- Right column for the buttons -->
+                                <ColumnDefinition Width="Auto"
+                                                  MinWidth="173"/>
+                        </Grid.ColumnDefinitions>
 
-            <!-- Border for the kill feed section -->
-            <!--TextBox Name="OutputTextBox" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Height="NaN" Margin="0,0,20,0" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" IsReadOnly="True" Style="{StaticResource RoundedTextBox}"/-->
-            <Border Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" BorderBrush="{DynamicResource AccentBrush}" BorderThickness="2" CornerRadius="5" Padding="10,0,0,0" Background="{DynamicResource BackgroundDarkBrush}" Margin="0,0,20,0">
-                <ScrollViewer VerticalScrollBarVisibility="Auto" Width="419" Margin="0,0,-5,0">
-                    <StackPanel Name="KillFeedStackPanel" Orientation="Vertical" Margin="0,0,0,0" Width="402" HorizontalAlignment="Left"/>
-                </ScrollViewer>
-            </Border>
+                        <!-- Border for the kill feed section -->
+                        <!--TextBox Name="OutputTextBox" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Height="NaN" Margin="0,0,20,0" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" IsReadOnly="True" Style="{StaticResource RoundedTextBox}"/-->
+                        <Border Grid.Row="0"
+                                Grid.Column="0"
+                                Grid.RowSpan="2"
+                                BorderBrush="{DynamicResource AccentBrush}"
+                                BorderThickness="2"
+                                CornerRadius="5"
+                                Padding="10,0,0,0"
+                                Background="{DynamicResource BackgroundDarkBrush}"
+                                Margin="0,0,20,0">
+                                <ScrollViewer VerticalScrollBarVisibility="Auto"
+                                              Width="419"
+                                              Margin="0,0,-5,0">
+                                        <StackPanel Name="KillFeedStackPanel"
+                                                    Orientation="Vertical"
+                                                    Margin="0,0,0,0"
+                                                    Width="402"
+                                                    HorizontalAlignment="Left"/>
+                                </ScrollViewer>
+                        </Border>
 
-            <!-- StackPanel for Start and Stop buttons -->
-            <Border Background="{DynamicResource BackgroundDarkBrush}" BorderBrush="{DynamicResource AccentBrush}" Grid.Row="0" Grid.Column="1" BorderThickness="2" CornerRadius="5" Margin="0,0,0,82"/>
-            <StackPanel Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" Height="269" Width="152">
-                <TextBlock Name="PilotNameTitle" Text="Pilot" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,5,0,0" Foreground="{DynamicResource AltTextBrush}" FontSize="14"/>
-                <TextBlock Name="PilotNameTextBox" Text="" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,0,0,0" Foreground="{DynamicResource TextBrush}" FontSize="10" TextAlignment="Center"/>
-                <TextBlock Name="PlayerShipTitle" Text="Ship" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,5,0,0" Foreground="{DynamicResource AltTextBrush}" FontSize="14" />
-                <TextBlock Name="PlayerShipTextBox" Text="" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,0,0,0" Foreground="{DynamicResource TextBrush}" FontSize="10" TextAlignment="Center"/>
-                <TextBlock Name="GameModeTitle" Text="Game Mode" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,5,0,0" Foreground="{DynamicResource AltTextBrush}" FontSize="14"/>
-                <TextBlock Name="GameModeTextBox" Text="" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,0,0,0" Foreground="{DynamicResource TextBrush}" FontSize="10" TextAlignment="Center"/>
-                <TextBlock Name="KillTallyTitle" Text="Kill Tally" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,5,0,0" Foreground="{DynamicResource AltTextBrush}" FontSize="14"/>
-                <TextBlock Name="KillTallyTextBox" Text="" Width="152" Height="20" Background="Transparent" FontFamily="{StaticResource Orbitron}" Margin="0,0,0,0" Foreground="{DynamicResource TextBrush}" FontSize="10" TextAlignment="Center"/>
-                <TextBox x:Name="DebugPanel" Text="" Width="152" Height="98" Background="Transparent" FontFamily="{StaticResource Orbitron}" Foreground="{DynamicResource TextBrush}" FontSize="8" BorderThickness="0" Margin="0,9,0,0"/>
-            </StackPanel>
-            <StackPanel Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" Height="120" Width="172" >
-                <Button Name="StartButton" Content="Start" Width="100" Height="40" Style="{StaticResource ButtonStyle}" FontFamily="{StaticResource Orbitron}" Margin="0,20" Click="StartButton_Click"/>
-                <Button Name="StopButton" Content="Stop" Width="100" Height="40" Style="{StaticResource DisabledButtonStyle}" FontFamily="{StaticResource Orbitron}" IsEnabled="False" Click="StopButton_Click"/>
-            </StackPanel>
+                        <!-- StackPanel for Start and Stop buttons -->
+                        <Border Background="{DynamicResource BackgroundDarkBrush}"
+                                BorderBrush="{DynamicResource AccentBrush}"
+                                Grid.Row="0"
+                                Grid.Column="1"
+                                BorderThickness="2"
+                                CornerRadius="5"
+                                Margin="0,0,0,82"/>
+                        <StackPanel Grid.Column="1"
+                                    VerticalAlignment="Center"
+                                    HorizontalAlignment="Center"
+                                    Height="269"
+                                    Width="152">
+                                <TextBlock Name="PilotNameTitle"
+                                           Text="Pilot"
+                                           Width="152"
+                                           Height="20"
+                                           Background="Transparent"
+                                           FontFamily="{StaticResource Orbitron}"
+                                           Margin="0,5,0,0"
+                                           Foreground="{DynamicResource AltTextBrush}"
+                                           FontSize="14"/>
+                                <TextBlock Name="PilotNameTextBox"
+                                           Text=""
+                                           Width="152"
+                                           Height="20"
+                                           Background="Transparent"
+                                           FontFamily="{StaticResource Orbitron}"
+                                           Margin="0,0,0,0"
+                                           Foreground="{DynamicResource TextBrush}"
+                                           FontSize="10"
+                                           TextAlignment="Center"/>
+                                <TextBlock Name="PlayerShipTitle"
+                                           Text="Ship"
+                                           Width="152"
+                                           Height="20"
+                                           Background="Transparent"
+                                           FontFamily="{StaticResource Orbitron}"
+                                           Margin="0,5,0,0"
+                                           Foreground="{DynamicResource AltTextBrush}"
+                                           FontSize="14"/>
+                                <TextBlock Name="PlayerShipTextBox"
+                                           Text=""
+                                           Width="152"
+                                           Height="20"
+                                           Background="Transparent"
+                                           FontFamily="{StaticResource Orbitron}"
+                                           Margin="0,0,0,0"
+                                           Foreground="{DynamicResource TextBrush}"
+                                           FontSize="10"
+                                           TextAlignment="Center"/>
+                                <TextBlock Name="GameModeTitle"
+                                           Text="Game Mode"
+                                           Width="152"
+                                           Height="20"
+                                           Background="Transparent"
+                                           FontFamily="{StaticResource Orbitron}"
+                                           Margin="0,5,0,0"
+                                           Foreground="{DynamicResource AltTextBrush}"
+                                           FontSize="14"/>
+                                <TextBlock Name="GameModeTextBox"
+                                           Text=""
+                                           Width="152"
+                                           Height="20"
+                                           Background="Transparent"
+                                           FontFamily="{StaticResource Orbitron}"
+                                           Margin="0,0,0,0"
+                                           Foreground="{DynamicResource TextBrush}"
+                                           FontSize="10"
+                                           TextAlignment="Center"/>
+                                <TextBlock Name="KillTallyTitle"
+                                           Text="Kill Tally"
+                                           Width="152"
+                                           Height="20"
+                                           Background="Transparent"
+                                           FontFamily="{StaticResource Orbitron}"
+                                           Margin="0,5,0,0"
+                                           Foreground="{DynamicResource AltTextBrush}"
+                                           FontSize="14"/>
+                                <TextBlock Name="KillTallyTextBox"
+                                           Text=""
+                                           Width="152"
+                                           Height="20"
+                                           Background="Transparent"
+                                           FontFamily="{StaticResource Orbitron}"
+                                           Margin="0,0,0,0"
+                                           Foreground="{DynamicResource TextBrush}"
+                                           FontSize="10"
+                                           TextAlignment="Center"/>
+                                <TextBox x:Name="DebugPanel"
+                                         Text=""
+                                         Width="152"
+                                         Height="98"
+                                         Background="Transparent"
+                                         FontFamily="{StaticResource Orbitron}"
+                                         Foreground="{DynamicResource TextBrush}"
+                                         FontSize="8"
+                                         BorderThickness="0"
+                                         Margin="0,9,0,0"/>
+                        </StackPanel>
+                        <StackPanel Grid.Row="1"
+                                    Grid.Column="1"
+                                    VerticalAlignment="Center"
+                                    HorizontalAlignment="Center"
+                                    Height="120"
+                                    Width="172">
+                                <Border Background="{DynamicResource BackgroundDarkBrush}"
+                                        BorderBrush="{DynamicResource AccentBrush}"
+                                        BorderThickness="2"
+                                        CornerRadius="5"
+                                        Height="80"
+                                        Margin="0,10,0,0">
+                                        <StackPanel Orientation="Horizontal"
+                                                    HorizontalAlignment="Center"
+                                                    VerticalAlignment="Center">
+                                                <Ellipse x:Name="StatusLight"
+                                                         Width="15"
+                                                         Height="15"
+                                                         Margin="0,0,10,0"
+                                                         Fill="Red"/>
+                                                <TextBlock x:Name="StatusText"
+                                                           Text="TrackR&#x0a;Standby"
+                                                           Foreground="{DynamicResource TextBrush}"
+                                                           FontFamily="{StaticResource Orbitron}"
+                                                           FontSize="14"
+                                                           VerticalAlignment="Center"/>
+                                        </StackPanel>
+                                </Border>
+                        </StackPanel>
+                </Grid>
         </Grid>
-    </Grid>
 </UserControl>
diff --git a/AutoTrackR2/HomePage.xaml.cs b/AutoTrackR2/HomePage.xaml.cs
index 1baf48b..f8755df 100644
--- a/AutoTrackR2/HomePage.xaml.cs
+++ b/AutoTrackR2/HomePage.xaml.cs
@@ -9,15 +9,18 @@ using System.IO;
 using System.Text;
 using System.Windows.Media.Imaging;
 using AutoTrackR2.LogEventHandlers;
+using System.Timers;
+using System.Linq;
 
 namespace AutoTrackR2;
 
 public partial class HomePage : UserControl
 {
-    private Process runningProcess; // Field to store the running process
     private LogHandler? _logHandler;
     private KillHistoryManager _killHistoryManager;
     private bool _UIEventsRegistered = false;
+    private System.Timers.Timer _statusCheckTimer;
+    private bool _isLogHandlerRunning = false;
 
     public HomePage()
     {
@@ -31,59 +34,71 @@ public partial class HomePage : UserControl
         AdjustFontSize(KillTallyTextBox);
         AddKillHistoryKillsToUI();
 
-    }
-    //
-    public void UpdateButtonState(bool isRunning)
-    {
-        var accentColor = (Color)Application.Current.Resources["AccentColor"];
+        // Initialize and start the status check timer
+        _statusCheckTimer = new System.Timers.Timer(1000); // Check every second
+        _statusCheckTimer.Elapsed += CheckStarCitizenStatus;
+        _statusCheckTimer.Start();
 
+        // Check if Star Citizen is already running and initialize accordingly
+        if (IsStarCitizenRunning())
+        {
+            Dispatcher.Invoke(() =>
+            {
+                UpdateStatusIndicator(true);
+                ReadInitialStates(); // Read states first
+                InitializeLogHandler(); // Then initialize the log handler
+            });
+        }
+    }
+
+    private void CheckStarCitizenStatus(object sender, ElapsedEventArgs e)
+    {
+        bool isRunning = IsStarCitizenRunning();
+        Dispatcher.Invoke(() =>
+        {
+            UpdateStatusIndicator(isRunning);
+
+            if (isRunning)
+            {
+                if (!_isLogHandlerRunning)
+                {
+                    // Game is running, start log monitoring and read initial states
+                    InitializeLogHandler();
+                    ReadInitialStates();
+                }
+            }
+            else
+            {
+                // Game is not running, set everything to Unknown
+                GameModeTextBox.Text = "Unknown";
+                PlayerShipTextBox.Text = "Unknown";
+                PilotNameTextBox.Text = "Unknown";
+                LocalPlayerData.CurrentGameMode = GameMode.Unknown;
+                LocalPlayerData.PlayerShip = string.Empty;
+                LocalPlayerData.Username = string.Empty;
+
+                // Stop log monitoring if it's running
+                if (_isLogHandlerRunning)
+                {
+                    _logHandler?.StopMonitoring();
+                    _isLogHandlerRunning = false;
+                }
+            }
+        });
+    }
+
+    private void UpdateStatusIndicator(bool isRunning)
+    {
         if (isRunning)
         {
-            // Set Start button to "Running..." and apply glow effect
-            StartButton.Content = "Running...";
-            StartButton.IsEnabled = false; // Disable Start button
-            StartButton.Style = (Style)FindResource("DisabledButtonStyle");
-
-            // Add glow effect to the Start button
-            StartButton.Effect = new DropShadowEffect
-            {
-                Color = accentColor,
-                BlurRadius = 30,       // Adjust blur radius for desired glow intensity
-                ShadowDepth = 0,       // Set shadow depth to 0 for a pure glow effect
-                Opacity = 1,           // Set opacity for glow visibility
-                Direction = 0          // Direction doesn't matter for glow
-            };
-
-            StopButton.Style = (Style)FindResource("ButtonStyle");
-            StopButton.IsEnabled = true;  // Enable Stop button
+            StatusLight.Fill = new SolidColorBrush(Colors.Green);
+            StatusText.Text = "TrackR\nActive";
         }
         else
         {
-            // Reset Start button back to its original state
-            StartButton.Content = "Start";
-            StartButton.IsEnabled = true;  // Enable Start button
-
-            // Remove the glow effect from Start button
-            StartButton.Effect = null;
-
-            StopButton.Style = (Style)FindResource("DisabledButtonStyle");
-            StartButton.Style = (Style)FindResource("ButtonStyle");
-            StopButton.IsEnabled = false; // Disable Stop button
+            StatusLight.Fill = new SolidColorBrush(Colors.Red);
+            StatusText.Text = "TrackR\nStandby";
         }
-
-        RegisterUIEventHandlers();
-    }
-
-    public void StartButton_Click(object sender, RoutedEventArgs e)
-    {
-        UpdateButtonState(true);
-        //string scriptPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "KillTrackR_MainScript.ps1");
-        // TailFileAsync(scriptPath);
-
-        // _logHandler = new LogHandler(@"U:\\StarCitizen\\StarCitizen\\LIVE\\Game.log");
-        _logHandler = new LogHandler(ConfigManager.LogFile);
-        _logHandler.Initialize();
-
     }
 
     private void AddKillHistoryKillsToUI()
@@ -116,7 +131,7 @@ public partial class HomePage : UserControl
         {
             Dispatcher.Invoke(() =>
             {
-                PlayerShipTextBox.Text = shipName;
+                PlayerShipTextBox.Text = LocalPlayerData.CurrentGameMode == GameMode.PersistentUniverse ? "Player" : shipName;
                 AdjustFontSize(PlayerShipTextBox);
                 LocalPlayerData.PlayerShip = shipName;
             });
@@ -127,7 +142,7 @@ public partial class HomePage : UserControl
         {
             Dispatcher.Invoke(() =>
             {
-                GameModeTextBox.Text = mode == GameMode.PersistentUniverse ? "PU" : mode.ToString();
+                GameModeTextBox.Text = mode == GameMode.PersistentUniverse ? "Player" : mode.ToString();
                 AdjustFontSize(GameModeTextBox);
                 LocalPlayerData.CurrentGameMode = mode;
             });
@@ -327,7 +342,7 @@ public partial class HomePage : UserControl
 
     public void StopButton_Click(object sender, RoutedEventArgs e)
     {
-        _logHandler?.Stop();
+        _logHandler?.StopMonitoring();
 
         // Clear the text boxes
         // System.Threading.Thread.Sleep(200);
@@ -411,4 +426,159 @@ public partial class HomePage : UserControl
             RunAHKScript(ConfigManager.VideoRecordScript);
         }
     }
+
+    public void InitializeLogHandler()
+    {
+        if (_logHandler == null)
+        {
+            _logHandler = new LogHandler(ConfigManager.LogFile);
+            _logHandler.Initialize();
+            RegisterUIEventHandlers();
+            _isLogHandlerRunning = true;
+
+            // Read initial states after initializing log handler
+            ReadInitialStates();
+        }
+        else if (!_isLogHandlerRunning)
+        {
+            _logHandler.Initialize();
+            _isLogHandlerRunning = true;
+            ReadInitialStates();
+        }
+    }
+
+    private void ReadInitialStates()
+    {
+        if (string.IsNullOrEmpty(ConfigManager.LogFile) || !File.Exists(ConfigManager.LogFile))
+        {
+            Debug.WriteLine("Log file not found or path is empty");
+            return;
+        }
+
+        try
+        {
+            Debug.WriteLine("Reading initial states from log file...");
+            // Read the entire log file
+            var lines = File.ReadAllLines(ConfigManager.LogFile);
+            string username = "";
+            string shipName = "";
+            GameMode gameMode = GameMode.Unknown;
+
+            // Read from the end of the file to get the most recent states
+            for (int i = lines.Length - 1; i >= 0; i--)
+            {
+                var line = lines[i];
+
+                // Check for username (login)
+                if (line.Contains("'s Character"))
+                {
+                    int startIndex = line.IndexOf("'s Character");
+                    if (startIndex > 0)
+                    {
+                        username = line.Substring(0, startIndex).Trim();
+                        Debug.WriteLine($"Found username: {username}");
+                    }
+                }
+                // Check for ship name
+                else if (line.Contains("Entering quantum travel from"))
+                {
+                    int startIndex = line.IndexOf("in ship") + 8;
+                    int endIndex = line.IndexOf(" to ", startIndex);
+                    if (startIndex > 8 && endIndex > startIndex)
+                    {
+                        shipName = line.Substring(startIndex, endIndex - startIndex).Trim();
+                        Debug.WriteLine($"Found ship: {shipName}");
+                    }
+                }
+                // Check for game mode
+                else if (line.Contains("Loading level"))
+                {
+                    if (line.Contains("Persistent_Universe"))
+                    {
+                        gameMode = GameMode.PersistentUniverse;
+                        Debug.WriteLine("Found game mode: PU");
+                    }
+                    else if (line.Contains("Arena_Commander"))
+                    {
+                        gameMode = GameMode.ArenaCommander;
+                        Debug.WriteLine("Found game mode: AC");
+                    }
+                }
+
+                // If we've found all the information we need, we can stop reading
+                if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(shipName) && gameMode != GameMode.Unknown)
+                {
+                    break;
+                }
+            }
+
+            // Update UI with found states
+            Dispatcher.Invoke(() =>
+            {
+                if (!string.IsNullOrEmpty(username))
+                {
+                    PilotNameTextBox.Text = username;
+                    LocalPlayerData.Username = username;
+                    AdjustFontSize(PilotNameTextBox);
+                    Debug.WriteLine($"Set username in UI: {username}");
+                }
+                else
+                {
+                    PilotNameTextBox.Text = "Unknown";
+                    LocalPlayerData.Username = string.Empty;
+                    AdjustFontSize(PilotNameTextBox);
+                    Debug.WriteLine("Username not found, set to Unknown");
+                }
+
+                if (!string.IsNullOrEmpty(shipName))
+                {
+                    PlayerShipTextBox.Text = gameMode == GameMode.PersistentUniverse ? "Player" : shipName;
+                    LocalPlayerData.PlayerShip = shipName;
+                    AdjustFontSize(PlayerShipTextBox);
+                    Debug.WriteLine($"Set ship in UI: {PlayerShipTextBox.Text}");
+                }
+                else
+                {
+                    PlayerShipTextBox.Text = "Unknown";
+                    LocalPlayerData.PlayerShip = string.Empty;
+                    AdjustFontSize(PlayerShipTextBox);
+                    Debug.WriteLine("Ship not found, set to Unknown");
+                }
+
+                if (gameMode != GameMode.Unknown)
+                {
+                    GameModeTextBox.Text = gameMode == GameMode.PersistentUniverse ? "Player" : gameMode.ToString();
+                    LocalPlayerData.CurrentGameMode = gameMode;
+                    AdjustFontSize(GameModeTextBox);
+                    Debug.WriteLine($"Set game mode in UI: {GameModeTextBox.Text}");
+                }
+                else
+                {
+                    GameModeTextBox.Text = "Unknown";
+                    LocalPlayerData.CurrentGameMode = GameMode.Unknown;
+                    AdjustFontSize(GameModeTextBox);
+                    Debug.WriteLine("Game mode not found, set to Unknown");
+                }
+            });
+        }
+        catch (Exception ex)
+        {
+            Debug.WriteLine($"Error reading initial states: {ex.Message}");
+        }
+    }
+
+    public void Cleanup()
+    {
+        // Stop and dispose the status check timer
+        _statusCheckTimer?.Stop();
+        _statusCheckTimer?.Dispose();
+
+        // Stop the log handler if it's running
+        _logHandler?.StopMonitoring();
+    }
+
+    private bool IsStarCitizenRunning()
+    {
+        return Process.GetProcessesByName("StarCitizen").Length > 0;
+    }
 }
diff --git a/AutoTrackR2/LocalPlayerData.cs b/AutoTrackR2/LocalPlayerData.cs
index 668ebcd..87d8911 100644
--- a/AutoTrackR2/LocalPlayerData.cs
+++ b/AutoTrackR2/LocalPlayerData.cs
@@ -3,8 +3,9 @@
 
 public enum GameMode
 {
-    ArenaCommander,
-    PersistentUniverse
+    Unknown,
+    PersistentUniverse,
+    ArenaCommander
 }
 
 public static class LocalPlayerData
diff --git a/AutoTrackR2/LogHandler.cs b/AutoTrackR2/LogHandler.cs
index 38ddd6e..fed7b33 100644
--- a/AutoTrackR2/LogHandler.cs
+++ b/AutoTrackR2/LogHandler.cs
@@ -12,7 +12,7 @@ public class LogEntry
 {
     public DateTime Timestamp { get; set; }
     public required string? Message { get; set; }
-    
+
 }
 
 enum GameProcessState
@@ -22,16 +22,18 @@ enum GameProcessState
     Unknown
 }
 
-public class LogHandler(string logPath)
+public class LogHandler
 {
-    private readonly string? _logPath = logPath;
+    private string _logPath;
     private FileStream? _fileStream;
     private StreamReader? _reader;
-    private GameProcessState _gameProcessState = GameProcessState.Unknown;
+    private Thread? _monitorThread;
+    private CancellationTokenSource? _cancellationTokenSource;
+    private GameProcessState _gameProcessState = GameProcessState.NotRunning;
+    private bool _isMonitoring = false;
+
+    public bool IsMonitoring => _isMonitoring;
 
-    private CancellationTokenSource cancellationToken = new CancellationTokenSource(); 
-    Thread? monitorThread;
-    
     // Handlers that should be run on every log entry
     // Overlap with _startupEventHandlers is fine
     private readonly List<ILogEventHandler> _eventHandlers = [
@@ -44,17 +46,21 @@ public class LogHandler(string logPath)
         new RequestJumpFailedEvent()
     ];
 
-    // Initialize the LogHandler and run all startup handlers
+    public LogHandler(string logPath)
+    {
+        _logPath = logPath;
+    }
+
     public void Initialize()
     {
         if (!File.Exists(_logPath))
         {
             throw new FileNotFoundException("Log file not found", _logPath);
         }
-        
+
         _fileStream = new FileStream(_logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
         _reader = new StreamReader(_fileStream);
-        
+
         while (_reader.ReadLine() is { } line)
         {
             HandleLogEntry(line);
@@ -62,19 +68,31 @@ public class LogHandler(string logPath)
 
         // Ensures that any deaths already in log aren't sent to the APIs until the monitor thread is running
         _eventHandlers.Add(new ActorDeathEvent());
-        
-        monitorThread = new Thread(() => MonitorLog(cancellationToken.Token));
-        monitorThread.Start();
+
+        StartMonitoring();
     }
 
-    public void Stop()
+    public void StartMonitoring()
     {
-        // Stop the monitor thread
-        cancellationToken?.Cancel();
+        if (_isMonitoring) return;
+
+        _cancellationTokenSource = new CancellationTokenSource();
+        _monitorThread = new Thread(() => MonitorLog(_cancellationTokenSource.Token));
+        _monitorThread.Start();
+        _isMonitoring = true;
+    }
+
+    public void StopMonitoring()
+    {
+        if (!_isMonitoring) return;
+
+        _cancellationTokenSource?.Cancel();
+        _monitorThread?.Join();
         _reader?.Close();
         _fileStream?.Close();
+        _isMonitoring = false;
     }
-    
+
     // Parse a single line of the log file and run matching handlers
     private void HandleLogEntry(string line)
     {
@@ -83,7 +101,7 @@ public class LogHandler(string logPath)
         {
             var match = handler.Pattern.Match(line);
             if (!match.Success) continue;
-            
+
             var entry = new LogEntry
             {
                 Timestamp = DateTime.Now,
@@ -93,7 +111,7 @@ public class LogHandler(string logPath)
             break;
         }
     }
-    
+
     private void MonitorLog(CancellationToken token)
     {
         while (!token.IsCancellationRequested)
@@ -102,9 +120,9 @@ public class LogHandler(string logPath)
             {
                 break;
             }
-            
+
             CheckGameProcessState();
-            
+
             List<string> lines = new List<string>();
             while (_reader.ReadLine() is { } line)
             {
@@ -131,21 +149,21 @@ public class LogHandler(string logPath)
     {
         // Check if the game process is running by window name
         var process = Process.GetProcesses().FirstOrDefault(p => p.MainWindowTitle == "Star Citizen");
-        
+
         GameProcessState newGameProcessState = process != null ? GameProcessState.Running : GameProcessState.NotRunning;
-        
+
         if (newGameProcessState == GameProcessState.Running && _gameProcessState == GameProcessState.NotRunning)
         {
             // Game process went from NotRunning to Running, so reload the Game.log file
             Console.WriteLine("Game process started, reloading log file");
-                
+
             _reader?.Close();
             _fileStream?.Close();
-            
+
             _fileStream = new FileStream(_logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
             _reader = new StreamReader(_fileStream);
         }
-        
+
         _gameProcessState = newGameProcessState;
     }
 }
\ No newline at end of file
diff --git a/AutoTrackR2/MainWindow.xaml.cs b/AutoTrackR2/MainWindow.xaml.cs
index 637e90f..4efcee9 100644
--- a/AutoTrackR2/MainWindow.xaml.cs
+++ b/AutoTrackR2/MainWindow.xaml.cs
@@ -13,7 +13,6 @@ namespace AutoTrackR2
 {
     public partial class MainWindow : Window
     {
-
         private Dictionary<string, bool> tabStates = new Dictionary<string, bool>
         {
             { "HomeTab", true }, // HomeTab is selected by default
@@ -23,9 +22,7 @@ namespace AutoTrackR2
         };
 
         private HomePage homePage; // Persistent HomePage instance
-        private bool isRunning = false; // Single source of truth for the running state
 
-        // Ensure this method is not static
         public void ChangeLogoImage(string imagePath)
         {
             Logo.Source = new BitmapImage(new Uri(imagePath, UriKind.RelativeOrAbsolute));
@@ -38,10 +35,6 @@ namespace AutoTrackR2
             homePage = new HomePage(); // Create a single instance of HomePage
             ContentControl.Content = homePage; // Default to HomePage
 
-            // Attach event handlers for the HomePage buttons
-            homePage.StartButton.Click += StartButton_Click;
-            homePage.StopButton.Click += StopButton_Click;
-
             // Create ConfigPage and pass the MainWindow reference to it
             var configPage = new ConfigPage(this);
 
@@ -51,6 +44,7 @@ namespace AutoTrackR2
             UpdateTabVisuals();
 
             Loaded += MainWindow_Loaded; // Handle Loaded event
+            Closing += MainWindow_Closing; // Handle Closing event
         }
 
         private void MainWindow_Loaded(object sender, RoutedEventArgs e)
@@ -59,16 +53,23 @@ namespace AutoTrackR2
             var args = Environment.GetCommandLineArgs();
             if (args.Contains("-start", StringComparer.OrdinalIgnoreCase))
             {
-                homePage.StartButton_Click(null, null);
+                // Initialize log handler if needed
+                homePage.InitializeLogHandler();
             }
         }
 
+        private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+        {
+            // Clean up resources
+            homePage?.Cleanup();
+
+            // Make sure the application exits completely
+            Application.Current.Shutdown();
+        }
+
         private void CloseWindow(object sender, RoutedEventArgs e)
         {
-            // If runningProcess is not null and still active, terminate it
-            homePage.StopButton_Click(sender, e);
-
-            // Close the main window
+            // This will trigger the Closing event
             this.Close();
         }
 
@@ -91,9 +92,6 @@ namespace AutoTrackR2
             {
                 // Reuse the existing HomePage instance
                 ContentControl.Content = homePage;
-
-                // Update the button state on the HomePage
-                homePage.UpdateButtonState(isRunning);
             }
             else if (clickedTabName == "StatsTab")
             {
@@ -158,20 +156,6 @@ namespace AutoTrackR2
             }
         }
 
-        private void StartButton_Click(object sender, RoutedEventArgs e)
-        {
-            isRunning = true; // Update the running state
-            homePage.UpdateButtonState(isRunning); // Update HomePage button visuals
-            // Start your logic here
-        }
-
-        private void StopButton_Click(object sender, RoutedEventArgs e)
-        {
-            isRunning = false; // Update the running state
-            homePage.UpdateButtonState(isRunning); // Update HomePage button visuals
-            // Stop your logic here
-        }
-
         private void InitializeConfigPage()
         {
             // Set the values from the loaded config
@@ -195,12 +179,12 @@ namespace AutoTrackR2
     {
         public static string LogFile { get; set; }
         public static string KillHistoryFile { get; set; }
-        
+
         public static string AHKScriptFolder { get; set; }
-        
+
         public static string VisorWipeScript { get; set; }
         public static string VideoRecordScript { get; set; }
-        
+
         public static string ApiUrl { get; set; }
         public static string ApiKey { get; set; }
         public static string VideoPath { get; set; }
@@ -208,11 +192,11 @@ namespace AutoTrackR2
         public static int VideoRecord { get; set; }
         public static int OfflineMode { get; set; }
         public static int Theme { get; set; }
-        
+
         static ConfigManager()
-        {   
+        {
             LoadConfig();
-            
+
             // Set default values
             // AppData\Local\AutoTrackR2\Kill-log.csv
             KillHistoryFile = Path.Combine(
@@ -220,12 +204,12 @@ namespace AutoTrackR2
                 "AutoTrackR2",
                 "Kill-log.csv"
             );
-            
+
             AHKScriptFolder = Path.Combine(
                 Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                 "AutoTrackR2"
             );
-            
+
             VisorWipeScript = "visorwipe.ahk";
             VideoRecordScript = "videorecord.ahk";
         }