using System; using System.Windows; using AutoBidder.Utilities; namespace AutoBidder { /// /// Interaction logic for App.xaml /// public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); // Le descrizioni delle impostazioni vivono nei suggerimenti invece che stampate // sotto ogni campo. Quello predefinito di Windows sparisce dopo cinque secondi: // per un paragrafo di tre righe significa doverlo rincorrere. System.Windows.Controls.ToolTipService.ShowDurationProperty.OverrideMetadata( typeof(DependencyObject), new FrameworkPropertyMetadata(60000)); // I percorsi vanno decisi per primi: da qui in poi ogni archivio li usa. // Le impostazioni stanno nella radice fissa, quindi si possono leggere anche // prima di sapere dove finiranno gli altri dati. var settings = SettingsManager.Load(); AppPaths.Configure(settings.DataFolder, settings.StatsFolder, settings.LogFolder); AppPaths.EnsureFolders(); // Le versioni precedenti scrivevano parte dei dati in Roaming e parte in Local, // senza sottocartelle: senza questo passaggio storico e aste sparirebbero. AppPaths.MigrateLegacyFiles(); // I registri su file partono subito: quello che succede durante l'avvio è // proprio ciò che non si riesce a leggere a video. TextLogService.SessionStarted(AppInfo.Version); TextLogService.PurgeOldLogs(); TextLogService.App("INFO", $"[PERCORSI] configurazione in {AppPaths.ConfigRoot}, dati in {AppPaths.DataFolder}"); // Le righe di registro delle aste confluiscono nei rispettivi dossier. AuctionDossier.CaptureAuctionLogs(); // Lo storico e' cresciuto per mesi con versioni diverse dell'applicazione: // alcuni record hanno campi che allora non esistevano. Quelli deducibili si // ricalcolano qui, una volta, prima che qualcuno li legga. Quelli NON // deducibili non si toccano: se ne occupa la pulizia, che chiede all'utente. try { var repair = CompletedAuctionsStore.RepairOnStartup(); if (repair.AnythingDone) { TextLogService.App("INFO", $"[STORICO] Riparati {repair.Total} campi mancanti " + $"(chiavi prodotto {repair.ProductKeys}, esiti {repair.Outcomes}, " + $"nomi {repair.Names})"); } } catch (Exception ex) { TextLogService.App("WARN", $"[STORICO] Riparazione non riuscita: {ex.Message}"); } // L'apprendimento è sempre acceso: carica ciò che sa, ricostruisce il profilo // dallo storico se manca, e in sottofondo legge i dossier non ancora appresi. Ml.LearningService.OnLog += m => TextLogService.App("INFO", m); Ml.LearningService.Start(settings); // Applica il tema salvato (chiaro/scuro) prima di mostrare la finestra ThemeManager.ApplyFromSettings(); } protected override void OnExit(ExitEventArgs e) { // Quello che è ancora in coda va sul disco adesso: un registro che perde // proprio le ultime righe è inutile esattamente quando serve di più. TextLogService.SessionEnded(); FileLogWriter.DisposeAll(); // L'icona di notifica sopravvive al processo se non la si rimuove: // resterebbe nell'area di notifica come icona fantasma. WindowsNotifier.Dispose(); base.OnExit(e); } } }