diff --git a/AideDeJeu/AideDeJeu.Android/AideDeJeu.Android.csproj b/AideDeJeu/AideDeJeu.Android/AideDeJeu.Android.csproj index 4bd64e2f..604ac510 100644 --- a/AideDeJeu/AideDeJeu.Android/AideDeJeu.Android.csproj +++ b/AideDeJeu/AideDeJeu.Android/AideDeJeu.Android.csproj @@ -66,7 +66,7 @@ - + diff --git a/AideDeJeu/AideDeJeu.Android/Version.cs b/AideDeJeu/AideDeJeu.Android/NativeAPI.cs similarity index 74% rename from AideDeJeu/AideDeJeu.Android/Version.cs rename to AideDeJeu/AideDeJeu.Android/NativeAPI.cs index 9c513a23..606132e7 100644 --- a/AideDeJeu/AideDeJeu.Android/Version.cs +++ b/AideDeJeu/AideDeJeu.Android/NativeAPI.cs @@ -1,10 +1,12 @@ using AideDeJeu.Tools; using Android.Content.PM; +using System; +using System.IO; [assembly: Xamarin.Forms.Dependency(typeof(AideDeJeu.Droid.Version_Android))] namespace AideDeJeu.Droid { - public class Version_Android : IAppVersion + public class Version_Android : INativeAPI { public string GetVersion() { @@ -24,5 +26,10 @@ namespace AideDeJeu.Droid return info.VersionCode; } + + public string GetDatabasePath(string databaseName) + { + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), databaseName); + } } } \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu.UWP/AideDeJeu.UWP.csproj b/AideDeJeu/AideDeJeu.UWP/AideDeJeu.UWP.csproj index 356baae9..f2299d1d 100644 --- a/AideDeJeu/AideDeJeu.UWP/AideDeJeu.UWP.csproj +++ b/AideDeJeu/AideDeJeu.UWP/AideDeJeu.UWP.csproj @@ -95,6 +95,7 @@ MainPage.xaml + diff --git a/AideDeJeu/AideDeJeu.UWP/NativeAPI.cs b/AideDeJeu/AideDeJeu.UWP/NativeAPI.cs new file mode 100644 index 00000000..72d24e5c --- /dev/null +++ b/AideDeJeu/AideDeJeu.UWP/NativeAPI.cs @@ -0,0 +1,24 @@ +using AideDeJeu.Tools; +using System.IO; + +[assembly: Xamarin.Forms.Dependency(typeof(AideDeJeu.Droid.Version_Android))] +namespace AideDeJeu.Droid +{ + public class Version_Android : INativeAPI + { + public string GetVersion() + { + return ""; + } + + public int GetBuild() + { + return 0; + } + + public string GetDatabasePath(string databaseName) + { + return Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, databaseName); + } + } +} \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/AideDeJeu.csproj b/AideDeJeu/AideDeJeu/AideDeJeu.csproj index c8469c8b..aa24de82 100644 --- a/AideDeJeu/AideDeJeu/AideDeJeu.csproj +++ b/AideDeJeu/AideDeJeu/AideDeJeu.csproj @@ -4,11 +4,18 @@ netstandard2.0 + + pdbonly + true + + + + @@ -34,7 +41,6 @@ - \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Services/ItemDatabaseContext.cs b/AideDeJeu/AideDeJeu/Services/ItemDatabaseContext.cs new file mode 100644 index 00000000..27c85577 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Services/ItemDatabaseContext.cs @@ -0,0 +1,43 @@ +using AideDeJeu.Tools; +using AideDeJeuLib.Monsters; +using AideDeJeuLib.Spells; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Xamarin.Forms; + +namespace AideDeJeu.Services +{ + public class ItemDatabaseContext : DbContext + { + private const string databaseName = "database.db"; + + public DbSet Spells { get; set; } + + public DbSet Monsters { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + String databasePath = ""; + switch (Device.RuntimePlatform) + { + case Device.iOS: + SQLitePCL.Batteries_V2.Init(); + databasePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "..", "Library", databaseName); ; + break; + case Device.Android: + databasePath = DependencyService.Get().GetDatabasePath(databaseName); + break; + case Device.UWP: + databasePath = DependencyService.Get().GetDatabasePath(databaseName); + break; + default: + throw new NotImplementedException("Platform not supported"); + } + // Specify that we will use sqlite and the path of the database here + optionsBuilder.UseSqlite($"Filename={databasePath}"); + } + } +} diff --git a/AideDeJeu/AideDeJeu/Services/ItemDatabaseHelper.cs b/AideDeJeu/AideDeJeu/Services/ItemDatabaseHelper.cs new file mode 100644 index 00000000..2e3f9eb9 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Services/ItemDatabaseHelper.cs @@ -0,0 +1,46 @@ +using AideDeJeuLib.Spells; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AideDeJeu.Services +{ + public class ItemDatabaseHelper where T : ItemDatabaseContext + { + protected T CreateContext() + { + T postDatabaseContext = (T)Activator.CreateInstance(typeof(T)); + postDatabaseContext.Database.EnsureCreated(); + postDatabaseContext.Database.Migrate(); + return postDatabaseContext; + } + + public async Task> GetSpellsAsync() + { + using (var context = CreateContext()) + { + //We use OrderByDescending because Posts are generally displayed from most recent to oldest + return await context.Spells + .AsNoTracking() + .OrderByDescending(spell => spell.Id) + .ToListAsync(); + } + } + + public async Task AddOrUpdateSpellsAsync(IEnumerable spells) + { + using (var context = CreateContext()) + { + // add posts that do not exist in the database + var newSpells = spells.Where( + spell => context.Spells.Any(dbSpell => dbSpell.Id == spell.Id) == false + ); + await context.Spells.AddRangeAsync(newSpells); + await context.SaveChangesAsync(); + } + } + } +} diff --git a/AideDeJeu/AideDeJeu/Tools/Version.cs b/AideDeJeu/AideDeJeu/Tools/NativeAPI.cs similarity index 66% rename from AideDeJeu/AideDeJeu/Tools/Version.cs rename to AideDeJeu/AideDeJeu/Tools/NativeAPI.cs index 33d67abd..14ebd250 100644 --- a/AideDeJeu/AideDeJeu/Tools/Version.cs +++ b/AideDeJeu/AideDeJeu/Tools/NativeAPI.cs @@ -4,9 +4,10 @@ using System.Text; namespace AideDeJeu.Tools { - public interface IAppVersion + public interface INativeAPI { string GetVersion(); int GetBuild(); + string GetDatabasePath(string databaseName); } } diff --git a/AideDeJeu/AideDeJeu/ViewModels/AboutViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/AboutViewModel.cs index 79a442d9..ece38a10 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/AboutViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/AboutViewModel.cs @@ -20,7 +20,7 @@ namespace AideDeJeu.ViewModels public string Version { get { - return DependencyService.Get().GetVersion(); + return DependencyService.Get().GetVersion(); } } } diff --git a/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs index aaf58af6..834e0539 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs @@ -1,4 +1,5 @@ -using AideDeJeu.Tools; +using AideDeJeu.Services; +using AideDeJeu.Tools; using AideDeJeuLib; using AideDeJeuLib.Spells; using System; @@ -170,7 +171,18 @@ namespace AideDeJeu.ViewModels { AllItems.Clear(); var items = await SpellsScrappers.GetSpells(classe: Classes[Classe].Key, niveauMin: Niveaux[NiveauMin].Key, niveauMax: Niveaux[NiveauMax].Key, ecole: Ecoles[Ecole].Key, rituel: Rituels[Rituel].Key, source: Sources[Source].Key); - var aitems = items.ToArray(); + + //try + //{ + ItemDatabaseHelper helper = new ItemDatabaseHelper(); + await helper.AddOrUpdateSpellsAsync(items); + var items2 = await helper.GetSpellsAsync(); + //} + //catch(Exception ex) + //{ + // Debug.WriteLine(ex); + //} + var aitems = items2.ToArray(); Array.Sort(aitems, new ItemComparer()); foreach (var item in aitems) { diff --git a/AideDeJeu/AideDeJeuLib/AideDeJeuLib.csproj b/AideDeJeu/AideDeJeuLib/AideDeJeuLib.csproj index adc0fa2e..f00454fa 100644 --- a/AideDeJeu/AideDeJeuLib/AideDeJeuLib.csproj +++ b/AideDeJeu/AideDeJeuLib/AideDeJeuLib.csproj @@ -8,4 +8,10 @@ + + + ..\..\..\..\..\..\..\..\Program Files (x86)\Microsoft SDKs\UWPNuGetPackages\microsoft.netcore.universalwindowsplatform\6.1.4\ref\uap10.0.15138\System.ComponentModel.Annotations.dll + + + diff --git a/AideDeJeu/AideDeJeuLib/Item.cs b/AideDeJeu/AideDeJeuLib/Item.cs index 916f35a0..40499c71 100644 --- a/AideDeJeu/AideDeJeuLib/Item.cs +++ b/AideDeJeu/AideDeJeuLib/Item.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Text; namespace AideDeJeuLib { public class Item { + [Key] public string Id { get; set; } public string Name { get; set; } public string NameVO { get; set; } diff --git a/AideDeJeu/AideDeJeuLib/Monsters/Monster.cs b/AideDeJeu/AideDeJeuLib/Monsters/Monster.cs index 7bece44a..32ccb0a6 100644 --- a/AideDeJeu/AideDeJeuLib/Monsters/Monster.cs +++ b/AideDeJeu/AideDeJeuLib/Monsters/Monster.cs @@ -1,6 +1,9 @@ using HtmlAgilityPack; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Text.RegularExpressions; @@ -35,8 +38,33 @@ namespace AideDeJeuLib.Monsters public string Description { get; set; } public string Picture { get; set; } + [IgnoreDataMember] + [NotMapped] public List SpecialFeatures { get; set; } + //public List SpecialFeaturesPersist + //{ + // get + // { + // return SpecialFeatures.Select(node => node.OuterHtml).ToList(); + // } + // set + // { + // List nodes = new List(); + // foreach (var str in value) + // { + // HtmlDocument doc = new HtmlDocument(); + // doc.LoadHtml(str); + // nodes.Add(doc.DocumentNode); + // } + // SpecialFeatures = nodes; + // } + //} + + [IgnoreDataMember] + [NotMapped] public List Actions { get; set; } + [IgnoreDataMember] + [NotMapped] public List LegendaryActions { get; set; } diff --git a/AideDeJeu/AideDeJeuLib/Spells/Spell.cs b/AideDeJeu/AideDeJeuLib/Spells/Spell.cs index 4d2a3857..f7a0e0f6 100644 --- a/AideDeJeu/AideDeJeuLib/Spells/Spell.cs +++ b/AideDeJeu/AideDeJeuLib/Spells/Spell.cs @@ -1,6 +1,8 @@ using HtmlAgilityPack; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Runtime.Serialization; using System.Text; using System.Text.RegularExpressions; @@ -26,9 +28,16 @@ namespace AideDeJeuLib.Spells } set { - HtmlDocument doc = new HtmlDocument(); - doc.LoadHtml(value); - DescriptionDiv = doc.DocumentNode; + if (value != null) + { + HtmlDocument doc = new HtmlDocument(); + doc.LoadHtml(value); + DescriptionDiv = doc.DocumentNode; + } + else + { + DescriptionDiv = null; + } } } public string DescriptionText @@ -39,7 +48,9 @@ namespace AideDeJeuLib.Spells } } [IgnoreDataMember] + [NotMapped] public HtmlNode DescriptionDiv { get; set; } + public string Overflow { get; set; } public string NoOverflow { get; set; } public string Source { get; set; }