diff --git a/OpenBullet/MainWindow.xaml.cs b/OpenBullet/MainWindow.xaml.cs index 02f4e19..6b42f5c 100644 --- a/OpenBullet/MainWindow.xaml.cs +++ b/OpenBullet/MainWindow.xaml.cs @@ -36,6 +36,7 @@ namespace OpenBullet private int snowBuffer = 0; public RunnerManager RunnerManagerPage { get; set; } + // TODO: Do not create a different View for each RunnerInstance, but instead just replace the vm! public Runner CurrentRunnerPage { get; set; } public ProxyManager ProxyManagerPage { get; set; } public WordlistManager WordlistManagerPage { get; set; } @@ -196,9 +197,15 @@ namespace OpenBullet OB.HitsDB = new HitsDBViewModel(); // Views - RunnerManagerPage = new RunnerManager(OB.OBSettings.General.AutoCreateRunner); - if (OB.OBSettings.General.AutoCreateRunner) + RunnerManagerPage = new RunnerManager(); + + // If we create first runner and there was no session to restore + if (OB.OBSettings.General.AutoCreateRunner & !OB.RunnerManager.RestoreSession()) + { + var firstRunner = OB.RunnerManager.Create(); CurrentRunnerPage = OB.RunnerManager.RunnersCollection.FirstOrDefault().View; + } + OB.Logger.LogInfo(Components.Main, "Initialized RunnerManager"); ProxyManagerPage = new ProxyManager(); OB.Logger.LogInfo(Components.Main, "Initialized ProxyManager"); @@ -410,6 +417,10 @@ namespace OpenBullet "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No) return false; } + + OB.Logger.LogInfo(Components.Main, "Saving RunnerManager session to the database"); + OB.RunnerManager.SaveSession(); + OB.Logger.LogInfo(Components.Main, "Quit sequence initiated"); return true; } diff --git a/OpenBullet/ViewModels/RunnerManagerViewModel.cs b/OpenBullet/ViewModels/RunnerManagerViewModel.cs index 5be0ea9..0ed0607 100644 --- a/OpenBullet/ViewModels/RunnerManagerViewModel.cs +++ b/OpenBullet/ViewModels/RunnerManagerViewModel.cs @@ -1,5 +1,7 @@ -using OpenBullet.Views.Main.Runner; +using OpenBullet.Repositories; +using OpenBullet.Views.Main.Runner; using RuriLib.Interfaces; +using RuriLib.Models; using RuriLib.Runner; using RuriLib.ViewModels; using System; @@ -11,12 +13,19 @@ namespace OpenBullet.ViewModels { public class RunnerManagerViewModel : ViewModelBase, IRunnerManager { + private LiteDBRepository _repo; + public ObservableCollection RunnersCollection { get; set; } = new ObservableCollection(); public IEnumerable Runners => RunnersCollection.Select(i => i.ViewModel); private Random rand = new Random(); + public RunnerManagerViewModel() + { + _repo = new LiteDBRepository(OB.dataBaseFile, "runners"); + } + public RunnerInstance Get(int id) { return RunnersCollection.Where(r => r.Id == id).First(); @@ -43,10 +52,60 @@ namespace OpenBullet.ViewModels { RunnersCollection.Clear(); } + + public void SaveSession() + { + _repo.RemoveAll(); + _repo.Add(RunnersCollection + .Select(r => r.ViewModel) + .Select(r => new RunnerSessionData() + { + Bots = r.BotsAmount, + Config = r.ConfigName, + Wordlist = r.WordlistName, + ProxyMode = r.ProxyMode + } + )); + } + + // Returns true if a session was found + public bool RestoreSession() + { + var runners = _repo.Get().ToArray(); + + if (runners.Length == 0) return false; + + foreach (var r in runners) + { + try + { + var instance = Create(); + instance.BotsAmount = r.Bots; + instance.ProxyMode = r.ProxyMode; + + var configVM = OB.ConfigManager.Configs.FirstOrDefault(c => c.Name == r.Config) + ?? throw new Exception($"The Config {r.Config} was not found in the ConfigManager"); + + instance.SetConfig(configVM.Config, false); + + var wordlist = OB.WordlistManager.Wordlists.FirstOrDefault(w => w.Name == r.Wordlist) + ?? throw new Exception($"The Wordlist {r.Wordlist} was not found in the WordlistManager"); + + instance.SetWordlist(wordlist); + } + catch (Exception ex) + { + OB.Logger.LogError(Components.RunnerManager, ex.Message); + } + } + + return true; + } } public class RunnerInstance { + // TODO: Remove the View from here! It shouldn't be here and nothing should reference this View! public Runner View { get; private set; } public RunnerViewModel ViewModel { get; private set; } diff --git a/OpenBullet/ViewModels/WordlistManagerViewModel.cs b/OpenBullet/ViewModels/WordlistManagerViewModel.cs index 7445b06..93bb48a 100644 --- a/OpenBullet/ViewModels/WordlistManagerViewModel.cs +++ b/OpenBullet/ViewModels/WordlistManagerViewModel.cs @@ -34,6 +34,7 @@ namespace OpenBullet.ViewModels { _repo = new LiteDBRepository(OB.dataBaseFile, "wordlists"); WordlistsCollection = new ObservableCollection(); + RefreshList(); } public Wordlist GetWordlistByName(string name) diff --git a/OpenBullet/Views/Main/RunnerManager.xaml b/OpenBullet/Views/Main/RunnerManager.xaml index f6faba4..728b902 100644 --- a/OpenBullet/Views/Main/RunnerManager.xaml +++ b/OpenBullet/Views/Main/RunnerManager.xaml @@ -14,11 +14,6 @@ - - Welcome to Open Bullet! - Create a Runner to get started. - -