using System.Reflection; using System.Windows; using System.Windows.Input; using System.Windows.Threading; using Azaion.Annotator.DTO; using LibVLCSharp.Shared; using MediatR; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Serilog; using Azaion.Annotator.Extensions; namespace Azaion.Annotator; public partial class App : Application { private readonly IHost _host; private readonly ILogger _logger; private readonly IMediator _mediator; public App() { Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.File( path: "Logs/log.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); _host = Host.CreateDefaultBuilder() .ConfigureServices((context, services) => { services.AddSingleton(); services.AddSingleton(); services.AddMediatR(c => c.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly())); services.AddSingleton(_ => new LibVLC()); services.AddSingleton(); services.AddSingleton(sp => { var libVLC = sp.GetRequiredService(); return new MediaPlayer(libVLC); }); services.AddSingleton(); services.AddSingleton(sp => sp.GetRequiredService().Get()); services.AddSingleton(); }) .UseSerilog() .Build(); _mediator = _host.Services.GetRequiredService(); _logger = _host.Services.GetRequiredService>(); DispatcherUnhandledException += OnDispatcherUnhandledException; } private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { _logger.LogError(e.Exception, e.Exception.Message); e.Handled = true; } protected override void OnStartup(StartupEventArgs e) { EventManager.RegisterClassHandler(typeof(UIElement), UIElement.KeyDownEvent, new RoutedEventHandler(GlobalClick)); _host.Start(); _host.Services.GetRequiredService().Show(); base.OnStartup(e); } private void GlobalClick(object sender, RoutedEventArgs e) { var args = (KeyEventArgs)e; _ = ThrottleExt.Throttle(() => _mediator.Publish(new KeyEvent(sender, args)), TimeSpan.FromMilliseconds(50)); } }