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

@ -30,7 +30,7 @@ namespace Bloxstrap.Integrations
private int _logEntriesRead = 0; private int _logEntriesRead = 0;
private bool _teleportMarker = false; private bool _teleportMarker = false;
private bool _reservedTeleportMarker = false; private bool _reservedTeleportMarker = false;
public event EventHandler<string>? OnLogEntry; public event EventHandler<string>? OnLogEntry;
public event EventHandler? OnGameJoin; public event EventHandler? OnGameJoin;
public event EventHandler? OnGameLeave; public event EventHandler? OnGameLeave;
@ -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 = "";
// check if log file was created before the tracker launched
FileInfo logFileInfo = new DirectoryInfo(logDirectory)
.GetFiles()
.Where(x => x.Name.Contains("Player", StringComparison.OrdinalIgnoreCase) && x.CreationTime <= DateTime.Now)
.OrderByDescending(x => x.CreationTime)
.First();
// is 15s too much?
if (logFileInfo.CreationTime.AddSeconds(15) < DateTime.Now)
{ {
logFileInfo = new DirectoryInfo(logDirectory) // wait for the log file
.GetFiles() using (FileSystemWatcher watcher = new FileSystemWatcher())
.Where(x => x.Name.Contains("Player", StringComparison.OrdinalIgnoreCase) && x.CreationTime <= DateTime.Now) using (AutoResetEvent waitEvent = new AutoResetEvent(false))
.OrderByDescending(x => x.CreationTime) {
.First(); watcher.Path = logDirectory;
watcher.Created += (s, e) => logPath = e.FullPath; waitEvent.Set();
watcher.EnableRaisingEvents = true;
if (logFileInfo.CreationTime.AddSeconds(15) > DateTime.Now) App.Logger.WriteLine(LOG_IDENT, "Waiting for log file.");
break;
App.Logger.WriteLine(LOG_IDENT, $"Could not find recent enough log file, waiting... (newest is {logFileInfo.Name})"); waitEvent.WaitOne();
await Task.Delay(1000); }
} }
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();