AutoTrackR2/AutoTrackR2/HomePage.xaml.cs
2025-03-26 01:23:06 -07:00

326 lines
11 KiB
C#

using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Windows.Documents;
using System.Globalization;
using System.Windows.Media.Imaging;
using AutoTrackR2.LogEventHandlers;
namespace AutoTrackR2;
public struct PlayerData
{
public string? PFPURL;
public string? UEERecord;
public string? OrgURL;
public string? OrgName;
public string? JoinDate;
}
public partial class HomePage : UserControl
{
public HomePage()
{
InitializeComponent();
// Get the current month
string currentMonth = DateTime.Now.ToString("MMMM", CultureInfo.InvariantCulture);
// Set the TextBlock text
KillTallyTitle.Text = $"Kill Tally - {currentMonth}";
}
private Process runningProcess; // Field to store the running process
private LogHandler _logHandler;
private bool _UIEventsRegistered = false;
// Update Start/Stop button states based on the isRunning flag
public void UpdateButtonState(bool isRunning)
{
var accentColor = (Color)Application.Current.Resources["AccentColor"];
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
}
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
}
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 RegisterUIEventHandlers()
{
if (_UIEventsRegistered)
return;
// Username
TrackREventDispatcher.PlayerLoginEvent += (username) => {
Dispatcher.Invoke(() =>
{
PilotNameTextBox.Text = username;
AdjustFontSize(PilotNameTextBox);
LocalPlayerData.Username = username;
});
};
// Ship
TrackREventDispatcher.InstancedInteriorEvent += (data) => {
if (data.OwnerGEID == LocalPlayerData.Username && data.Ship != null)
{
Dispatcher.Invoke(() =>
{
PlayerShipTextBox.Text = data.Ship;
AdjustFontSize(PlayerShipTextBox);
LocalPlayerData.PlayerShip = data.Ship;
});
}
};
// Game Mode
TrackREventDispatcher.PlayerChangedGameModeEvent += (mode) => {
Dispatcher.Invoke(() =>
{
GameModeTextBox.Text = mode.ToString();
AdjustFontSize(GameModeTextBox);
LocalPlayerData.CurrentGameMode = mode;
});
};
// Game Version
TrackREventDispatcher.GameVersionEvent += (version) => {
LocalPlayerData.GameVersion = version;
};
// Actor Death
TrackREventDispatcher.ActorDeathEvent += async (data) => {
if (data.VictimPilot != LocalPlayerData.Username)
{
var playerData = await WebHandler.GetPlayerData(data.VictimPilot);
if (playerData != null)
{
Dispatcher.Invoke(() => { AddKillToScreen(data, playerData); });
await WebHandler.SubmitKill(data, playerData);
}
}
};
_UIEventsRegistered = true;
}
private void AddKillToScreen(ActorDeathData deathData, PlayerData? playerData)
{
// Fetch the dynamic resource for AltTextColor
var altTextColorBrush = new SolidColorBrush((Color)Application.Current.Resources["AltTextColor"]);
var accentColorBrush = new SolidColorBrush((Color)Application.Current.Resources["AccentColor"]);
// Fetch the Orbitron FontFamily from resources
var orbitronFontFamily = (FontFamily)Application.Current.Resources["Orbitron"];
var gemunuFontFamily = (FontFamily)Application.Current.Resources["Gemunu"];
// Create a new TextBlock for each kill
var killTextBlock = new TextBlock
{
Margin = new Thickness(0, 10, 0, 10),
Style = (Style)Application.Current.Resources["RoundedTextBlock"], // Apply style for text
FontSize = 14,
FontWeight = FontWeights.Bold,
FontFamily = gemunuFontFamily,
};
// Add styled content using Run elements
killTextBlock.Inlines.Add(new Run("Victim Name: ")
{
Foreground = altTextColorBrush,
FontFamily = orbitronFontFamily,
});
killTextBlock.Inlines.Add(new Run($"{deathData.VictimPilot}\n"));
// Repeat for other lines
killTextBlock.Inlines.Add(new Run("Victim Ship: ")
{
Foreground = altTextColorBrush,
FontFamily = orbitronFontFamily,
});
killTextBlock.Inlines.Add(new Run($"{deathData.VictimShip}\n"));
killTextBlock.Inlines.Add(new Run("Victim Org: ")
{
Foreground = altTextColorBrush,
FontFamily = orbitronFontFamily,
});
killTextBlock.Inlines.Add(new Run($"{playerData?.OrgName}\n"));
killTextBlock.Inlines.Add(new Run("Join Date: ")
{
Foreground = altTextColorBrush,
FontFamily = orbitronFontFamily,
});
killTextBlock.Inlines.Add(new Run($"{playerData?.JoinDate}\n"));
killTextBlock.Inlines.Add(new Run("UEE Record: ")
{
Foreground = altTextColorBrush,
FontFamily = orbitronFontFamily,
});
const string dateFormatString = "dd MMM yyyy HH:mm";
var currentTime = DateTime.UtcNow.ToString(dateFormatString);
killTextBlock.Inlines.Add(new Run("Kill Time: ")
{
Foreground = altTextColorBrush,
FontFamily = orbitronFontFamily,
});
killTextBlock.Inlines.Add(new Run($"{currentTime}"));
// Create a Border and apply the RoundedTextBlockWithBorder style
var killBorder = new Border
{
Style = (Style)Application.Current.Resources["RoundedTextBlockWithBorder"], // Apply border style
};
// Create a Grid to hold the TextBlock and the Image
var killGrid = new Grid
{
Width = 400, // Adjust the width of the Grid
Height = 130, // Adjust the height as needed
};
// Define two columns in the Grid: one for the text and one for the image
killGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(3, GridUnitType.Star) }); // Text column
killGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Auto) }); // Image column
// Add the TextBlock to the first column of the Grid
Grid.SetColumn(killTextBlock, 0);
killGrid.Children.Add(killTextBlock);
// Create the Image for the profile
var profileImage = new Image
{
Source = new BitmapImage(new Uri(playerData?.PFPURL)), // Assuming the 8th part contains the profile image URL
Width = 90,
Height = 90,
Stretch = Stretch.Fill, // Adjust how the image fits
};
// Create a Border around the Image
var imageBorder = new Border
{
BorderBrush = accentColorBrush, // Set the border color
BorderThickness = new Thickness(2), // Set the border thickness
Padding = new Thickness(0), // Optional padding inside the border
CornerRadius = new CornerRadius(5),
Margin = new Thickness(10,18,15,18),
Child = profileImage // Set the Image as the content of the Border
};
// Add the Border (with the image inside) to the Grid
Grid.SetColumn(imageBorder, 1);
killGrid.Children.Add(imageBorder);
// Set the Grid as the child of the Border
killBorder.Child = killGrid;
// Add the new Border to the StackPanel inside the Border
Dispatcher.Invoke(() =>
{
KillFeedStackPanel.Children.Insert(0, killBorder);
});
}
public void StopButton_Click(object sender, RoutedEventArgs e)
{
_logHandler.Stop();
// Clear the text boxes
System.Threading.Thread.Sleep(200);
PilotNameTextBox.Text = string.Empty;
PlayerShipTextBox.Text = string.Empty;
GameModeTextBox.Text = string.Empty;
KillTallyTextBox.Text = string.Empty;
KillFeedStackPanel.Children.Clear();
}
private void AdjustFontSize(TextBlock textBlock)
{
// Set a starting font size
double fontSize = 14;
double maxWidth = textBlock.Width;
if (string.IsNullOrEmpty(textBlock.Text) || double.IsNaN(maxWidth))
return;
// Measure the rendered width of the text
FormattedText formattedText = new FormattedText(
textBlock.Text,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface(textBlock.FontFamily, textBlock.FontStyle, textBlock.FontWeight, textBlock.FontStretch),
fontSize,
textBlock.Foreground,
VisualTreeHelper.GetDpi(this).PixelsPerDip
);
// Reduce font size until text fits within the width
while (formattedText.Width > maxWidth && fontSize > 6)
{
fontSize -= 0.5;
formattedText = new FormattedText(
textBlock.Text,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface(textBlock.FontFamily, textBlock.FontStyle, textBlock.FontWeight, textBlock.FontStretch),
fontSize,
textBlock.Foreground,
VisualTreeHelper.GetDpi(this).PixelsPerDip
);
}
// Apply the adjusted font size
textBlock.FontSize = fontSize;
}
}