use FileSystemWatcher for activity watcher

This commit is contained in:
bluepilledgreat 2024-09-05 20:08:35 +01:00
parent 15dc2dfbfe
commit 9fac9290c8

View File

@ -74,40 +74,56 @@ namespace Bloxstrap.Integrations
if (!Directory.Exists(logDirectory)) if (!Directory.Exists(logDirectory))
return; return;
FileInfo logFileInfo;
// we need to make sure we're fetching the absolute latest log file // we need to make sure we're fetching the absolute latest log file
// if roblox doesn't start quickly enough, we can wind up fetching the previous log file // if roblox doesn't start quickly enough, we can wind up fetching the previous log file
// good rule of thumb is to find a log file that was created in the last 15 seconds or so // good rule of thumb is to find a log file that was created in the last 15 seconds or so
App.Logger.WriteLine(LOG_IDENT, "Opening Roblox log file..."); App.Logger.WriteLine(LOG_IDENT, "Opening Roblox log file...");
while (true) string logPath = "";
{
logFileInfo = new DirectoryInfo(logDirectory) // check if log file was created before the tracker launched
FileInfo logFileInfo = new DirectoryInfo(logDirectory)
.GetFiles() .GetFiles()
.Where(x => x.Name.Contains("Player", StringComparison.OrdinalIgnoreCase) && x.CreationTime <= DateTime.Now) .Where(x => x.Name.Contains("Player", StringComparison.OrdinalIgnoreCase) && x.CreationTime <= DateTime.Now)
.OrderByDescending(x => x.CreationTime) .OrderByDescending(x => x.CreationTime)
.First(); .First();
if (logFileInfo.CreationTime.AddSeconds(15) > DateTime.Now) // is 15s too much?
break; if (logFileInfo.CreationTime.AddSeconds(15) < DateTime.Now)
{
// wait for the log file
using (FileSystemWatcher watcher = new FileSystemWatcher())
using (AutoResetEvent waitEvent = new AutoResetEvent(false))
{
watcher.Path = logDirectory;
watcher.Created += (s, e) => logPath = e.FullPath; waitEvent.Set();
watcher.EnableRaisingEvents = true;
App.Logger.WriteLine(LOG_IDENT, $"Could not find recent enough log file, waiting... (newest is {logFileInfo.Name})"); App.Logger.WriteLine(LOG_IDENT, "Waiting for log file.");
await Task.Delay(1000);
waitEvent.WaitOne();
} }
}
else
{
logPath = logFileInfo.FullName;
App.Logger.WriteLine(LOG_IDENT, "Found recent log file.");
}
App.Logger.WriteLine(LOG_IDENT, $"Got log file: {Path.GetFileName(logPath)}");
OnLogOpen?.Invoke(this, EventArgs.Empty); OnLogOpen?.Invoke(this, EventArgs.Empty);
LogLocation = logFileInfo.FullName; LogLocation = logPath;
FileStream logFileStream = logFileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite); FileStream logFileStream = File.Open(logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
App.Logger.WriteLine(LOG_IDENT, $"Opened {LogLocation}"); App.Logger.WriteLine(LOG_IDENT, $"Opened {logPath}");
var logUpdatedEvent = new AutoResetEvent(false); var logUpdatedEvent = new AutoResetEvent(false);
var logWatcher = new FileSystemWatcher() var logWatcher = new FileSystemWatcher()
{ {
Path = logDirectory, Path = logDirectory,
Filter = Path.GetFileName(logFileInfo.FullName), Filter = Path.GetFileName(logPath),
EnableRaisingEvents = true EnableRaisingEvents = true
}; };
logWatcher.Changed += (s, e) => logUpdatedEvent.Set(); logWatcher.Changed += (s, e) => logUpdatedEvent.Set();