Compare commits

..

No commits in common. "ad773f6790d0e7252dfc9389d70cf9a87b774c10" and "d58d3af8fc00dcbf46cc8e2872bee1228dc1be96" have entirely different histories.

5 changed files with 30 additions and 153 deletions

View file

@ -25,9 +25,6 @@ public partial class HomePage : UserControl
private bool _isLogHandlerRunning = false;
private int _counter = 1;
private System.Timers.Timer _counterTimer;
private bool _isInitializing = false;
private System.Timers.Timer? _initializationTimer;
private bool _wasStarCitizenRunningOnStart = false;
public HomePage()
{
@ -45,18 +42,6 @@ public partial class HomePage : UserControl
AdjustFontSize(KillTallyTextBox);
AddKillHistoryKillsToUI();
// Check if Star Citizen is already running
_wasStarCitizenRunningOnStart = IsStarCitizenRunning();
if (_wasStarCitizenRunningOnStart)
{
UpdateStatusIndicator(true);
InitializeLogHandler();
}
else
{
UpdateStatusIndicator(false);
}
// Initialize and start the status check timer
_statusCheckTimer = new System.Timers.Timer(1000); // Check every second
_statusCheckTimer.Elapsed += CheckStarCitizenStatus;
@ -66,6 +51,16 @@ public partial class HomePage : UserControl
_counterTimer = new System.Timers.Timer(1000); // Update every second
_counterTimer.Elapsed += UpdateCounter;
_counterTimer.Start();
// Check if Star Citizen is already running and initialize accordingly
if (IsStarCitizenRunning())
{
Dispatcher.Invoke(() =>
{
UpdateStatusIndicator(true);
InitializeLogHandler(); // Then initialize the log handler
});
}
}
private void CheckStarCitizenStatus(object? sender, ElapsedEventArgs e)
@ -73,44 +68,14 @@ public partial class HomePage : UserControl
bool isRunning = IsStarCitizenRunning();
Dispatcher.Invoke(() =>
{
if (_isInitializing)
{
return; // Don't update status while initializing
}
UpdateStatusIndicator(isRunning);
if (isRunning)
{
if (!_isLogHandlerRunning)
{
if (_wasStarCitizenRunningOnStart)
{
// Game was already running on start, initialize immediately
UpdateStatusIndicator(true);
InitializeLogHandler();
}
else
{
// Game started after app launch, use initialization delay
_isInitializing = true;
UpdateStatusIndicator(false, true); // Set to yellow for initialization
_initializationTimer = new System.Timers.Timer(20000); // 20 seconds
_initializationTimer.Elapsed += (sender, e) =>
{
_isInitializing = false;
_initializationTimer?.Stop();
_initializationTimer?.Dispose();
_initializationTimer = null;
Dispatcher.Invoke(() =>
{
// Game is running, start log monitoring and read initial states
UpdateStatusIndicator(true);
InitializeLogHandler();
});
};
_initializationTimer.Start();
}
// Game is running, start log monitoring and read initial states
InitializeLogHandler();
}
}
else
@ -131,23 +96,16 @@ public partial class HomePage : UserControl
_logHandler?.StopMonitoring();
_isLogHandlerRunning = false;
}
UpdateStatusIndicator(false);
}
});
}
private void UpdateStatusIndicator(bool isRunning, bool isInitializing = false)
private void UpdateStatusIndicator(bool isRunning)
{
if (isInitializing)
{
StatusLight.Fill = new SolidColorBrush(Colors.Yellow);
StatusText.Text = "TrackR\nInitializing";
}
else if (isRunning)
if (isRunning)
{
StatusLight.Fill = new SolidColorBrush(Colors.Green);
StatusText.Text = "TrackR\nRunning";
StatusText.Text = "TrackR\nActive";
}
else
{
@ -234,8 +192,7 @@ public partial class HomePage : UserControl
TrackRver = "2.10",
Enlisted = playerData?.JoinDate,
KillTime = ((DateTimeOffset)DateTime.ParseExact(actorDeathData.Timestamp, "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal)).ToUnixTimeSeconds().ToString(),
PFP = playerData?.PFPURL ?? "https://cdn.robertsspaceindustries.com/static/images/account/avatar_default_big.jpg",
Hash = WebHandler.GenerateKillHash(actorDeathData.VictimPilot, ((DateTimeOffset)DateTime.ParseExact(actorDeathData.Timestamp, "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal)).ToUnixTimeSeconds())
PFP = playerData?.PFPURL ?? "https://cdn.robertsspaceindustries.com/static/images/account/avatar_default_big.jpg"
};
switch (LocalPlayerData.CurrentGameMode)
@ -248,13 +205,6 @@ public partial class HomePage : UserControl
break;
}
// Check if this is a duplicate kill
if (WebHandler.IsDuplicateKill(killData.Hash))
{
Console.WriteLine("Duplicate kill detected, skipping...");
return;
}
// Add kill to UI
Dispatcher.Invoke(() =>
{

View file

@ -7,8 +7,8 @@ namespace AutoTrackR2;
public class KillHistoryManager
{
private string _killHistoryPath;
private readonly string _headers = "KillTime,EnemyPilot,EnemyShip,Enlisted,RecordNumber,OrgAffiliation,Player,Weapon,Ship,Method,Mode,GameVersion,TrackRver,Logged,PFP,Hash\n";
private readonly string _headers = "KillTime,EnemyPilot,EnemyShip,Enlisted,RecordNumber,OrgAffiliation,Player,Weapon,Ship,Method,Mode,GameVersion,TrackRver,Logged,PFP\n";
public KillHistoryManager(string logPath)
{
_killHistoryPath = logPath;
@ -89,8 +89,8 @@ public class KillHistoryManager
// Append the new kill data to the CSV file
var csv = new StringBuilder();
csv.AppendLine($"\"{killData.KillTime}\",\"{killData.EnemyPilot}\",\"{killData.EnemyShip}\",\"{killData.Enlisted}\",\"{killData.RecordNumber}\",\"{killData.OrgAffiliation}\",\"{killData.Player}\",\"{killData.Weapon}\",\"{killData.Ship}\",\"{killData.Method}\",\"{killData.Mode}\",\"{killData.GameVersion}\",\"{killData.TrackRver}\",\"{killData.Logged}\",\"{killData.PFP}\",\"{killData.Hash}\"");
csv.AppendLine($"\"{killData.KillTime}\",\"{killData.EnemyPilot}\",\"{killData.EnemyShip}\",\"{killData.Enlisted}\",\"{killData.RecordNumber}\",\"{killData.OrgAffiliation}\",\"{killData.Player}\",\"{killData.Weapon}\",\"{killData.Ship}\",\"{killData.Method}\",\"{killData.Mode}\",\"{killData.GameVersion}\",\"{killData.TrackRver}\",\"{killData.Logged}\",\"{killData.PFP}\"");
// Check file can be written to
try
{
@ -138,8 +138,7 @@ public class KillHistoryManager
GameVersion = data?[11],
TrackRver = data?[12],
Logged = data?[13],
PFP = data?[14],
Hash = data?[15]
PFP = data?[14]
});
}

View file

@ -30,11 +30,8 @@ public class LogHandler
private CancellationTokenSource? _cancellationTokenSource;
private GameProcessState _gameProcessState = GameProcessState.NotRunning;
private bool _isMonitoring = false;
private bool _isInitializing = false;
private System.Timers.Timer? _initializationTimer;
public bool IsMonitoring => _isMonitoring;
public bool IsInitializing => _isInitializing;
// Handlers that should be run on every log entry
// Overlap with _startupEventHandlers is fine
@ -65,37 +62,6 @@ public class LogHandler
throw new FileNotFoundException("Log file not found", _logPath);
}
// Check if Star Citizen is running
if (!IsStarCitizenRunning())
{
StartInitializationDelay();
return;
}
InitializeLogHandler();
}
private void StartInitializationDelay()
{
_isInitializing = true;
_initializationTimer = new System.Timers.Timer(20000); // 20 seconds
_initializationTimer.Elapsed += (sender, e) =>
{
_isInitializing = false;
_initializationTimer?.Stop();
_initializationTimer?.Dispose();
_initializationTimer = null;
if (IsStarCitizenRunning())
{
InitializeLogHandler();
}
};
_initializationTimer.Start();
}
private void InitializeLogHandler()
{
_fileStream = new FileStream(_logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
_reader = new StreamReader(_fileStream);
@ -109,11 +75,6 @@ public class LogHandler
StartMonitoring();
}
private bool IsStarCitizenRunning()
{
return Process.GetProcessesByName("StarCitizen").Length > 0;
}
public void StartMonitoring()
{
if (_isMonitoring) return;
@ -195,26 +156,14 @@ public class LogHandler
GameProcessState newGameProcessState = process != null ? GameProcessState.Running : GameProcessState.NotRunning;
if (newGameProcessState == GameProcessState.Running && _gameProcessState == GameProcessState.NotRunning)
{
// Game process went from NotRunning to Running, wait 20 seconds before reloading
Console.WriteLine("Game process started, waiting 20 seconds before initializing...");
_isInitializing = true;
// Game process went from NotRunning to Running, so reload the Game.log file
Console.WriteLine("Game process started, reloading log file");
_initializationTimer = new System.Timers.Timer(20000); // 20 seconds
_initializationTimer.Elapsed += (sender, e) =>
{
_isInitializing = false;
_initializationTimer?.Stop();
_initializationTimer?.Dispose();
_initializationTimer = null;
_reader?.Close();
_fileStream?.Close();
Console.WriteLine("Initialization delay complete, reloading log file");
_reader?.Close();
_fileStream?.Close();
_fileStream = new FileStream(_logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
_reader = new StreamReader(_fileStream);
};
_initializationTimer.Start();
_fileStream = new FileStream(_logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
_reader = new StreamReader(_fileStream);
}
_gameProcessState = newGameProcessState;
}

View file

@ -29,5 +29,4 @@ public struct KillData
public string? TrackRver;
public string? Logged;
public string? PFP;
public string? Hash;
}

View file

@ -6,19 +6,11 @@ using System.Text.RegularExpressions;
using AutoTrackR2.LogEventHandlers;
using System.Globalization;
using System.Security.Cryptography;
using System.Collections.Generic;
namespace AutoTrackR2;
public static class WebHandler
{
private static HashSet<string> _recordedKillHashes = new HashSet<string>();
public static bool IsDuplicateKill(string hash)
{
return _recordedKillHashes.Contains(hash);
}
class APIKillData
{
public string? victim_ship { get; set; }
@ -36,7 +28,7 @@ public static class WebHandler
public string hash { get; set; } = string.Empty;
}
public static string GenerateKillHash(string victimName, long timestamp)
private static string GenerateKillHash(string victimName, long timestamp)
{
// Combine victim name and timestamp
string combined = $"{victimName}_{timestamp}";
@ -113,15 +105,6 @@ public static class WebHandler
public static async Task SubmitKill(KillData killData)
{
var timestamp = long.Parse(killData.KillTime!);
var hash = GenerateKillHash(killData.EnemyPilot!, timestamp);
// Check if this kill has already been recorded
if (_recordedKillHashes.Contains(hash))
{
Console.WriteLine("Duplicate kill detected, skipping...");
return;
}
var apiKillData = new APIKillData
{
victim_ship = killData.EnemyShip,
@ -136,7 +119,7 @@ public static class WebHandler
trackr_version = killData.TrackRver,
location = killData.Location,
time = timestamp,
hash = hash
hash = GenerateKillHash(killData.EnemyPilot!, timestamp)
};
if (string.IsNullOrEmpty(apiKillData.rsi))
@ -192,9 +175,6 @@ public static class WebHandler
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {responseContent}");
// Add the hash to our recorded hashes
_recordedKillHashes.Add(hash);
// Only process streamer data if streamlink is enabled
if (ConfigManager.StreamlinkEnabled == 1)
{