Refactor hot reload system to improve event handling & monitor delete events as well

This commit is contained in:
Thorsten Sommer 2025-06-01 20:54:25 +02:00
parent 7903f13a93
commit 85fcb4a6c8
Signed by: tsommer
GPG Key ID: 371BBA77A02C0108

View File

@ -15,32 +15,11 @@ public static partial class PluginFactory
LOG.LogInformation($"Start hot reloading plugins for path '{HOT_RELOAD_WATCHER.Path}'."); LOG.LogInformation($"Start hot reloading plugins for path '{HOT_RELOAD_WATCHER.Path}'.");
try try
{ {
var messageBus = Program.SERVICE_PROVIDER.GetRequiredService<MessageBus>();
HOT_RELOAD_WATCHER.IncludeSubdirectories = true; HOT_RELOAD_WATCHER.IncludeSubdirectories = true;
HOT_RELOAD_WATCHER.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName; HOT_RELOAD_WATCHER.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
HOT_RELOAD_WATCHER.Filter = "*.lua"; HOT_RELOAD_WATCHER.Filter = "*.lua";
HOT_RELOAD_WATCHER.Changed += async (_, args) => HOT_RELOAD_WATCHER.Changed += HotReloadEventHandler;
{ HOT_RELOAD_WATCHER.Deleted += HotReloadEventHandler;
var changeType = args.ChangeType.ToString().ToLowerInvariant();
if (!await HOT_RELOAD_SEMAPHORE.WaitAsync(0))
{
LOG.LogInformation($"File changed ({changeType}): {args.FullPath}. Already processing another change.");
return;
}
try
{
LOG.LogInformation($"File changed ({changeType}): {args.FullPath}. Reloading plugins...");
await LoadAll();
await messageBus.SendMessage<bool>(null, Event.PLUGINS_RELOADED);
}
finally
{
HOT_RELOAD_SEMAPHORE.Release();
}
};
HOT_RELOAD_WATCHER.EnableRaisingEvents = true; HOT_RELOAD_WATCHER.EnableRaisingEvents = true;
} }
catch (Exception e) catch (Exception e)
@ -52,4 +31,32 @@ public static partial class PluginFactory
LOG.LogInformation("Hot reloading plugins set up."); LOG.LogInformation("Hot reloading plugins set up.");
} }
} }
private static async void HotReloadEventHandler(object _, FileSystemEventArgs args)
{
try
{
var changeType = args.ChangeType.ToString().ToLowerInvariant();
if (!await HOT_RELOAD_SEMAPHORE.WaitAsync(0))
{
LOG.LogInformation($"File changed ({changeType}): {args.FullPath}. Already processing another change.");
return;
}
try
{
LOG.LogInformation($"File changed ({changeType}): {args.FullPath}. Reloading plugins...");
await LoadAll();
await MessageBus.INSTANCE.SendMessage<bool>(null, Event.PLUGINS_RELOADED);
}
finally
{
HOT_RELOAD_SEMAPHORE.Release();
}
}
catch (Exception e)
{
LOG.LogError(e, $"Error while handling hot reload event for file '{args.FullPath}' with change type '{args.ChangeType}'.");
}
}
} }