diff --git a/AutoTrackR2/Assets/ZAP.png b/AutoTrackR2/Assets/ZAP.png new file mode 100644 index 0000000..bd889f7 Binary files /dev/null and b/AutoTrackR2/Assets/ZAP.png differ diff --git a/AutoTrackR2/Assets/cinderborn.png b/AutoTrackR2/Assets/cinderborn.png new file mode 100644 index 0000000..b684f40 Binary files /dev/null and b/AutoTrackR2/Assets/cinderborn.png differ diff --git a/AutoTrackR2/Assets/shadowguard.png b/AutoTrackR2/Assets/shadowguard.png new file mode 100644 index 0000000..5b1c2d6 Binary files /dev/null and b/AutoTrackR2/Assets/shadowguard.png differ diff --git a/AutoTrackR2/AutoTrackR2.csproj b/AutoTrackR2/AutoTrackR2.csproj index 6489b3a..aec2eac 100644 --- a/AutoTrackR2/AutoTrackR2.csproj +++ b/AutoTrackR2/AutoTrackR2.csproj @@ -29,9 +29,13 @@ <None Remove="Assets\SHADOWMOSES.png" /> <None Remove="Assets\VOX.png" /> <None Remove="Assets\WRITH.png" /> + <None Remove="Assets\ZAP.png" /> <None Remove="config.ini" /> <None Remove="Fonts\Orbitron-Bold.ttf" /> <None Remove="Fonts\Roboto-Regular.ttf" /> + <None Update="themes.json"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> </ItemGroup> <ItemGroup> @@ -99,6 +103,15 @@ <Resource Include="Assets\WRITH.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Resource> + <Resource Include="Assets\cinderborn.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Resource> + <Resource Include="Assets\shadowguard.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Resource> + <Resource Include="Assets\ZAP.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Resource> <Resource Include="config.ini" /> <Resource Include="Fonts\Orbitron-Bold.ttf"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> diff --git a/AutoTrackR2/ConfigPage.xaml b/AutoTrackR2/ConfigPage.xaml index 252ee6b..ace0427 100644 --- a/AutoTrackR2/ConfigPage.xaml +++ b/AutoTrackR2/ConfigPage.xaml @@ -207,7 +207,7 @@ Margin="0,7,0,5"/> <Slider x:Name="ThemeSlider" Minimum="0" - Maximum="21" + Maximum="24" Value="0" TickFrequency="1" IsSnapToTickEnabled="True" diff --git a/AutoTrackR2/ConfigPage.xaml.cs b/AutoTrackR2/ConfigPage.xaml.cs index d09f175..9a48ef7 100644 --- a/AutoTrackR2/ConfigPage.xaml.cs +++ b/AutoTrackR2/ConfigPage.xaml.cs @@ -4,6 +4,7 @@ using System.Net.Http.Headers; using System.Net.Http; using System.Text.RegularExpressions; using System.Text; +using System.Text.Json; using System.Windows; using System.Windows.Controls; using System.Windows.Media; @@ -11,613 +12,434 @@ using System.Windows.Media.Effects; using System.Windows.Threading; using Microsoft.Win32; -namespace AutoTrackR2 +namespace AutoTrackR2; + +public partial class ConfigPage : UserControl { - public partial class ConfigPage : UserControl + // Store the current slider value + private double savedSliderValue = 0; + + private MainWindow mainWindow; + + Dictionary<string, Theme>? _themes = null; + + public ConfigPage(MainWindow mainWindow) { - // Store the current slider value - private double savedSliderValue = 0; + InitializeComponent(); + this.mainWindow = mainWindow; - private MainWindow mainWindow; + LogFilePath.Text = ConfigManager.LogFile; + ApiUrl.Text = ConfigManager.ApiUrl; + ApiKey.Password = ConfigManager.ApiKey; + VideoPath.Text = ConfigManager.VideoPath; + VisorWipeSlider.Value = ConfigManager.VisorWipe; + VideoRecordSlider.Value = ConfigManager.VideoRecord; + OfflineModeSlider.Value = ConfigManager.OfflineMode; + ThemeSlider.Value = ConfigManager.Theme; - public ConfigPage(MainWindow mainWindow) + ApplyToggleModeStyle(OfflineModeSlider.Value, VisorWipeSlider.Value, VideoRecordSlider.Value); + + + const string themeJsonPath = "themes.json"; + var themeJson = File.ReadAllText(themeJsonPath); + _themes = JsonSerializer.Deserialize<Dictionary<string, Theme>>(themeJson); + } + + // Method to change the logo image in MainWindow + public void ChangeLogo(string imagePath, Color? glowColor = null) + { + // Update the logo from ConfigPage + mainWindow.ChangeLogoImage(imagePath); + + if (glowColor.HasValue) { - InitializeComponent(); - this.mainWindow = mainWindow; - - LogFilePath.Text = ConfigManager.LogFile; - ApiUrl.Text = ConfigManager.ApiUrl; - ApiKey.Password = ConfigManager.ApiKey; - VideoPath.Text = ConfigManager.VideoPath; - VisorWipeSlider.Value = ConfigManager.VisorWipe; - VideoRecordSlider.Value = ConfigManager.VideoRecord; - OfflineModeSlider.Value = ConfigManager.OfflineMode; - ThemeSlider.Value = ConfigManager.Theme; - - ApplyToggleModeStyle(OfflineModeSlider.Value, VisorWipeSlider.Value, VideoRecordSlider.Value); - } - - // Method to change the logo image in MainWindow - public void ChangeLogo(string imagePath, Color? glowColor = null) - { - // Update the logo from ConfigPage - mainWindow.ChangeLogoImage(imagePath); - - if (glowColor.HasValue) + // Add the glow effect to the logo in MainWindow + DropShadowEffect glowEffect = new DropShadowEffect { - // Add the glow effect to the logo in MainWindow - DropShadowEffect glowEffect = new DropShadowEffect - { - Color = glowColor.Value, // Glow color - ShadowDepth = 0, // Centered glow - BlurRadius = 20, // Glow spread - Opacity = 0.8 // Intensity - }; - - // Apply the effect to the logo - mainWindow.Logo.Effect = glowEffect; - } - else - { - mainWindow.Logo.Effect = null; - } - } - - // This method will set the loaded config values to the UI controls - public void SetConfigValues(string logFile, string apiUrl, string apiKey, string videoPath, - int visorWipe, int videoRecord, int offlineMode, int theme) - { - // Set the textboxes with the loaded values - LogFilePath.Text = logFile; - ApiUrl.Text = apiUrl; - ApiKey.Password = apiKey; - VideoPath.Text = videoPath; - - // Set the sliders with the loaded values - VideoRecordSlider.Value = videoRecord; - VisorWipeSlider.Value = visorWipe; - OfflineModeSlider.Value = offlineMode; - - // Handle themes - if (theme >= 0 && theme <= 3) - { - ThemeSlider.Value = theme; // Set slider only for visible themes - } - else - { - ApplyTheme(theme); // Apply hidden themes directly - } - } - - private void ApplyToggleModeStyle(double offlineModeValue, double visorWipeValue, double videoRecordValue) - { - // Get the slider - Slider offlineModeSlider = OfflineModeSlider; - Slider visorWipeSlider = VisorWipeSlider; - Slider videoRecordSlider = VideoRecordSlider; - - // Set the appropriate style based on the offlineMode value (0 or 1) - if (offlineModeValue == 0) - { - offlineModeSlider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); - } - - if (visorWipeValue == 0) - { - visorWipeSlider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); - } - - if (videoRecordValue == 0) - { - videoRecordSlider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); - } - } - - private void ThemeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) - { - // Save the current slider value when it changes - savedSliderValue = e.NewValue; - - // Get the slider value (0, 1, or 2) - int themeIndex = (int)savedSliderValue; - - // Apply the selected theme - ApplyTheme(themeIndex); - - mainWindow.UpdateTabVisuals(); - } - - private void ApplyTheme(int themeIndex) - { - switch (themeIndex) - { - case 0: // Default Blue Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#00A9E0"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#0F1A2B"), // Button - (Color)ColorConverter.ConvertFromString("#1D2D44"), // Background - (Color)ColorConverter.ConvertFromString("#FFFFFF"), // Text - (Color)ColorConverter.ConvertFromString("#A88F2C") // AltText - ); - ChangeLogo("/Assets/AutoTrackR.png"); - break; - case 1: // Green Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#1D9F00"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#262424"), // Button - (Color)ColorConverter.ConvertFromString("#072501"), // Background - (Color)ColorConverter.ConvertFromString("#D7AF3C"), // Text - (Color)ColorConverter.ConvertFromString("#DCD6C4") // AltText - ); - ChangeLogo("/Assets/AutoTrackR.png"); - break; - case 2: // Red Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#D32F2F"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#424242"), // Button - (Color)ColorConverter.ConvertFromString("#212121"), // Light Background - (Color)ColorConverter.ConvertFromString("#E0E0E0"), // Text - (Color)ColorConverter.ConvertFromString("#A88F2C") // AltText - ); - ChangeLogo("/Assets/AutoTrackR.png"); - break; - case 3: // Purple Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#32CD32"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#33065F"), // Button - (Color)ColorConverter.ConvertFromString("#43065F"), // Background - (Color)ColorConverter.ConvertFromString("#00FF00"), // Text - (Color)ColorConverter.ConvertFromString("#B3976E") // AltText - ); - ChangeLogo("/Assets/AutoTrackR.png"); - break; - case 4: // GN Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#FF0000"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#1C1C1C"), // Button - (Color)ColorConverter.ConvertFromString("#000000"), // Background - (Color)ColorConverter.ConvertFromString("#FBC603"), // Text - (Color)ColorConverter.ConvertFromString("#BFA8A6") // AltText - ); - ChangeLogo("/Assets/GN.png", (Color)ColorConverter.ConvertFromString("#FF0000")); - break; - case 5: // NW Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#B92D2D"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#1C1C1C"), // Button - (Color)ColorConverter.ConvertFromString("#262424"), // Background - (Color)ColorConverter.ConvertFromString("#01DDDA"), // Text - (Color)ColorConverter.ConvertFromString("#A88F2C") // AltText - ); - ChangeLogo("/Assets/NW.png", (Color)ColorConverter.ConvertFromString("#01DDDA")); - break; - case 6: // D3VL Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#AA0000"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#333333"), // Button - (Color)ColorConverter.ConvertFromString("#220000"), // Background - (Color)ColorConverter.ConvertFromString("#FF0000"), // Text - (Color)ColorConverter.ConvertFromString("#A88F2C") // AltText - ); - ChangeLogo("/Assets/D3VL.png", (Color)ColorConverter.ConvertFromString("#CC0000")); - break; - case 7: // HIT Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#B92D2D"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#1C1C1C"), // Button - (Color)ColorConverter.ConvertFromString("#262424"), // Background - (Color)ColorConverter.ConvertFromString("#7d7d7d"), // Text - (Color)ColorConverter.ConvertFromString("#A88F2C") // AltText - ); - ChangeLogo("/Assets/HIT.png"); - break; - case 8: // WRAITH Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#ff0000"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#2a2a2a"), // Button - (Color)ColorConverter.ConvertFromString("#0a0a0a"), // Background - (Color)ColorConverter.ConvertFromString("#DFDFDF"), // Text - (Color)ColorConverter.ConvertFromString("#8B0000") // AltText - ); - ChangeLogo("/Assets/WRITH.png", (Color)ColorConverter.ConvertFromString("#ff0000")); - break; - case 9: // VOX Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#C0C0C0"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#1C1C1C"), // Button - (Color)ColorConverter.ConvertFromString("#424242"), // Background - (Color)ColorConverter.ConvertFromString("#FFD700"), // Text - (Color)ColorConverter.ConvertFromString("#817E79") // AltText - ); - ChangeLogo("/Assets/VOX.png", (Color)ColorConverter.ConvertFromString("#FFD700")); - break; - case 10: // EMP Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#F5721C"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#535353"), // Button - (Color)ColorConverter.ConvertFromString("#080000"), // Background - (Color)ColorConverter.ConvertFromString("#FFFFFF"), // Text - (Color)ColorConverter.ConvertFromString("#CEA75B") // AltText - ); - ChangeLogo("/Assets/EMP.png", (Color)ColorConverter.ConvertFromString("#F3BD9B")); - break; - case 11: // AVS Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#3fbcff"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#060606"), // Button - (Color)ColorConverter.ConvertFromString("#333333"), // Background - (Color)ColorConverter.ConvertFromString("#e8e8e8"), // Text - (Color)ColorConverter.ConvertFromString("#A88F2C") // AltText - ); - ChangeLogo("/Assets/AVSQN.png", (Color)ColorConverter.ConvertFromString("#3fbcff")); - break; - case 12: // HEX Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#39FF14"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#535353"), // Button - (Color)ColorConverter.ConvertFromString("#000800"), // Background - (Color)ColorConverter.ConvertFromString("#FFFFFF"), // Text - (Color)ColorConverter.ConvertFromString("#CFFF04") // AltText - ); - ChangeLogo("/Assets/HEX.png", (Color)ColorConverter.ConvertFromString("#39FF14")); - break; - case 13: // Mammon Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#FFD700"), // Accent/Border - Royal Gold - (Color)ColorConverter.ConvertFromString("#2C2C2C"), // Button - Dark Gray - (Color)ColorConverter.ConvertFromString("#1A1A1A"), // Background - Rich Black - (Color)ColorConverter.ConvertFromString("#FFFFFF"), // Text - White - (Color)ColorConverter.ConvertFromString("#DAA520") // AltText - Golden Rod - ); - ChangeLogo("/Assets/MAMMON.png", (Color)ColorConverter.ConvertFromString("#FFD700")); - break; - case 14: // Shadow Moses Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#FF69B4"), // Accent/Border - Hot Pink - (Color)ColorConverter.ConvertFromString("#2C2C2C"), // Button - Dark Gray - (Color)ColorConverter.ConvertFromString("#2C1F28"), // Background - Dark Pink-Gray - (Color)ColorConverter.ConvertFromString("#E6E6E6"), // Text - Light Gray - (Color)ColorConverter.ConvertFromString("#FF1493") // AltText - Deep Pink - ); - ChangeLogo("/Assets/ShadowMoses.png", (Color)ColorConverter.ConvertFromString("#FF69B4")); - break; - case 15: // Mongrel Squad - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#00416A"), // Accent/Border - NyQuil Dark Blue - (Color)ColorConverter.ConvertFromString("#1B3F5C"), // Button - Midnight Blue - (Color)ColorConverter.ConvertFromString("#002E4D"), // Background - Deep NyQuil Blue - (Color)ColorConverter.ConvertFromString("#B0C4DE"), // Text - Light Steel Blue - (Color)ColorConverter.ConvertFromString("#4F94CD") // AltText - Steel Blue - ); - ChangeLogo("/Assets/Bobgrel.png", (Color)ColorConverter.ConvertFromString("#00BFFF")); - break; - case 16: // Feezy - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#FFA500"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#1B0C04"), // Button - (Color)ColorConverter.ConvertFromString("#1B0C04"), // Background - (Color)ColorConverter.ConvertFromString("#FFE4B5"), // Text - (Color)ColorConverter.ConvertFromString("#A88F2C") // AltText - ); - ChangeLogo("/Assets/chibifox.png", (Color)ColorConverter.ConvertFromString("#FFA500")); - break; - case 17: // NMOS - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#EAB787"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#601C1B"), // Button - (Color)ColorConverter.ConvertFromString("#170402"), // Background - (Color)ColorConverter.ConvertFromString("#F6DBAD"), // Text - (Color)ColorConverter.ConvertFromString("#EBCAA0") // AltText - ); - ChangeLogo("/Assets/NMOS.png", (Color)ColorConverter.ConvertFromString("#EAB787")); - break; - case 18: // Rakk Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#FF00FF"), // Accent/Border - Magenta - (Color)ColorConverter.ConvertFromString("#1C1C1C"), // Button - Dark Gray - (Color)ColorConverter.ConvertFromString("#0A0A0A"), // Background - Nearly Black - (Color)ColorConverter.ConvertFromString("#E6E6E6"), // Text - Light Gray - (Color)ColorConverter.ConvertFromString("#00BFFF") // AltText - Deep Sky Blue - ); - ChangeLogo("/Assets/RACKETEERS.png", (Color)ColorConverter.ConvertFromString("#FF00FF")); - break; - case 19: // Blightveil Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#8B4AC6"), // Accent/Border - Purple from the logo border - (Color)ColorConverter.ConvertFromString("#2A2035"), // Button - Darker purple for buttons - (Color)ColorConverter.ConvertFromString("#1A1621"), // Background - Very dark purple/black - (Color)ColorConverter.ConvertFromString("#FFFFFF"), // Text - White like the logo text - (Color)ColorConverter.ConvertFromString("#FF3333") // AltText - Red like the eyes - ); - ChangeLogo("/Assets/Blightveil.png", (Color)ColorConverter.ConvertFromString("#8B4AC6")); - break; - case 20: // Gankhub Theme - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#ffa500"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#2C2C2C"), // Button - (Color)ColorConverter.ConvertFromString("#1b1b1b"), // Background - (Color)ColorConverter.ConvertFromString("#FFFFFF"), // Text - (Color)ColorConverter.ConvertFromString("#ffa500") // AltText - ); - ChangeLogo("/Assets/Gankhub.png"); - break; - case 21: // IronPoint - UpdateThemeColors( - (Color)ColorConverter.ConvertFromString("#C83300"), // Accent/Border - (Color)ColorConverter.ConvertFromString("#2D2D2D"), // Button - (Color)ColorConverter.ConvertFromString("#161515"), // Background - (Color)ColorConverter.ConvertFromString("#ffffff"), // Text - (Color)ColorConverter.ConvertFromString("#aaaaaa") // AltText - ); - ChangeLogo("/Assets/IP.png", (Color)ColorConverter.ConvertFromString("#3F1210")); - break; - } - } - - // Helper method to update both Color and Brush resources - private void UpdateThemeColors(Color accent, Color backgroundDark, Color backgroundLight, Color text, Color altText) - { - // Update color resources - Application.Current.Resources["AccentColor"] = accent; - Application.Current.Resources["BackgroundDarkColor"] = backgroundDark; - Application.Current.Resources["BackgroundLightColor"] = backgroundLight; - Application.Current.Resources["TextColor"] = text; - Application.Current.Resources["AltTextColor"] = altText; - - // Update SolidColorBrush resources - Application.Current.Resources["AccentBrush"] = new SolidColorBrush(accent); - Application.Current.Resources["BackgroundDarkBrush"] = new SolidColorBrush(backgroundDark); - Application.Current.Resources["BackgroundLightBrush"] = new SolidColorBrush(backgroundLight); - Application.Current.Resources["TextBrush"] = new SolidColorBrush(text); - Application.Current.Resources["AltTextBrush"] = new SolidColorBrush(altText); - } - - // This method will be called when switching tabs to restore the saved slider position. - public void RestoreSliderValue() - { - // Set the slider back to the previously saved value - ThemeSlider.Value = savedSliderValue; - } - - // Log File Browse Button Handler - private void LogFileBrowseButton_Click(object sender, RoutedEventArgs e) - { - var dialog = new Microsoft.Win32.OpenFileDialog(); - dialog.Filter = "Log files (*.log)|*.log|All files (*.*)|*.*"; // Adjust as needed - - if (dialog.ShowDialog() == true) - { - LogFilePath.Text = dialog.FileName; // Set the selected file path to the TextBox - } - } - - // Video Path Browse Button Handler - private void VideoPathBrowseButton_Click(object sender, RoutedEventArgs e) - { - var dialog = new OpenFileDialog(); - dialog.CheckFileExists = false; - dialog.ValidateNames = false; - dialog.Filter = "All files|*.*"; - - if (dialog.ShowDialog() == true && dialog.FileName != null) - { - // Extract only the directory path from the file - string? selectedFolder = Path.GetDirectoryName(dialog.FileName); - if (selectedFolder != null) - { - VideoPath.Text = selectedFolder; // Set the folder path - } - } - } - - private void VisorWipeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) - { - Slider slider = (Slider)sender; - - // Build the dynamic file path for the current user - if (string.IsNullOrEmpty(ConfigManager.AHKScriptFolder)) - { - MessageBox.Show("AHK script folder path is not configured.", "Configuration Error", MessageBoxButton.OK, MessageBoxImage.Warning); - return; - } - string filePath = Path.Combine( - ConfigManager.AHKScriptFolder, - "visorwipe.ahk" - ); - - // Get the current value of the slider (0 or 1) - ConfigManager.VisorWipe = (int)slider.Value; - - if (ConfigManager.VisorWipe == 1) - { - // Check if the file exists - if (File.Exists(filePath)) - { - // Apply the enabled style if the file exists - slider.Style = (Style)Application.Current.FindResource("ToggleSliderStyle"); - } - else - { - // File does not exist; revert the toggle to 0 - ConfigManager.VisorWipe = 0; - slider.Value = 0; // Revert the slider value - slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); - - // Optionally, display a message to the user - MessageBox.Show($"Visor wipe script not found. Please ensure the file exists at:\n{filePath}", - "File Missing", MessageBoxButton.OK, MessageBoxImage.Warning); - } - } - else - { - // Apply the disabled style - slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); - } - } - - private void VideoRecordSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) - { - Slider slider = (Slider)sender; - - // Build the dynamic file path for the current user - string filePath = Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), - "AutoTrackR2", - "videorecord.ahk" - ); - - // Get the current value of the slider (0 or 1) - ConfigManager.VideoRecord = (int)slider.Value; - - if (ConfigManager.VideoRecord == 1) - { - // Check if the file exists - if (File.Exists(filePath)) - { - // Apply the enabled style if the file exists - slider.Style = (Style)Application.Current.FindResource("ToggleSliderStyle"); - } - else - { - // File does not exist; revert the toggle to 0 - ConfigManager.VideoRecord = 0; - slider.Value = 0; // Revert the slider value - slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); - - // Optionally, display a message to the user - MessageBox.Show($"Video record script not found. Please ensure the file exists at:\n{filePath}", - "File Missing", MessageBoxButton.OK, MessageBoxImage.Warning); - } - } - else - { - // Apply the disabled style - slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); - } - } - - private void OfflineModeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) - { - Slider slider = (Slider)sender; - ConfigManager.OfflineMode = (int)slider.Value; // 0 or 1 - - // Check if the value is 0 or 1 and apply the corresponding style - if (ConfigManager.OfflineMode == 0) - { - slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); // Apply FalseToggleStyle - } - else - { - slider.Style = (Style)Application.Current.FindResource("ToggleSliderStyle"); // Apply ToggleSliderStyle - } - } - - - private void SaveButton_Click(object sender, RoutedEventArgs e) - { - - ConfigManager.ApiKey = ApiKey.Password; - ConfigManager.ApiUrl = ApiUrl.Text; - ConfigManager.LogFile = LogFilePath.Text; - ConfigManager.VideoPath = VideoPath.Text; - ConfigManager.VisorWipe = (int)VisorWipeSlider.Value; - ConfigManager.VideoRecord = (int)VideoRecordSlider.Value; - ConfigManager.OfflineMode = (int)OfflineModeSlider.Value; - ConfigManager.Theme = (int)ThemeSlider.Value; - // Save the current config values - ConfigManager.SaveConfig(); - // Start the flashing effect - FlashSaveButton(); - } - - private void FlashSaveButton() - { - string? originalText = SaveButton.Content?.ToString() ?? string.Empty; - SaveButton.Content = "Saved"; - - // Save button color change effect - var originalColor = SaveButton.Background; - var accentColor = (Color)Application.Current.Resources["AccentColor"]; - SaveButton.Background = new SolidColorBrush(accentColor); // Change color to accent color - - // Apply glow effect - SaveButton.Effect = new DropShadowEffect - { - Color = accentColor, - BlurRadius = 15, // Add subtle blur - ShadowDepth = 0, // Set shadow depth to 0 for a pure glow effect - Opacity = 0.8, // Set opacity for glow visibility - Direction = 0 // Direction doesn't matter for glow + Color = glowColor.Value, // Glow color + ShadowDepth = 0, // Centered glow + BlurRadius = 20, // Glow spread + Opacity = 0.8 // Intensity }; - // Create a DispatcherTimer to reset everything after the effect - DispatcherTimer timer = new DispatcherTimer - { - Interval = TimeSpan.FromMilliseconds(600) // Interval for flash effect - }; + // Apply the effect to the logo + mainWindow.Logo.Effect = glowEffect; + } + else + { + mainWindow.Logo.Effect = null; + } + } - int flashCount = 0; - timer.Tick += (sender, e) => - { - if (flashCount < 2) // Flash effect (flash 2 times) - { - flashCount++; - } - else - { - // Stop the timer and restore the original button state - timer.Stop(); - SaveButton.Content = originalText; - SaveButton.Background = originalColor; // Restore the original button color - SaveButton.Effect = null; // Remove the glow effect - } - }; + // This method will set the loaded config values to the UI controls + public void SetConfigValues(string logFile, string apiUrl, string apiKey, string videoPath, + int visorWipe, int videoRecord, int offlineMode, int theme) + { + // Set the textboxes with the loaded values + LogFilePath.Text = logFile; + ApiUrl.Text = apiUrl; + ApiKey.Password = apiKey; + VideoPath.Text = videoPath; - // Start the timer - timer.Start(); + // Set the sliders with the loaded values + VideoRecordSlider.Value = videoRecord; + VisorWipeSlider.Value = visorWipe; + OfflineModeSlider.Value = offlineMode; + + // Handle themes + ApplyTheme(theme); + + } + + private void ApplyToggleModeStyle(double offlineModeValue, double visorWipeValue, double videoRecordValue) + { + // Get the slider + Slider offlineModeSlider = OfflineModeSlider; + Slider visorWipeSlider = VisorWipeSlider; + Slider videoRecordSlider = VideoRecordSlider; + + // Set the appropriate style based on the offlineMode value (0 or 1) + if (offlineModeValue == 0) + { + offlineModeSlider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); } - private async void TestApiButton_Click(object sender, RoutedEventArgs e) + if (visorWipeValue == 0) { - string apiUrl = ApiUrl.Text; - string modifiedUrl = Regex.Replace(apiUrl, @"(https?://[^/]+)/?.*", "$1/test"); - string apiKey = ApiKey.Password; - Debug.WriteLine($"Sending to {modifiedUrl}"); + visorWipeSlider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); + } - try + if (videoRecordValue == 0) + { + videoRecordSlider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); + } + } + + private void ThemeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) + { + // Save the current slider value when it changes + savedSliderValue = e.NewValue; + + // Get the slider value (0, 1, or 2) + int themeIndex = (int)savedSliderValue; + + // Apply the selected theme + ApplyTheme(themeIndex); + + mainWindow.UpdateTabVisuals(); + } + + private void ApplyTheme(int themeIndex) + { + var theme = _themes?.Values.ElementAtOrDefault(themeIndex); + if (theme == null) return; + + // Update the logo + if (theme.Logo != null && theme.Logo.Path != null) + { + ChangeLogo(theme.Logo.Path, + theme.Logo.Primary != null + ? (Color) ColorConverter.ConvertFromString(theme.Logo.Primary) + : Colors.Transparent); + } + + // Update the colors + if (theme.Colors != null) + { + var accent = (Color)ColorConverter.ConvertFromString(theme.Colors.Accent); + var button = (Color)ColorConverter.ConvertFromString(theme.Colors.Button); + var backgroundDark = (Color)ColorConverter.ConvertFromString(theme.Colors.Background); + var text = (Color)ColorConverter.ConvertFromString(theme.Colors.Text); + var altText = (Color)ColorConverter.ConvertFromString(theme.Colors.AltText); + + UpdateThemeColors(accent, button, backgroundDark, text, altText); + } + } + + // Helper method to update both Color and Brush resources + private void UpdateThemeColors(Color accent, Color backgroundDark, Color backgroundLight, Color text, Color altText) + { + // Update color resources + Application.Current.Resources["AccentColor"] = accent; + Application.Current.Resources["BackgroundDarkColor"] = backgroundDark; + Application.Current.Resources["BackgroundLightColor"] = backgroundLight; + Application.Current.Resources["TextColor"] = text; + Application.Current.Resources["AltTextColor"] = altText; + + // Update SolidColorBrush resources + Application.Current.Resources["AccentBrush"] = new SolidColorBrush(accent); + Application.Current.Resources["BackgroundDarkBrush"] = new SolidColorBrush(backgroundDark); + Application.Current.Resources["BackgroundLightBrush"] = new SolidColorBrush(backgroundLight); + Application.Current.Resources["TextBrush"] = new SolidColorBrush(text); + Application.Current.Resources["AltTextBrush"] = new SolidColorBrush(altText); + } + + // This method will be called when switching tabs to restore the saved slider position. + public void RestoreSliderValue() + { + // Set the slider back to the previously saved value + ThemeSlider.Value = savedSliderValue; + } + + // Log File Browse Button Handler + private void LogFileBrowseButton_Click(object sender, RoutedEventArgs e) + { + var dialog = new Microsoft.Win32.OpenFileDialog(); + dialog.Filter = "Log files (*.log)|*.log|All files (*.*)|*.*"; // Adjust as needed + + if (dialog.ShowDialog() == true) + { + LogFilePath.Text = dialog.FileName; // Set the selected file path to the TextBox + } + } + + // Video Path Browse Button Handler + private void VideoPathBrowseButton_Click(object sender, RoutedEventArgs e) + { + var dialog = new OpenFileDialog(); + dialog.CheckFileExists = false; + dialog.ValidateNames = false; + dialog.Filter = "All files|*.*"; + + if (dialog.ShowDialog() == true && dialog.FileName != null) + { + // Extract only the directory path from the file + string? selectedFolder = Path.GetDirectoryName(dialog.FileName); + if (selectedFolder != null) { - // Configure HttpClient with TLS 1.2 - var handler = new HttpClientHandler - { - SslProtocols = System.Security.Authentication.SslProtocols.Tls12 - }; - - using (var client = new HttpClient(handler)) - { - // Set headers - client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey); - client.DefaultRequestHeaders.UserAgent.ParseAdd("AutoTrackR"); - - // Empty JSON body - var content = new StringContent("{}", Encoding.UTF8, "application/json"); - - // Send POST - var response = await client.PostAsync(modifiedUrl, content); - - if (response.IsSuccessStatusCode) - { - MessageBox.Show("API Test Success."); - } - else - { - MessageBox.Show($"Error: {response.StatusCode} - {response.ReasonPhrase}"); - } - } - } - catch (Exception ex) - { - MessageBox.Show($"API Test Failure. {ex.Message}"); + VideoPath.Text = selectedFolder; // Set the folder path } } } + + private void VisorWipeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) + { + Slider slider = (Slider)sender; + + // Build the dynamic file path for the current user + if (string.IsNullOrEmpty(ConfigManager.AHKScriptFolder)) + { + MessageBox.Show("AHK script folder path is not configured.", "Configuration Error", MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + string filePath = Path.Combine( + ConfigManager.AHKScriptFolder, + "visorwipe.ahk" + ); + + // Get the current value of the slider (0 or 1) + ConfigManager.VisorWipe = (int)slider.Value; + + if (ConfigManager.VisorWipe == 1) + { + // Check if the file exists + if (File.Exists(filePath)) + { + // Apply the enabled style if the file exists + slider.Style = (Style)Application.Current.FindResource("ToggleSliderStyle"); + } + else + { + // File does not exist; revert the toggle to 0 + ConfigManager.VisorWipe = 0; + slider.Value = 0; // Revert the slider value + slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); + + // Optionally, display a message to the user + MessageBox.Show($"Visor wipe script not found. Please ensure the file exists at:\n{filePath}", + "File Missing", MessageBoxButton.OK, MessageBoxImage.Warning); + } + } + else + { + // Apply the disabled style + slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); + } + } + + private void VideoRecordSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) + { + Slider slider = (Slider)sender; + + // Build the dynamic file path for the current user + string filePath = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + "AutoTrackR2", + "videorecord.ahk" + ); + + // Get the current value of the slider (0 or 1) + ConfigManager.VideoRecord = (int)slider.Value; + + if (ConfigManager.VideoRecord == 1) + { + // Check if the file exists + if (File.Exists(filePath)) + { + // Apply the enabled style if the file exists + slider.Style = (Style)Application.Current.FindResource("ToggleSliderStyle"); + } + else + { + // File does not exist; revert the toggle to 0 + ConfigManager.VideoRecord = 0; + slider.Value = 0; // Revert the slider value + slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); + + // Optionally, display a message to the user + MessageBox.Show($"Video record script not found. Please ensure the file exists at:\n{filePath}", + "File Missing", MessageBoxButton.OK, MessageBoxImage.Warning); + } + } + else + { + // Apply the disabled style + slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); + } + } + + private void OfflineModeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) + { + Slider slider = (Slider)sender; + ConfigManager.OfflineMode = (int)slider.Value; // 0 or 1 + + // Check if the value is 0 or 1 and apply the corresponding style + if (ConfigManager.OfflineMode == 0) + { + slider.Style = (Style)Application.Current.FindResource("FalseToggleStyle"); // Apply FalseToggleStyle + } + else + { + slider.Style = (Style)Application.Current.FindResource("ToggleSliderStyle"); // Apply ToggleSliderStyle + } + } + + + private void SaveButton_Click(object sender, RoutedEventArgs e) + { + + ConfigManager.ApiKey = ApiKey.Password; + ConfigManager.ApiUrl = ApiUrl.Text; + ConfigManager.LogFile = LogFilePath.Text; + ConfigManager.VideoPath = VideoPath.Text; + ConfigManager.VisorWipe = (int)VisorWipeSlider.Value; + ConfigManager.VideoRecord = (int)VideoRecordSlider.Value; + ConfigManager.OfflineMode = (int)OfflineModeSlider.Value; + ConfigManager.Theme = (int)ThemeSlider.Value; + // Save the current config values + ConfigManager.SaveConfig(); + // Start the flashing effect + FlashSaveButton(); + } + + private void FlashSaveButton() + { + string? originalText = SaveButton.Content?.ToString() ?? string.Empty; + SaveButton.Content = "Saved"; + + // Save button color change effect + var originalColor = SaveButton.Background; + var accentColor = (Color)Application.Current.Resources["AccentColor"]; + SaveButton.Background = new SolidColorBrush(accentColor); // Change color to accent color + + // Apply glow effect + SaveButton.Effect = new DropShadowEffect + { + Color = accentColor, + BlurRadius = 15, // Add subtle blur + ShadowDepth = 0, // Set shadow depth to 0 for a pure glow effect + Opacity = 0.8, // Set opacity for glow visibility + Direction = 0 // Direction doesn't matter for glow + }; + + // Create a DispatcherTimer to reset everything after the effect + DispatcherTimer timer = new DispatcherTimer + { + Interval = TimeSpan.FromMilliseconds(600) // Interval for flash effect + }; + + int flashCount = 0; + timer.Tick += (sender, e) => + { + if (flashCount < 2) // Flash effect (flash 2 times) + { + flashCount++; + } + else + { + // Stop the timer and restore the original button state + timer.Stop(); + SaveButton.Content = originalText; + SaveButton.Background = originalColor; // Restore the original button color + SaveButton.Effect = null; // Remove the glow effect + } + }; + + // Start the timer + timer.Start(); + } + + private async void TestApiButton_Click(object sender, RoutedEventArgs e) + { + string apiUrl = ApiUrl.Text; + string modifiedUrl = Regex.Replace(apiUrl, @"(https?://[^/]+)/?.*", "$1/test"); + string apiKey = ApiKey.Password; + Debug.WriteLine($"Sending to {modifiedUrl}"); + + try + { + // Configure HttpClient with TLS 1.2 + var handler = new HttpClientHandler + { + SslProtocols = System.Security.Authentication.SslProtocols.Tls12 + }; + + using (var client = new HttpClient(handler)) + { + // Set headers + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey); + client.DefaultRequestHeaders.UserAgent.ParseAdd("AutoTrackR"); + + // Empty JSON body + var content = new StringContent("{}", Encoding.UTF8, "application/json"); + + // Send POST + var response = await client.PostAsync(modifiedUrl, content); + + if (response.IsSuccessStatusCode) + { + MessageBox.Show("API Test Success."); + } + else + { + MessageBox.Show($"Error: {response.StatusCode} - {response.ReasonPhrase}"); + } + } + } + catch (Exception ex) + { + MessageBox.Show($"API Test Failure. {ex.Message}"); + } + } +} + +public class Theme +{ + public ThemeColors? Colors { get; set; } + public ThemeLogo? Logo { get; set; } +} + +public class ThemeColors +{ + public string? Accent { get; set; } + public string? Button { get; set; } + public string? Background { get; set; } + public string? Text { get; set; } + public string? AltText { get; set; } +} + +public class ThemeLogo +{ + public string? Path { get; set; } + public string? Primary { get; set; } // Optional: null if not used } diff --git a/AutoTrackR2/HomePage.xaml.cs b/AutoTrackR2/HomePage.xaml.cs index 66baa77..b765f0a 100644 --- a/AutoTrackR2/HomePage.xaml.cs +++ b/AutoTrackR2/HomePage.xaml.cs @@ -131,13 +131,14 @@ public partial class HomePage : UserControl }; // Ship - TrackREventDispatcher.JumpDriveStateChangedEvent += (shipName) => + TrackREventDispatcher.JumpDriveStateChangedEvent += (data) => { Dispatcher.Invoke(() => { - PlayerShipTextBox.Text = LocalPlayerData.CurrentGameMode == GameMode.PersistentUniverse ? shipName : "Unknown"; + PlayerShipTextBox.Text = data.ShipName; AdjustFontSize(PlayerShipTextBox); - LocalPlayerData.PlayerShip = shipName; + LocalPlayerData.PlayerShip = data.ShipName; + LocalPlayerData.LastSeenVehicleLocation = data.Location; }); }; @@ -170,13 +171,14 @@ public partial class HomePage : UserControl { EnemyPilot = actorDeathData.VictimPilot, EnemyShip = actorDeathData.VictimShip, + Location = LocalPlayerData.LastSeenVehicleLocation, OrgAffiliation = playerData?.OrgName, Weapon = actorDeathData.Weapon, Ship = LocalPlayerData.PlayerShip ?? "Unknown", Method = actorDeathData.DamageType, RecordNumber = playerData?.UEERecord, GameVersion = LocalPlayerData.GameVersion ?? "Unknown", - TrackRver = LocalPlayerData.GameVersion?.Replace("v", "") ?? "Unknown", + TrackRver = "2.10", Enlisted = playerData?.JoinDate, KillTime = DateTime.UtcNow.ToString("dd MMM yyyy HH:mm"), PFP = playerData?.PFPURL ?? "https://cdn.robertsspaceindustries.com/static/images/account/avatar_default_big.jpg" diff --git a/AutoTrackR2/LocalPlayerData.cs b/AutoTrackR2/LocalPlayerData.cs index 87d8911..5412de3 100644 --- a/AutoTrackR2/LocalPlayerData.cs +++ b/AutoTrackR2/LocalPlayerData.cs @@ -14,5 +14,5 @@ public static class LocalPlayerData public static string? PlayerShip; public static string? GameVersion; public static GameMode CurrentGameMode; - public static string? LastSeenVehicleLocation; + public static string? LastSeenVehicleLocation = "Unknown"; } \ No newline at end of file diff --git a/AutoTrackR2/LogEventHandlers/JumpDriveStateChangedEvent.cs b/AutoTrackR2/LogEventHandlers/JumpDriveStateChangedEvent.cs index 9955f7f..2adf26f 100644 --- a/AutoTrackR2/LogEventHandlers/JumpDriveStateChangedEvent.cs +++ b/AutoTrackR2/LogEventHandlers/JumpDriveStateChangedEvent.cs @@ -2,6 +2,12 @@ namespace AutoTrackR2.LogEventHandlers; +public struct JumpDriveStateChangedData +{ + public string ShipName { get; set; } + public string Location { get; set; } +} + public class JumpDriveStateChangedEvent : ILogEventHandler { public Regex Pattern { get; } @@ -9,7 +15,7 @@ public class JumpDriveStateChangedEvent : ILogEventHandler public JumpDriveStateChangedEvent() { - Pattern = new Regex(@"<Jump Drive State Changed>.*.adam: (?<ShipName>.*.) in"); + Pattern = new Regex(@"<Jump Drive State Changed>.*.adam: (?<ShipName>.*.) in zone (?<Location>.*.)\)"); } public void Handle(LogEntry entry) @@ -17,11 +23,20 @@ public class JumpDriveStateChangedEvent : ILogEventHandler if (entry.Message is null) return; var match = Pattern.Match(entry.Message); if (!match.Success) return; - + + var data = new JumpDriveStateChangedData + { + Location = match.Groups["Location"].Value + }; + match = _cleanUpPattern.Match(match.Groups["ShipName"].Value); if (match.Success) { - TrackREventDispatcher.OnJumpDriveStateChangedEvent(match.Groups[1].Value);; + data.ShipName = match.Groups[1].Value; + } + if (!string.IsNullOrEmpty(data.ShipName) && !string.IsNullOrEmpty(data.Location)) + { + TrackREventDispatcher.OnJumpDriveStateChangedEvent(data); } } } \ No newline at end of file diff --git a/AutoTrackR2/LogEventHandlers/RequestJumpFailedEvent.cs b/AutoTrackR2/LogEventHandlers/RequestJumpFailedEvent.cs index c998685..aaef3e3 100644 --- a/AutoTrackR2/LogEventHandlers/RequestJumpFailedEvent.cs +++ b/AutoTrackR2/LogEventHandlers/RequestJumpFailedEvent.cs @@ -9,7 +9,7 @@ public class RequestJumpFailedEvent : ILogEventHandler public RequestJumpFailedEvent() { - Pattern = new Regex(@"<Request Jump Failed>.*.adam: (?<ShipName>.*.) in"); + Pattern = new Regex(@"<Request Jump Failed>.*.adam: (?<ShipName>.*.) in zone (?<Location>.*.)\)"); } public void Handle(LogEntry entry) @@ -18,10 +18,20 @@ public class RequestJumpFailedEvent : ILogEventHandler var match = Pattern.Match(entry.Message); if (!match.Success) return; + var data = new JumpDriveStateChangedData + { + Location = match.Groups["Location"].Value + }; + match = _cleanUpPattern.Match(match.Groups["ShipName"].Value); if (match.Success) { - TrackREventDispatcher.OnJumpDriveStateChangedEvent(match.Groups[1].Value);; + data.ShipName = match.Groups[1].Value; + } + + if (!string.IsNullOrEmpty(data.ShipName) && !string.IsNullOrEmpty(data.Location)) + { + TrackREventDispatcher.OnJumpDriveStateChangedEvent(data); } } } \ No newline at end of file diff --git a/AutoTrackR2/LogEventHandlers/VehicleDestructionEvent.cs b/AutoTrackR2/LogEventHandlers/VehicleDestructionEvent.cs index 5f2a20b..47b808a 100644 --- a/AutoTrackR2/LogEventHandlers/VehicleDestructionEvent.cs +++ b/AutoTrackR2/LogEventHandlers/VehicleDestructionEvent.cs @@ -21,14 +21,16 @@ public class VehicleDestructionEvent : ILogEventHandler public Regex Pattern { get; } public VehicleDestructionEvent() { - Pattern = new Regex(""" - "<(?<timestamp>[^>]+)> \[Notice\] <Vehicle Destruction> CVehicle::OnAdvanceDestroyLevel: " + - "Vehicle '(?<vehicle>[^']+)' \[\d+\] in zone '(?<vehicle_zone>[^']+)' " + - "\[pos x: (?<pos_x>[-\d\.]+), y: (?<pos_y>[-\d\.]+), z: (?<pos_z>[-\d\.]+) " + - "vel x: [^,]+, y: [^,]+, z: [^\]]+\] driven by '(?<driver>[^']+)' \[\d+\] " + - "advanced from destroy level (?<destroy_level_from>\d+) to (?<destroy_level_to>\d+) " + - "caused by '(?<caused_by>[^']+)' \[\d+\] with '(?<damage_type>[^']+)'" - """); + const string patternStr = """ + <(?<timestamp>[^>]+)> \[Notice\] <Vehicle Destruction> CVehicle::OnAdvanceDestroyLevel: + Vehicle '(?<vehicle>[^']+)' \[\d+\] in zone '(?<vehicle_zone>[^']+)' + \[pos x: (?<pos_x>[-\d\.]+), y: (?<pos_y>[-\d\.]+), z: (?<pos_z>[-\d\.]+) + vel x: [^,]+, y: [^,]+, z: [^\]]+\] driven by '(?<driver>[^']+)' \[\d+\] + advanced from destroy level (?<destroy_level_from>\d+) to (?<destroy_level_to>\d+) + caused by '(?<caused_by>[^']+)' \[\d+\] with '(?<damage_type>[^']+)' + """; + + Pattern = new Regex(Regex.Replace(patternStr, @"\t|\n|\r", "")); } public void Handle(LogEntry entry) diff --git a/AutoTrackR2/LogHandler.cs b/AutoTrackR2/LogHandler.cs index 9941419..2e2ab91 100644 --- a/AutoTrackR2/LogHandler.cs +++ b/AutoTrackR2/LogHandler.cs @@ -42,7 +42,8 @@ public class LogHandler new InPersistentUniverseEvent(), new GameVersionEvent(), new JumpDriveStateChangedEvent(), - new RequestJumpFailedEvent() + new RequestJumpFailedEvent(), + new VehicleDestructionEvent() ]; public LogHandler(string? logPath) diff --git a/AutoTrackR2/MainWindow.xaml.cs b/AutoTrackR2/MainWindow.xaml.cs index 66672ce..f6bde94 100644 --- a/AutoTrackR2/MainWindow.xaml.cs +++ b/AutoTrackR2/MainWindow.xaml.cs @@ -25,7 +25,24 @@ namespace AutoTrackR2 public void ChangeLogoImage(string imagePath) { - Logo.Source = new BitmapImage(new Uri(imagePath, UriKind.RelativeOrAbsolute)); + try + { + // Ensure the path starts with a forward slash for WPF resource paths + if (!imagePath.StartsWith("/")) + { + imagePath = "/" + imagePath; + } + + // Create a pack URI for the resource + Uri uri = new Uri($"pack://application:,,,/AutoTrackR2;component{imagePath}", UriKind.Absolute); + Logo.Source = new BitmapImage(uri); + } + catch (Exception ex) + { + // Log the error or handle it appropriately + Debug.WriteLine($"Error loading logo image: {ex.Message}"); + // Optionally set a default logo or handle the error + } } public MainWindow() @@ -181,11 +198,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( @@ -193,12 +210,12 @@ namespace AutoTrackR2 "AutoTrackR2", "Kill-log.csv" ); - + AHKScriptFolder = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "AutoTrackR2" ); - + VisorWipeScript = "visorwipe.ahk"; VideoRecordScript = "videorecord.ahk"; } diff --git a/AutoTrackR2/TrackREventDispatcher.cs b/AutoTrackR2/TrackREventDispatcher.cs index 9aaab03..d5dc3ae 100644 --- a/AutoTrackR2/TrackREventDispatcher.cs +++ b/AutoTrackR2/TrackREventDispatcher.cs @@ -49,9 +49,9 @@ public static class TrackREventDispatcher // Jump Drive state has changed // Todo: Add proper data for this event. Right now only ship name is used. - public static event Action<string>? JumpDriveStateChangedEvent; - public static void OnJumpDriveStateChangedEvent(string shipName) + public static event Action<JumpDriveStateChangedData>? JumpDriveStateChangedEvent; + public static void OnJumpDriveStateChangedEvent(JumpDriveStateChangedData data) { - JumpDriveStateChangedEvent?.Invoke(shipName); + JumpDriveStateChangedEvent?.Invoke(data); } } \ No newline at end of file diff --git a/AutoTrackR2/Util.cs b/AutoTrackR2/Util.cs index b5931de..f783330 100644 --- a/AutoTrackR2/Util.cs +++ b/AutoTrackR2/Util.cs @@ -19,6 +19,7 @@ public struct KillData public string? Enlisted; public string? RecordNumber; public string? OrgAffiliation; + public string? Location; public string? Player; public string? Weapon; public string? Ship; diff --git a/AutoTrackR2/WebHandler.cs b/AutoTrackR2/WebHandler.cs index d199ccd..e53e809 100644 --- a/AutoTrackR2/WebHandler.cs +++ b/AutoTrackR2/WebHandler.cs @@ -5,6 +5,7 @@ using System.Text.Json; using System.Text.RegularExpressions; using AutoTrackR2.LogEventHandlers; using System.Globalization; +using System.Security.Cryptography; namespace AutoTrackR2; @@ -24,6 +25,27 @@ public static class WebHandler public string? trackr_version { get; set; } public string? location { get; set; } public long time { get; set; } + public string hash { get; set; } = string.Empty; + } + + private static string GenerateKillHash(string victimName, long timestamp) + { + // Combine victim name and timestamp + string combined = $"{victimName}_{timestamp}"; + + // Create SHA256 hash + using (SHA256 sha256 = SHA256.Create()) + { + byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(combined)); + + // Convert byte array to hex string + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < bytes.Length; i++) + { + builder.Append(bytes[i].ToString("x2")); + } + return builder.ToString(); + } } public static async Task<PlayerData?> GetPlayerData(string enemyPilot) @@ -82,6 +104,7 @@ public static class WebHandler public static async Task SubmitKill(KillData killData) { + var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); var apiKillData = new APIKillData { victim_ship = killData.EnemyShip, @@ -94,8 +117,9 @@ public static class WebHandler loadout_ship = killData.Ship, game_version = killData.GameVersion, trackr_version = killData.TrackRver, - location = "Unknown", - time = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + location = killData.Location, + time = timestamp, + hash = GenerateKillHash(killData.EnemyPilot!, timestamp) }; if (string.IsNullOrEmpty(apiKillData.rsi)) @@ -123,6 +147,7 @@ public static class WebHandler Console.WriteLine($"API URL: {ConfigManager.ApiUrl}register-kill"); Console.WriteLine($"Victim: {apiKillData.victim}"); Console.WriteLine($"Victim Ship: {apiKillData.victim_ship}"); + Console.WriteLine($"Location: {apiKillData.location}"); Console.WriteLine($"Weapon: {apiKillData.weapon}"); Console.WriteLine($"Method: {apiKillData.method}"); Console.WriteLine($"Game Mode: {apiKillData.gamemode}"); diff --git a/AutoTrackR2/themes.json b/AutoTrackR2/themes.json new file mode 100644 index 0000000..57f41ee --- /dev/null +++ b/AutoTrackR2/themes.json @@ -0,0 +1,321 @@ +{ + "Blue": { + "Colors": { + "Accent": "#00A9E0", + "Button": "#0F1A2B", + "Background": "#1D2D44", + "Text": "#FFFFFF", + "AltText": "#A88F2C" + }, + "Logo": { + "Path": "/Assets/AutoTrackR.png" + } + }, + "Green": { + "Colors": { + "Accent": "#1D9F00", + "Button": "#262424", + "Background": "#072501", + "Text": "#D7AF3C", + "AltText": "#DCD6C4" + }, + "Logo": { + "Path": "/Assets/AutoTrackR.png" + } + }, + "Red": { + "Colors": { + "Accent": "#D32F2F", + "Button": "#424242", + "Background": "#212121", + "Text": "#E0E0E0", + "AltText": "#A88F2C" + }, + "Logo": { + "Path": "/Assets/AutoTrackR.png" + } + }, + "Purple": { + "Colors": { + "Accent": "#32CD32", + "Button": "#33065F", + "Background": "#43065F", + "Text": "#00FF00", + "AltText": "#B3976E" + }, + "Logo": { + "Path": "/Assets/AutoTrackR.png" + } + }, + "GN": { + "Colors": { + "Accent": "#FF0000", + "Button": "#1A0000", + "Background": "#0A0000", + "Text": "#FFD700", + "AltText": "#FF4500" + }, + "Logo": { + "Path": "/Assets/GN.png", + "Primary": "#FF0000" + } + }, + "NW": { + "Colors": { + "Accent": "#B92D2D", + "Button": "#1C1C1C", + "Background": "#262424", + "Text": "#01DDDA", + "AltText": "#A88F2C" + }, + "Logo": { + "Path": "/Assets/NW.png", + "Primary": "#01DDDA" + } + }, + "D3VL": { + "Colors": { + "Accent": "#AA0000", + "Button": "#333333", + "Background": "#220000", + "Text": "#FF0000", + "AltText": "#A88F2C" + }, + "Logo": { + "Path": "/Assets/D3VL.png", + "Primary": "#CC0000" + } + }, + "HIT": { + "Colors": { + "Accent": "#B92D2D", + "Button": "#1C1C1C", + "Background": "#262424", + "Text": "#7d7d7d", + "AltText": "#A88F2C" + }, + "Logo": { + "Path": "/Assets/HIT.png" + } + }, + "WRAITH": { + "Colors": { + "Accent": "#ff0000", + "Button": "#2a2a2a", + "Background": "#0a0a0a", + "Text": "#DFDFDF", + "AltText": "#8B0000" + }, + "Logo": { + "Path": "/Assets/WRITH.png", + "Primary": "#ff0000" + } + }, + "Cinderborn": { + "Colors": { + "Accent": "#FF4500", + "Button": "#2A0A0A", + "Background": "#1A0000", + "Text": "#FF8C42", + "AltText": "#FF6B35" + }, + "Logo": { + "Path": "/Assets/cinderborn.png", + "Primary": "#FF4500" + } + }, + "EMP": { + "Colors": { + "Accent": "#F5721C", + "Button": "#535353", + "Background": "#080000", + "Text": "#FFFFFF", + "AltText": "#CEA75B" + }, + "Logo": { + "Path": "/Assets/EMP.png", + "Primary": "#F3BD9B" + } + }, + "AVS": { + "Colors": { + "Accent": "#00BFFF", + "Button": "#001F3F", + "Background": "#000B1A", + "Text": "#FFFFFF", + "AltText": "#87CEEB" + }, + "Logo": { + "Path": "/Assets/AVSQN.png", + "Primary": "#00BFFF" + } + }, + "HEX": { + "Colors": { + "Accent": "#00FF00", + "Button": "#001A00", + "Background": "#000D00", + "Text": "#FFFFFF", + "AltText": "#39FF14" + }, + "Logo": { + "Path": "/Assets/HEX.png", + "Primary": "#00FF00" + } + }, + "Mammon": { + "Colors": { + "Accent": "#FFD700", + "Button": "#2C2C2C", + "Background": "#1A1A1A", + "Text": "#FFFFFF", + "AltText": "#DAA520" + }, + "Logo": { + "Path": "/Assets/MAMMON.png", + "Primary": "#FFD700" + } + }, + "Shadow Moses": { + "Colors": { + "Accent": "#FF69B4", + "Button": "#2C2C2C", + "Background": "#2C1F28", + "Text": "#E6E6E6", + "AltText": "#FF1493" + }, + "Logo": { + "Path": "/Assets/ShadowMoses.png", + "Primary": "#FF69B4" + } + }, + "Mongrel Squad": { + "Colors": { + "Accent": "#00BFFF", + "Button": "#003366", + "Background": "#001F3F", + "Text": "#E6F3FF", + "AltText": "#87CEEB" + }, + "Logo": { + "Path": "/Assets/BOBGREL.png", + "Primary": "#00BFFF" + } + }, + "Feezy": { + "Colors": { + "Accent": "#FFA500", + "Button": "#1B0C04", + "Background": "#1B0C04", + "Text": "#FFE4B5", + "AltText": "#A88F2C" + }, + "Logo": { + "Path": "/Assets/chibifox.png", + "Primary": "#FFA500" + } + }, + "NMOS": { + "Colors": { + "Accent": "#EAB787", + "Button": "#601C1B", + "Background": "#170402", + "Text": "#F6DBAD", + "AltText": "#EBCAA0" + }, + "Logo": { + "Path": "/Assets/NMOS.png", + "Primary": "#EAB787" + } + }, + "Rakk": { + "Colors": { + "Accent": "#FF00FF", + "Button": "#1C1C1C", + "Background": "#0A0A0A", + "Text": "#E6E6E6", + "AltText": "#00BFFF" + }, + "Logo": { + "Path": "/Assets/RACKETEERS.png", + "Primary": "#FF00FF" + } + }, + "Blightveil": { + "Colors": { + "Accent": "#8B4AC6", + "Button": "#2A2035", + "Background": "#1A1621", + "Text": "#FFFFFF", + "AltText": "#FF3333" + }, + "Logo": { + "Path": "/Assets/Blightveil.png", + "Primary": "#8B4AC6" + } + }, + "Gankhub": { + "Colors": { + "Accent": "#ffa500", + "Button": "#2C2C2C", + "Background": "#1b1b1b", + "Text": "#FFFFFF", + "AltText": "#ffa500" + }, + "Logo": { + "Path": "/Assets/Gankhub.png" + } + }, + "IronPoint": { + "Colors": { + "Accent": "#FF0000", + "Button": "#1C1C1C", + "Background": "#000000", + "Text": "#FFFFFF", + "AltText": "#A88F2C" + }, + "Logo": { + "Path": "/Assets/IP.png", + "Primary": "#FF0000" + } + }, + "Shadow Guardian": { + "Colors": { + "Accent": "#8B0000", + "Button": "#1A0000", + "Background": "#0A0000", + "Text": "#D3D3D3", + "AltText": "#B22222" + }, + "Logo": { + "Path": "/Assets/shadowguard.png", + "Primary": "#8B0000" + } + }, + "VOX": { + "Colors": { + "Accent": "#C0C0C0", + "Button": "#1C1C1C", + "Background": "#424242", + "Text": "#FFD700", + "AltText": "#817E79" + }, + "Logo": { + "Path": "/Assets/VOX.png", + "Primary": "#FFD700" + } + }, + "Zap": { + "Colors": { + "Accent": "#FFD700", + "Button": "#1A1A1A", + "Background": "#0A0A0A", + "Text": "#FFFFFF", + "AltText": "#FFA500" + }, + "Logo": { + "Path": "/Assets/ZAP.png", + "Primary": "#FFD700" + } + } +} \ No newline at end of file