diff --git a/source/Trek-12/DataContractPersistence/DataContractPersistence.csproj b/source/Trek-12/DataContractPersistence/DataContractPersistence.csproj new file mode 100644 index 0000000..fbf8a46 --- /dev/null +++ b/source/Trek-12/DataContractPersistence/DataContractPersistence.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/source/Trek-12/DataContractPersistence/DataContractXml.cs b/source/Trek-12/DataContractPersistence/DataContractXml.cs new file mode 100644 index 0000000..81598c3 --- /dev/null +++ b/source/Trek-12/DataContractPersistence/DataContractXml.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; +using System.Runtime.Serialization; +using System.Xml; +using System.Xml.Serialization; +using Models.Game; +using Models.Interfaces; + +namespace DataContractPersistence +{ + public class DataContractXml : IPersistence + { + public string FileName { get; set; } = "data.xml"; + public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory); + + public (List, List, List, List) LoadData() + { + var serializer = new DataContractSerializer(typeof(DataToPersist)); + DataToPersist? data = new DataToPersist(); + + using (Stream s = File.OpenRead(Path.Combine(FilePath, FileName))) + { + data = serializer.ReadObject(s) as DataToPersist; + } + Console.WriteLine("Data loaded: " + Path.Combine(FilePath, FileName)); + return (data.Players, data.Games, data.Maps, data.BestScores); + } + + public void SaveData(List players, List games, List maps, List bestScores) + { + if(!Directory.Exists(FilePath)) + { + Debug.WriteLine("Directory created"); + Debug.WriteLine(Directory.GetDirectoryRoot(FilePath)); + Debug.WriteLine(FilePath); + Directory.CreateDirectory(FilePath); + } + + var serializer = new DataContractSerializer(typeof(DataToPersist)); + DataToPersist? data = new DataToPersist(); + + data.Players = players; + data.Games = games; + data.Maps = maps; + data.BestScores = bestScores; + + var settings = new XmlWriterSettings() { Indent = true }; + using (TextWriter tw = File.CreateText(Path.Combine(FilePath, FileName))) + { + using (XmlWriter writer = XmlWriter.Create(tw, settings)) + { + serializer.WriteObject(writer, data); + Console.WriteLine("Data saved: " + Path.Combine(FilePath, FileName)); + } + } + } + } +} \ No newline at end of file diff --git a/source/Trek-12/DataContractPersistence/DataToPersist.cs b/source/Trek-12/DataContractPersistence/DataToPersist.cs new file mode 100644 index 0000000..9a8dad5 --- /dev/null +++ b/source/Trek-12/DataContractPersistence/DataToPersist.cs @@ -0,0 +1,13 @@ +using System.Collections.ObjectModel; +using Models.Game; + +namespace DataContractPersistence +{ + public class DataToPersist + { + public List Players { get; set; } + public List Games { get; set; } + public List Maps { get; set; } + public List BestScores { get; set; } + } +} \ No newline at end of file diff --git a/source/Trek-12/Models/Game/Game.cs b/source/Trek-12/Models/Game/Game.cs index bb07919..11902b0 100644 --- a/source/Trek-12/Models/Game/Game.cs +++ b/source/Trek-12/Models/Game/Game.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; using Models.Events; using Models.Exceptions; +using Models.Interfaces; using Models.Rules; namespace Models.Game @@ -16,6 +17,15 @@ namespace Models.Game /// public class Game { + /* Persistence */ + public IPersistence PersistenceManager { get; set; } + + /* List for the game and persistence */ + public List Players { get; set; } + public List Games { get; set; } + public List Maps { get; set; } + public List BestScores { get; set; } + private bool _isRunning; public Player CurrentPlayer { get; private set; } @@ -36,6 +46,61 @@ namespace Models.Game public event EventHandler DiceRolled; public event EventHandler OperationChosen; public event EventHandler CellChosen; + + public void AddPlayer(Player player) + { + Players.Add(player); + } + + public void AddGame(Game game) + { + Games.Add(game); + } + + public void AddMap(Map map) + { + Maps.Add(map); + } + + public void AddBestScore(BestScore bestScore) + { + BestScores.Add(bestScore); + } + + public void LoadData() + { + var data = PersistenceManager.LoadData(); + foreach (var player in data.Item1) + { + Players.Add(player); + } + foreach (var game in data.Item2) + { + Games.Add(game); + } + foreach (var map in data.Item3) + { + Maps.Add(map); + } + foreach (var bestScore in data.Item4) + { + BestScores.Add(bestScore); + } + } + + public void SaveData() => PersistenceManager.SaveData(Players, Games, Maps, BestScores); + + public Game(IPersistence persistenceManager) + { + PersistenceManager = persistenceManager; + + Players = new List(); + Games = new List(); + Maps = new List(); + BestScores = new List(); + + _isRunning = false; + } /// diff --git a/source/Trek-12/Models/Interfaces/IPersistence.cs b/source/Trek-12/Models/Interfaces/IPersistence.cs new file mode 100644 index 0000000..aada33b --- /dev/null +++ b/source/Trek-12/Models/Interfaces/IPersistence.cs @@ -0,0 +1,11 @@ +using Models.Game; + +namespace Models.Interfaces +{ + public interface IPersistence + { + (List, List, List, List) LoadData(); + + void SaveData(List players, List games, List maps, List bestScores); + } +} \ No newline at end of file diff --git a/source/Trek-12/Models/Models.csproj b/source/Trek-12/Models/Models.csproj index 0119668..bac9559 100644 --- a/source/Trek-12/Models/Models.csproj +++ b/source/Trek-12/Models/Models.csproj @@ -8,7 +8,6 @@ - diff --git a/source/Trek-12/Trek-12.sln b/source/Trek-12/Trek-12.sln index 23e752e..fda4705 100644 --- a/source/Trek-12/Trek-12.sln +++ b/source/Trek-12/Trek-12.sln @@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp", "ConsoleApp\Co EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{383C4215-C680-4C2E-BC7E-B62F0B164370}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataContractPersistence", "DataContractPersistence\DataContractPersistence.csproj", "{FC6A23C3-A1E3-4BF4-85B0-404D8574E190}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -35,6 +37,10 @@ Global {383C4215-C680-4C2E-BC7E-B62F0B164370}.Debug|Any CPU.Build.0 = Debug|Any CPU {383C4215-C680-4C2E-BC7E-B62F0B164370}.Release|Any CPU.ActiveCfg = Release|Any CPU {383C4215-C680-4C2E-BC7E-B62F0B164370}.Release|Any CPU.Build.0 = Release|Any CPU + {FC6A23C3-A1E3-4BF4-85B0-404D8574E190}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC6A23C3-A1E3-4BF4-85B0-404D8574E190}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC6A23C3-A1E3-4BF4-85B0-404D8574E190}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC6A23C3-A1E3-4BF4-85B0-404D8574E190}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE