using AcDream.App.Plugins; using AcDream.App.Rendering; using AcDream.Core.Plugins; using Serilog; Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .CreateLogger(); var datDir = args.FirstOrDefault() ?? Environment.GetEnvironmentVariable("ACDREAM_DAT_DIR"); if (string.IsNullOrWhiteSpace(datDir)) { Log.Error("usage: AcDream.App (or set ACDREAM_DAT_DIR)"); return 2; } var host = new AppPluginHost(new SerilogAdapter(Log.Logger)); var pluginsDir = Path.Combine(AppContext.BaseDirectory, "plugins"); Log.Information("scanning plugins in {PluginsDir}", pluginsDir); var loaded = new List(); foreach (var result in PluginDiscovery.Scan(pluginsDir)) { if (!result.Success) { Log.Warning("plugin discovery failed for {Dir}: {Error}", result.PluginDirectory, result.Error); continue; } var loadResult = PluginLoader.Load(result.PluginDirectory, result.Manifest!, host); if (!loadResult.Success) { Log.Warning("plugin load failed for {Id}: {Error}", result.Manifest!.Id, loadResult.Error); continue; } loaded.Add(loadResult); Log.Information("loaded plugin {Id} ({DisplayName})", result.Manifest!.Id, result.Manifest.DisplayName); } try { foreach (var plugin in loaded) { try { plugin.Plugin!.Enable(); } catch (Exception ex) { Log.Error(ex, "plugin enable failed: {Id}", plugin.Manifest.Id); } } using var window = new GameWindow(datDir); window.Run(); } finally { foreach (var plugin in loaded) { try { plugin.Plugin!.Disable(); } catch (Exception ex) { Log.Error(ex, "plugin disable failed: {Id}", plugin.Manifest.Id); } } Log.CloseAndFlush(); } return 0;