mirror of
https://github.com/BubbaGumpShrump/AutoTrackR2.git
synced 2025-05-21 16:25:31 +00:00
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.
This commit is contained in:
parent
0593969f77
commit
2cd80970a4
5 changed files with 456 additions and 155 deletions
|
@ -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
Standby"
|
||||
Foreground="{DynamicResource TextBrush}"
|
||||
FontFamily="{StaticResource Orbitron}"
|
||||
FontSize="14"
|
||||
VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,8 +3,9 @@
|
|||
|
||||
public enum GameMode
|
||||
{
|
||||
ArenaCommander,
|
||||
PersistentUniverse
|
||||
Unknown,
|
||||
PersistentUniverse,
|
||||
ArenaCommander
|
||||
}
|
||||
|
||||
public static class LocalPlayerData
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue