diff --git a/Sources/CoreLibrary/Manager/IPersistanceManager.cs b/Sources/CoreLibrary/Manager/IPersistanceManager.cs deleted file mode 100644 index 306c296..0000000 --- a/Sources/CoreLibrary/Manager/IPersistanceManager.cs +++ /dev/null @@ -1,17 +0,0 @@ -using CoreLibrary.Joueurs; - -namespace CoreLibrary.Manager -{ - public interface IPersistanceManager - { - public bool EstEnregistre { get; } - - public IEnumerable ChargerJoueurs(); - - public IEnumerable ChargerParties(); - - public void EnregistrerJoueurs(IEnumerable donnees); - - public void EnregistrerParties(IEnumerable donnees); - } -} diff --git a/Sources/CoreLibrary/Manager/Manager.cs b/Sources/CoreLibrary/Manager/Manager.cs deleted file mode 100644 index 619d180..0000000 --- a/Sources/CoreLibrary/Manager/Manager.cs +++ /dev/null @@ -1,41 +0,0 @@ -using CoreLibrary.Joueurs; -using System.Runtime.InteropServices; - -namespace CoreLibrary.Manager -{ - public class Manager : IDisposable - { - private bool estDetruit; - - private readonly IPersistanceManager persistance; - - private readonly IEnumerable joueurs; - public IEnumerable Joueurs => joueurs; - - public Manager(IPersistanceManager persistance) - { - this.persistance = persistance; - joueurs = this.persistance.Charger(); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool detruire) - { - if (estDetruit) return; - - persistance.Enregistrer(joueurs); - - estDetruit = true; - } - - ~Manager() - { - Dispose(false); - } - } -} diff --git a/Sources/CoreLibrary/Manager/Stub.cs b/Sources/CoreLibrary/Manager/Stub.cs deleted file mode 100644 index dfebedb..0000000 --- a/Sources/CoreLibrary/Manager/Stub.cs +++ /dev/null @@ -1,26 +0,0 @@ -using CoreLibrary.Joueurs; -using System.Diagnostics.CodeAnalysis; - -namespace CoreLibrary.Manager -{ - public class Stub : IPersistanceManager - { - public bool EstEnregistre { get; private set; } = false; - - public IEnumerable Charger() - { - return [ - new Joueur("Pauline", 50, 5, 2, 0), - new Joueur("Céleste", 40, 6, 2, 0), - new Joueur("Camille", 55, 8, 0, 1), - new Joueur("Toto", 70, 0, 0, 10), - ]; - } - - [SuppressMessage("SonarAnalyzer", "S1186", Justification = "This method is intentionally left blank.")] - public void Enregistrer(IEnumerable donnees) - { - EstEnregistre = true; - } - } -} diff --git a/Sources/CoreLibrary/Partie.cs b/Sources/CoreLibrary/Partie.cs index a692fe3..53646ba 100644 --- a/Sources/CoreLibrary/Partie.cs +++ b/Sources/CoreLibrary/Partie.cs @@ -1,6 +1,7 @@ using CoreLibrary.Core; using CoreLibrary.Events; using CoreLibrary.Joueurs; +using CoreLibrary.Persistance; using CoreLibrary.Regles; using System.Runtime.Serialization; @@ -14,6 +15,8 @@ namespace CoreLibrary { [DataMember] public IRegles Regles { get; private set; } + [DataMember] + public IPersistance Persistance { get; } [DataMember] private readonly List joueurs = new List(); @@ -23,7 +26,7 @@ namespace CoreLibrary private int? courant; /// - /// Événement déclenché lorsqu'il est nécessaire d'ajouter un joueur. + /// Événement déclenché lorsqu'il est nécessaire de d'ajouter un joueur. /// public event EventHandler? DemanderNom; @@ -107,9 +110,13 @@ namespace CoreLibrary /// Crée une nouvelle instance de la classe Partie. /// /// Les règles de la partie. - public Partie(IRegles regles) + /// Persistance de la partie. + public Partie(IRegles regles, IPersistance persistance) { Regles = regles; + Persistance = persistance; + + ChargerPartie(); } /// @@ -174,8 +181,9 @@ namespace CoreLibrary if (++courant == joueurs.Count) courant = 0; QuandPasserMain(); + SauvegarderPartie(); - if(courant == 0 && (plateauCourant.Tour > Regles.TourMaximum || plateaux.Where(plateau => plateau.Victoire).Any())) + if (courant == 0 && (plateauCourant.Tour > Regles.TourMaximum || plateaux.Where(plateau => plateau.Victoire).Any())) { Terminee(); } @@ -195,7 +203,7 @@ namespace CoreLibrary List gagnants = new List(); List perdants = new List(); - for(int i = 0; i < joueurs.Count; i++) + for (int i = 0; i < joueurs.Count; i++) { if (plateaux[i].Victoire) gagnants.Add(joueurs[i]); @@ -205,5 +213,28 @@ namespace CoreLibrary QuandPartieTerminee(gagnants, perdants); } + + /// + /// Sauvegarder la partie + /// + private void SauvegarderPartie() + { + Persistance.EnregistrerParties(new List { this }); + } + + /// + /// Charger la partie + /// + private void ChargerPartie() + { + var parties = Persistance.ChargerParties(); + if (parties.Any()) + { + var partie = parties.First(); + joueurs.AddRange(partie.joueurs); + plateaux.AddRange(partie.plateaux); + courant = partie.courant; + } + } } } diff --git a/Sources/CoreLibrary/Persistance/IPersistance.cs b/Sources/CoreLibrary/Persistance/IPersistance.cs index 7263842..1d57c77 100644 --- a/Sources/CoreLibrary/Persistance/IPersistance.cs +++ b/Sources/CoreLibrary/Persistance/IPersistance.cs @@ -4,6 +4,7 @@ namespace CoreLibrary.Persistance { public interface IPersistance { + public bool EstEnregistre { get; } public List ChargerJoueurs(); diff --git a/Sources/CoreLibrary/Persistance/Manager.cs b/Sources/CoreLibrary/Persistance/Manager.cs new file mode 100644 index 0000000..93771fc --- /dev/null +++ b/Sources/CoreLibrary/Persistance/Manager.cs @@ -0,0 +1,50 @@ +using CoreLibrary.Joueurs; +using CoreLibrary.Persistance; +using System.Runtime.InteropServices; + +namespace CoreLibrary.Manager +{ + public class Manager : IDisposable + { + private bool estDetruit; + + private readonly IPersistance persistance; + + private readonly List joueurs; + public IReadOnlyCollection Joueurs => joueurs.AsReadOnly(); + + private readonly List parties; + public IReadOnlyCollection Parties => parties.AsReadOnly(); + + public Manager(IPersistance persistance) + { + this.persistance = persistance ?? throw new ArgumentNullException(nameof(persistance)); + joueurs = this.persistance.ChargerJoueurs() ?? new List(); + parties = this.persistance.ChargerParties() ?? new List(); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool detruire) + { + if (estDetruit) return; + + if (detruire) + { + persistance.EnregistrerJoueurs(joueurs); + persistance.EnregistrerParties(parties); + } + + estDetruit = true; + } + + ~Manager() + { + Dispose(false); + } + } +} diff --git a/Sources/CoreLibrary/Persistance/Persistance.cs b/Sources/CoreLibrary/Persistance/Persistance.cs index 8db6b89..5117ac0 100644 --- a/Sources/CoreLibrary/Persistance/Persistance.cs +++ b/Sources/CoreLibrary/Persistance/Persistance.cs @@ -7,16 +7,22 @@ namespace CoreLibrary.Persistance { public class Persistance : IPersistance { - public List joueurs = new List(); - public List parties = new List(); - - public string ancienRepertoire = Directory.GetCurrentDirectory(); + private readonly string joueursFilePath = "joueurs.json"; + private readonly string partiesFilePath = "parties.json"; + private readonly string ancienRepertoire = Directory.GetCurrentDirectory(); + public bool EstEnregistre { get; private set; } public List ChargerJoueurs() { + if (!File.Exists(joueursFilePath)) + { + return new List(); + } + DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(List)); + List joueurs; - using (FileStream s = File.OpenRead("joueurs.json")) + using (FileStream s = File.OpenRead(joueursFilePath)) { joueurs = jsonSerializer.ReadObject(s) as List; } @@ -26,9 +32,15 @@ namespace CoreLibrary.Persistance public List ChargerParties() { + if (!File.Exists(partiesFilePath)) + { + return new List(); + } + DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(List)); + List parties; - using (FileStream s = File.OpenRead("parties.json")) + using (FileStream s = File.OpenRead(partiesFilePath)) { parties = jsonSerializer.ReadObject(s) as List; } @@ -40,7 +52,7 @@ namespace CoreLibrary.Persistance { DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(List)); - using (FileStream s = File.Create("joueurs.json")) + using (FileStream s = File.Create(Path.Combine(joueursFilePath, "../.."))) { using (var writer = JsonReaderWriterFactory.CreateJsonWriter( s, @@ -51,6 +63,8 @@ namespace CoreLibrary.Persistance jsonSerializer.WriteObject(writer, joueurs); } } + + EstEnregistre = true; Directory.SetCurrentDirectory(ancienRepertoire); } @@ -58,7 +72,7 @@ namespace CoreLibrary.Persistance { DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(List)); - using (FileStream s = File.Create("parties.json")) + using (FileStream s = File.Create(Path.Combine(partiesFilePath, "../.."))) { using (var writer = JsonReaderWriterFactory.CreateJsonWriter( s, @@ -69,7 +83,9 @@ namespace CoreLibrary.Persistance jsonSerializer.WriteObject(writer, parties); } } + + EstEnregistre = true; Directory.SetCurrentDirectory(ancienRepertoire); } } -} +} \ No newline at end of file diff --git a/Sources/MauiSpark/MauiProgram.cs b/Sources/MauiSpark/MauiProgram.cs index 82d1290..595afed 100644 --- a/Sources/MauiSpark/MauiProgram.cs +++ b/Sources/MauiSpark/MauiProgram.cs @@ -1,11 +1,12 @@ using CoreLibrary.Manager; +using CoreLibrary.Persistance; using Microsoft.Extensions.Logging; namespace MauiSpark { public static class MauiProgram { - public static Manager Manager { get; private set; } = new Manager(new Stub()); + public static Manager Manager { get; private set; } = new Manager(new Persistance()); public static MauiApp CreateMauiApp() { diff --git a/Sources/MauiSpark/Pages/Mode.xaml.cs b/Sources/MauiSpark/Pages/Mode.xaml.cs index bc58cf3..5138d19 100644 --- a/Sources/MauiSpark/Pages/Mode.xaml.cs +++ b/Sources/MauiSpark/Pages/Mode.xaml.cs @@ -1,5 +1,6 @@ using CoreLibrary; using CoreLibrary.Events; +using CoreLibrary.Persistance; using CoreLibrary.Regles; namespace MauiSpark.Pages; @@ -16,7 +17,7 @@ public partial class Mode : ContentPage private void QuandReglesClassiques(Object? sender, EventArgs e) { - Partie partie = new Partie(new ReglesClassiques()); + Partie partie = new Partie(new ReglesClassiques(), new Persistance()); partie.DemanderNom += QuandDemanderNom; partie.Jouer(); }