From a75eaa90ef4176861d19ca4dcde7e7e3973a977a Mon Sep 17 00:00:00 2001 From: Yan Maniez Date: Sun, 29 Apr 2018 13:45:14 +0200 Subject: [PATCH] =?UTF-8?q?D=C3=A9but=20ajout=20des=20listes=20de=20monstr?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AideDeJeu/AideDeJeu/AideDeJeu.csproj | 12 +- AideDeJeu/AideDeJeu/App.xaml.cs | 2 +- AideDeJeu/AideDeJeu/Services/MockDataStore.cs | 2 +- .../AideDeJeu/Services/MonsterDataStore.cs | 79 +++++++ .../AideDeJeu/Services/SpellDataStore.cs | 4 +- .../ViewModels/MonsterDetailViewModel.cs | 147 ++++++++++++ .../AideDeJeu/ViewModels/MonstersViewModel.cs | 214 ++++++++++++++++++ .../ViewModels/SpellDetailViewModel.cs | 2 +- AideDeJeu/AideDeJeu/Views/MainPage.xaml | 108 --------- AideDeJeu/AideDeJeu/Views/MainPage.xaml.cs | 41 +--- .../AideDeJeu/Views/MonsterDetailPage.xaml | 50 ++++ .../AideDeJeu/Views/MonsterDetailPage.xaml.cs | 40 ++++ AideDeJeu/AideDeJeu/Views/MonstersPage.xaml | 129 +++++++++++ .../AideDeJeu/Views/MonstersPage.xaml.cs | 52 +++++ AideDeJeu/AideDeJeu/Views/SpellsPage.xaml | 129 +++++++++++ AideDeJeu/AideDeJeu/Views/SpellsPage.xaml.cs | 51 +++++ AideDeJeu/AideDeJeuLib/AideDeJeuLib.csproj | 4 - AideDeJeu/AideDeJeuLib/Monsters/Monster.cs | 68 ++++++ .../Monsters/MonstersScrappers.cs | 75 ++++++ .../{Scrappers.cs => SpellsScrappers.cs} | 2 +- 20 files changed, 1053 insertions(+), 158 deletions(-) create mode 100644 AideDeJeu/AideDeJeu/Services/MonsterDataStore.cs create mode 100644 AideDeJeu/AideDeJeu/ViewModels/MonsterDetailViewModel.cs create mode 100644 AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs create mode 100644 AideDeJeu/AideDeJeu/Views/MonsterDetailPage.xaml create mode 100644 AideDeJeu/AideDeJeu/Views/MonsterDetailPage.xaml.cs create mode 100644 AideDeJeu/AideDeJeu/Views/MonstersPage.xaml create mode 100644 AideDeJeu/AideDeJeu/Views/MonstersPage.xaml.cs create mode 100644 AideDeJeu/AideDeJeu/Views/SpellsPage.xaml create mode 100644 AideDeJeu/AideDeJeu/Views/SpellsPage.xaml.cs create mode 100644 AideDeJeu/AideDeJeuLib/Monsters/Monster.cs create mode 100644 AideDeJeu/AideDeJeuLib/Monsters/MonstersScrappers.cs rename AideDeJeu/AideDeJeuLib/Spells/{Scrappers.cs => SpellsScrappers.cs} (99%) diff --git a/AideDeJeu/AideDeJeu/AideDeJeu.csproj b/AideDeJeu/AideDeJeu/AideDeJeu.csproj index 768084dd..7f116f65 100644 --- a/AideDeJeu/AideDeJeu/AideDeJeu.csproj +++ b/AideDeJeu/AideDeJeu/AideDeJeu.csproj @@ -20,6 +20,15 @@ Code + + MainPage.xaml + + + MonstersPage.xaml + + + MonsterDetailPage.xaml + SpellDetailPage.xaml @@ -29,8 +38,9 @@ Code - + Code + SpellsPage.xaml Code diff --git a/AideDeJeu/AideDeJeu/App.xaml.cs b/AideDeJeu/AideDeJeu/App.xaml.cs index ca495301..17c929cd 100644 --- a/AideDeJeu/AideDeJeu/App.xaml.cs +++ b/AideDeJeu/AideDeJeu/App.xaml.cs @@ -12,7 +12,7 @@ namespace AideDeJeu { InitializeComponent(); - MainPage = new NavigationPage(new MainPage()); + MainPage = new NavigationPage(new MonstersPage()); // MainPage()); } protected override void OnStart () diff --git a/AideDeJeu/AideDeJeu/Services/MockDataStore.cs b/AideDeJeu/AideDeJeu/Services/MockDataStore.cs index 1a37797c..e055b64e 100644 --- a/AideDeJeu/AideDeJeu/Services/MockDataStore.cs +++ b/AideDeJeu/AideDeJeu/Services/MockDataStore.cs @@ -64,7 +64,7 @@ namespace AideDeJeu.Services public async Task> GetItemsAsync(bool forceRefresh = false) { - var scrapper = new Scrappers(); + var scrapper = new SpellsScrappers(); var spells = await scrapper.GetSpells(await scrapper.GetSpellIds("c")); items = spells.Select(spell => new Item() { Text = spell.Title, Description = spell.DescriptionText }).ToList(); return await Task.FromResult(items); diff --git a/AideDeJeu/AideDeJeu/Services/MonsterDataStore.cs b/AideDeJeu/AideDeJeu/Services/MonsterDataStore.cs new file mode 100644 index 00000000..0f57422c --- /dev/null +++ b/AideDeJeu/AideDeJeu/Services/MonsterDataStore.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using AideDeJeu.Models; +using AideDeJeuLib; +using AideDeJeuLib.Monsters; +using AideDeJeuLib.Spells; + +[assembly: Xamarin.Forms.Dependency(typeof(AideDeJeu.Services.SpellDataStore))] +namespace AideDeJeu.Services +{ + //public class MonsterDataStore : IDataStore + //{ + // List items; + + // public MonsterDataStore() + // { + // items = new List(); + // var mockItems = new List + // { + // }; + + // foreach (var item in mockItems) + // { + // items.Add(item); + // } + // } + + // public async Task AddItemAsync(Spell item) + // { + // items.Add(item); + + // return await Task.FromResult(true); + // } + + // public async Task UpdateItemAsync(Spell item) + // { + // var _item = items.Where((Spell arg) => arg.Id == item.Id).FirstOrDefault(); + // items.Remove(_item); + // items.Add(item); + + // return await Task.FromResult(true); + // } + + // public async Task DeleteItemAsync(Spell item) + // { + // var _item = items.Where((Spell arg) => arg.Id == item.Id).FirstOrDefault(); + // items.Remove(_item); + + // return await Task.FromResult(true); + // } + + // public async Task GetItemAsync(string id) + // { + // return await Task.FromResult(items.FirstOrDefault(s => s.Id == id)); + // } + + // public async Task> GetItemsAsync(bool forceRefresh = false) + // { + // var scrapper = new MonstersScrappers(); + // //items = (await scrapper.GetSpells(await scrapper.GetSpellIds(""))).ToList(); + // items = (await scrapper.GetMonsters()).ToList(); + + // //items = spells.Select(spell => new Item() { Text = spell.Title, Description = spell.DescriptionText }).ToList(); + // return await Task.FromResult(items); + // } + + // public async Task> GetItemsAsync(string classe, int niveauMin, int niveauMax, string ecole, string rituel, string source) + // { + // var scrapper = new MonstersScrappers(); + // items = (await scrapper.GetMonsters(classe: classe, niveauMin: niveauMin, niveauMax: niveauMax, ecole: ecole, rituel: rituel, source: source)).ToList(); + + // return await Task.FromResult(items); + // } + + //} +} \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Services/SpellDataStore.cs b/AideDeJeu/AideDeJeu/Services/SpellDataStore.cs index 2db6a1e3..55e91586 100644 --- a/AideDeJeu/AideDeJeu/Services/SpellDataStore.cs +++ b/AideDeJeu/AideDeJeu/Services/SpellDataStore.cs @@ -58,7 +58,7 @@ namespace AideDeJeu.Services public async Task> GetItemsAsync(bool forceRefresh = false) { - var scrapper = new Scrappers(); + var scrapper = new SpellsScrappers(); //items = (await scrapper.GetSpells(await scrapper.GetSpellIds(""))).ToList(); items = (await scrapper.GetSpells()).ToList(); @@ -68,7 +68,7 @@ namespace AideDeJeu.Services public async Task> GetItemsAsync(string classe, int niveauMin, int niveauMax, string ecole, string rituel, string source) { - var scrapper = new Scrappers(); + var scrapper = new SpellsScrappers(); items = (await scrapper.GetSpells(classe: classe, niveauMin: niveauMin, niveauMax: niveauMax, ecole: ecole, rituel: rituel, source: source)).ToList(); return await Task.FromResult(items); diff --git a/AideDeJeu/AideDeJeu/ViewModels/MonsterDetailViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MonsterDetailViewModel.cs new file mode 100644 index 00000000..6ab3aa80 --- /dev/null +++ b/AideDeJeu/AideDeJeu/ViewModels/MonsterDetailViewModel.cs @@ -0,0 +1,147 @@ +using AideDeJeu.Tools; +using AideDeJeuLib.Spells; +using System; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Xamarin.Forms; +using System.Reactive.Linq; +using AideDeJeuLib.Monsters; + +namespace AideDeJeu.ViewModels +{ + public class MonsterDetailViewModel : BaseViewModel + { + Monster _Item = null; + public Monster Item + { + get { return _Item; } + set + { + SetProperty(ref _Item, value); + //OnPropertyChanged(nameof(Description)); + //OnPropertyChanged(nameof(TypeLevel)); + //OnPropertyChanged(nameof(CastingTime)); + //OnPropertyChanged(nameof(Range)); + //OnPropertyChanged(nameof(Components)); + //OnPropertyChanged(nameof(Duration)); + } + } + + //public FormattedString Description + //{ + // get + // { + // var fs = new FormattedString(); + // if (Item?.DescriptionDiv != null) + // { + // FormatedTextHelpers.HtmlToFormatedString(Item?.DescriptionDiv, fs, FontAttributes.None); + // } + // return fs; + // } + //} + + //public FormattedString TypeLevel + //{ + // get + // { + // var fd = FormatedTextHelpers.FontData.FromResource("contentital"); + // var fs = new FormattedString(); + // var capType = Item.Type.First().ToString().ToUpper() + Item.Type.Substring(1); + // fs.Spans.Add(new Span() { Text = string.Format("{0} de niveau {1}", capType, Item.Level), FontFamily = fd.FontFamily, FontAttributes = fd.FontAttributes, FontSize = fd.FontSize, ForegroundColor = fd.TextColor}); + // return fs; + // } + //} + + //public FormattedString CastingTime + //{ + // get + // { + // var fd = FormatedTextHelpers.FontData.FromResource("content"); + // var fdb = FormatedTextHelpers.FontData.FromResource("contentbold"); + // var fs = new FormattedString(); + // fs.Spans.Add(new Span() { Text = "Durée d'incantation : ", FontFamily = fdb.FontFamily, FontAttributes = fdb.FontAttributes, FontSize = fdb.FontSize, ForegroundColor = fdb.TextColor }); + // fs.Spans.Add(new Span() { Text = Item.CastingTime, FontFamily = fd.FontFamily, FontAttributes = fd.FontAttributes, FontSize = fd.FontSize, ForegroundColor = fd.TextColor }); + // return fs; + // } + //} + + //public FormattedString Range + //{ + // get + // { + // var fd = FormatedTextHelpers.FontData.FromResource("content"); + // var fdb = FormatedTextHelpers.FontData.FromResource("contentbold"); + // var fs = new FormattedString(); + // fs.Spans.Add(new Span() { Text = "Portée : ", FontFamily = fdb.FontFamily, FontAttributes = fdb.FontAttributes, FontSize = fdb.FontSize, ForegroundColor = fdb.TextColor }); + // fs.Spans.Add(new Span() { Text = Item.Range, FontFamily = fd.FontFamily, FontAttributes = fd.FontAttributes, FontSize = fd.FontSize, ForegroundColor = fd.TextColor }); + // return fs; + // } + //} + + //public FormattedString Components + //{ + // get + // { + // var fd = FormatedTextHelpers.FontData.FromResource("content"); + // var fdb = FormatedTextHelpers.FontData.FromResource("contentbold"); + // var fs = new FormattedString(); + // fs.Spans.Add(new Span() { Text = "Composantes : ", FontFamily = fdb.FontFamily, FontAttributes = fdb.FontAttributes, FontSize = fdb.FontSize, ForegroundColor = fdb.TextColor }); + // fs.Spans.Add(new Span() { Text = Item.Components, FontFamily = fd.FontFamily, FontAttributes = fd.FontAttributes, FontSize = fd.FontSize, ForegroundColor = fd.TextColor }); + // return fs; + // } + //} + + //public FormattedString Duration + //{ + // get + // { + // var fd = FormatedTextHelpers.FontData.FromResource("content"); + // var fdb = FormatedTextHelpers.FontData.FromResource("contentbold"); + // var fs = new FormattedString(); + // fs.Spans.Add(new Span() { Text = "Durée : ", FontFamily = fdb.FontFamily, FontAttributes = fdb.FontAttributes, FontSize = fdb.FontSize, ForegroundColor = fdb.TextColor }); + // fs.Spans.Add(new Span() { Text = Item.Duration, FontFamily = fd.FontFamily, FontAttributes = fd.FontAttributes, FontSize = fd.FontSize, ForegroundColor = fd.TextColor }); + // return fs; + // } + //} + + public Command LoadItemCommand { get; set; } + + public MonsterDetailViewModel(Monster item = null) + { + Title = item?.Name; + Item = item; + LoadItemCommand = new Command(async () => await ExecuteLoadItemCommand()); + } + async Task ExecuteLoadItemCommand() + { + if (IsBusy) + return; + + IsBusy = true; + + try + { + //Items.Clear(); + var item = await new MonstersScrappers().GetMonster(Item.Id); + Item = item; + //foreach (var item in items) + //{ + // Items.Add(item); + //} + } + catch (Exception ex) + { + Debug.WriteLine(ex); + } + finally + { + IsBusy = false; + } + } + } + + + + +} diff --git a/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs new file mode 100644 index 00000000..f4ce40b0 --- /dev/null +++ b/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs @@ -0,0 +1,214 @@ +using System; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Threading.Tasks; + +using Xamarin.Forms; + +using AideDeJeu.Models; +using AideDeJeu.Views; +using AideDeJeuLib; +using AideDeJeuLib.Spells; +using System.Collections.Generic; +using AideDeJeuLib.Monsters; + +namespace AideDeJeu.ViewModels +{ + public class MonstersViewModel : BaseViewModel + { + public ObservableCollection Items { get; set; } + + public List> Classes { get; set; } = new List>() + { + new KeyValuePair("", "Toutes" ), + new KeyValuePair("b", "Barde" ), + new KeyValuePair("c", "Clerc" ), + new KeyValuePair("d", "Druide" ), + new KeyValuePair("s", "Ensorceleur" ), + new KeyValuePair("w", "Magicien" ), + new KeyValuePair("p", "Paladin" ), + new KeyValuePair("r", "Rôdeur" ), + new KeyValuePair("k", "Sorcier" ), + }; + + public List> Niveaux { get; set; } = new List>() + { + new KeyValuePair(0, "Sorts mineurs"), + new KeyValuePair(1, "Niveau 1"), + new KeyValuePair(2, "Niveau 2"), + new KeyValuePair(3, "Niveau 3"), + new KeyValuePair(4, "Niveau 4"), + new KeyValuePair(5, "Niveau 5"), + new KeyValuePair(6, "Niveau 6"), + new KeyValuePair(7, "Niveau 7"), + new KeyValuePair(8, "Niveau 8"), + new KeyValuePair(9, "Niveau 9"), + }; + + public List> Ecoles { get; set; } = new List>() + { + new KeyValuePair("", "Toutes"), + new KeyValuePair("abjuration", "Abjuration"), + new KeyValuePair("divination", "Divination"), + new KeyValuePair("enchantement", "Enchantement"), + new KeyValuePair("evocation", "Évocation"), + new KeyValuePair("illusion", "Illusion"), + new KeyValuePair("invocation", "Invocation"), + new KeyValuePair("necromancie", "Nécromancie"), + new KeyValuePair("transmutation", "Transmutation"), + }; + + public List> Rituels { get; set; } = new List>() + { + new KeyValuePair("", "Tous"), + new KeyValuePair("1", "Rituel"), + }; + + public List> Sources { get; set; } = new List>() + { + new KeyValuePair("", "Toutes"), + new KeyValuePair("srd", "SRD"), + new KeyValuePair("ph", "PHB"), + new KeyValuePair("sup", "SCAG, XGtE"), + }; + + private int _Classe = 0; + public int Classe + { + get + { + return _Classe; + } + set + { + SetProperty(ref _Classe, value); + LoadItemsCommand.Execute(null); + } + } + private int _NiveauMin = 0; + public int NiveauMin + { + get + { + return _NiveauMin; + } + set + { + SetProperty(ref _NiveauMin, value); + if (_NiveauMax < _NiveauMin) + { + SetProperty(ref _NiveauMax, value, nameof(NiveauMax)); + } + LoadItemsCommand.Execute(null); + } + } + private int _NiveauMax = 9; + public int NiveauMax + { + get + { + return _NiveauMax; + } + set + { + SetProperty(ref _NiveauMax, value); + if (_NiveauMax < _NiveauMin) + { + SetProperty(ref _NiveauMin, value, nameof(NiveauMin)); + } + LoadItemsCommand.Execute(null); + } + } + private int _Ecole = 0; + public int Ecole + { + get + { + return _Ecole; + } + set + { + SetProperty(ref _Ecole, value); + LoadItemsCommand.Execute(null); + } + } + private int _Rituel = 0; + public int Rituel + { + get + { + return _Rituel; + } + set + { + SetProperty(ref _Rituel, value); + LoadItemsCommand.Execute(null); + } + } + private int _Source = 0; + public int Source + { + get + { + return _Source; + } + set + { + SetProperty(ref _Source, value); + LoadItemsCommand.Execute(null); + } + } + + + public Command LoadItemsCommand { get; set; } + + public MonstersViewModel() + { + //Title = "Browse"; + Items = new ObservableCollection(); + LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand()); + + //MessagingCenter.Subscribe(this, "AddItem", async (obj, item) => + //{ + // var _item = item as Item; + // Items.Add(_item); + // await DataStore.AddItemAsync(_item); + //}); + } + + async Task ExecuteLoadItemsCommand() + { + if (IsBusy) + return; + + IsBusy = true; + + try + { + // + // + // + // + // + // + // + // + + Items.Clear(); + var items = await new MonstersScrappers().GetMonsters(); + foreach (var item in items) + { + Items.Add(item); + } + } + catch (Exception ex) + { + Debug.WriteLine(ex); + } + finally + { + IsBusy = false; + } + } + } +} \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs index 66f0897b..04aeef72 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs @@ -122,7 +122,7 @@ namespace AideDeJeu.ViewModels try { //Items.Clear(); - var item = await new Scrappers().GetSpell(Item.Id); + var item = await new SpellsScrappers().GetSpell(Item.Id); Item = item; //foreach (var item in items) //{ diff --git a/AideDeJeu/AideDeJeu/Views/MainPage.xaml b/AideDeJeu/AideDeJeu/Views/MainPage.xaml index 4adf4e05..79578b02 100644 --- a/AideDeJeu/AideDeJeu/Views/MainPage.xaml +++ b/AideDeJeu/AideDeJeu/Views/MainPage.xaml @@ -8,122 +8,14 @@ > - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/MainPage.xaml.cs b/AideDeJeu/AideDeJeu/Views/MainPage.xaml.cs index c5095a5a..6a27426b 100644 --- a/AideDeJeu/AideDeJeu/Views/MainPage.xaml.cs +++ b/AideDeJeu/AideDeJeu/Views/MainPage.xaml.cs @@ -1,51 +1,14 @@ -using AideDeJeu.Models; -using AideDeJeu.ViewModels; -using AideDeJeuLib; -using AideDeJeuLib.Spells; -using System; - -using Xamarin.Forms; +using Xamarin.Forms; using Xamarin.Forms.Xaml; namespace AideDeJeu.Views { [XamlCompilation(XamlCompilationOptions.Compile)] - public partial class MainPage : MasterDetailPage //TabbedPage + public partial class MainPage : MasterDetailPage { - SpellsViewModel viewModel; - public MainPage () { InitializeComponent (); - - BindingContext = viewModel = new SpellsViewModel(); - } - - async void OnItemSelected(object sender, SelectedItemChangedEventArgs args) - { - var item = args.SelectedItem as Spell; - if (item == null) - return; - - var spellvm = new SpellDetailViewModel(item); - spellvm.LoadItemCommand.Execute(null); - await Navigation.PushAsync(new SpellDetailPage(spellvm)); - - // Manually deselect item. - ItemsListView.SelectedItem = null; - } - - async void AddItem_Clicked(object sender, EventArgs e) - { - //await Navigation.PushModalAsync(new NavigationPage(new NewItemPage())); - } - - protected override void OnAppearing() - { - base.OnAppearing(); - - if (viewModel.Items.Count == 0) - viewModel.LoadItemsCommand.Execute(null); } } } \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/MonsterDetailPage.xaml b/AideDeJeu/AideDeJeu/Views/MonsterDetailPage.xaml new file mode 100644 index 00000000..6e2dcb80 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Views/MonsterDetailPage.xaml @@ -0,0 +1,50 @@ + + + + + + + \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/MonsterDetailPage.xaml.cs b/AideDeJeu/AideDeJeu/Views/MonsterDetailPage.xaml.cs new file mode 100644 index 00000000..60c569f9 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Views/MonsterDetailPage.xaml.cs @@ -0,0 +1,40 @@ +using System; + +using Xamarin.Forms; +using Xamarin.Forms.Xaml; + +using AideDeJeu.Models; +using AideDeJeu.ViewModels; +using AideDeJeuLib; +using AideDeJeuLib.Spells; +using AideDeJeuLib.Monsters; + +namespace AideDeJeu.Views +{ + [XamlCompilation(XamlCompilationOptions.Compile)] + public partial class MonsterDetailPage : ContentPage + { + MonsterDetailViewModel viewModel; + + public MonsterDetailPage(MonsterDetailViewModel viewModel) + { + InitializeComponent(); + + BindingContext = this.viewModel = viewModel; + } + + public MonsterDetailPage() + { + InitializeComponent(); + + var item = new Monster + { + Name = "", + //Description = "This is an item description." + }; + + viewModel = new MonsterDetailViewModel(item); + BindingContext = viewModel; + } + } +} \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/MonstersPage.xaml b/AideDeJeu/AideDeJeu/Views/MonstersPage.xaml new file mode 100644 index 00000000..58297f91 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Views/MonstersPage.xaml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/MonstersPage.xaml.cs b/AideDeJeu/AideDeJeu/Views/MonstersPage.xaml.cs new file mode 100644 index 00000000..69838c20 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Views/MonstersPage.xaml.cs @@ -0,0 +1,52 @@ +using AideDeJeu.Models; +using AideDeJeu.ViewModels; +using AideDeJeuLib; +using AideDeJeuLib.Monsters; +using AideDeJeuLib.Spells; +using System; + +using Xamarin.Forms; +using Xamarin.Forms.Xaml; + +namespace AideDeJeu.Views +{ + [XamlCompilation(XamlCompilationOptions.Compile)] + public partial class MonstersPage : MasterDetailPage //TabbedPage + { + MonstersViewModel viewModel; + + public MonstersPage () + { + InitializeComponent (); + + BindingContext = viewModel = new MonstersViewModel(); + } + + async void OnItemSelected(object sender, SelectedItemChangedEventArgs args) + { + var item = args.SelectedItem as Monster; + if (item == null) + return; + + var spellvm = new MonsterDetailViewModel(item); + spellvm.LoadItemCommand.Execute(null); + await Navigation.PushAsync(new MonsterDetailPage(spellvm)); + + // Manually deselect item. + ItemsListView.SelectedItem = null; + } + + async void AddItem_Clicked(object sender, EventArgs e) + { + //await Navigation.PushModalAsync(new NavigationPage(new NewItemPage())); + } + + protected override void OnAppearing() + { + base.OnAppearing(); + + if (viewModel.Items.Count == 0) + viewModel.LoadItemsCommand.Execute(null); + } + } +} \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/SpellsPage.xaml b/AideDeJeu/AideDeJeu/Views/SpellsPage.xaml new file mode 100644 index 00000000..d2a83427 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Views/SpellsPage.xaml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/SpellsPage.xaml.cs b/AideDeJeu/AideDeJeu/Views/SpellsPage.xaml.cs new file mode 100644 index 00000000..0c4fb10e --- /dev/null +++ b/AideDeJeu/AideDeJeu/Views/SpellsPage.xaml.cs @@ -0,0 +1,51 @@ +using AideDeJeu.Models; +using AideDeJeu.ViewModels; +using AideDeJeuLib; +using AideDeJeuLib.Spells; +using System; + +using Xamarin.Forms; +using Xamarin.Forms.Xaml; + +namespace AideDeJeu.Views +{ + [XamlCompilation(XamlCompilationOptions.Compile)] + public partial class SpellsPage : MasterDetailPage //TabbedPage + { + SpellsViewModel viewModel; + + public SpellsPage () + { + InitializeComponent (); + + BindingContext = viewModel = new SpellsViewModel(); + } + + async void OnItemSelected(object sender, SelectedItemChangedEventArgs args) + { + var item = args.SelectedItem as Spell; + if (item == null) + return; + + var spellvm = new SpellDetailViewModel(item); + spellvm.LoadItemCommand.Execute(null); + await Navigation.PushAsync(new SpellDetailPage(spellvm)); + + // Manually deselect item. + ItemsListView.SelectedItem = null; + } + + async void AddItem_Clicked(object sender, EventArgs e) + { + //await Navigation.PushModalAsync(new NavigationPage(new NewItemPage())); + } + + protected override void OnAppearing() + { + base.OnAppearing(); + + if (viewModel.Items.Count == 0) + viewModel.LoadItemsCommand.Execute(null); + } + } +} \ No newline at end of file diff --git a/AideDeJeu/AideDeJeuLib/AideDeJeuLib.csproj b/AideDeJeu/AideDeJeuLib/AideDeJeuLib.csproj index be0fd40d..5a496b0a 100644 --- a/AideDeJeu/AideDeJeuLib/AideDeJeuLib.csproj +++ b/AideDeJeu/AideDeJeuLib/AideDeJeuLib.csproj @@ -10,8 +10,4 @@ - - - - diff --git a/AideDeJeu/AideDeJeuLib/Monsters/Monster.cs b/AideDeJeu/AideDeJeuLib/Monsters/Monster.cs new file mode 100644 index 00000000..a838ef04 --- /dev/null +++ b/AideDeJeu/AideDeJeuLib/Monsters/Monster.cs @@ -0,0 +1,68 @@ +using HtmlAgilityPack; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace AideDeJeuLib.Monsters +{ + public class Monster + { + public string Id { get; set; } + public string Name { get; set; } + public string NameVO { get; set; } + public string Power { get; set; } + public string Type { get; set; } + public string Size { get; set; } + public string Alignment { get; set; } + public string Legendary { get; set; } + public string Source { get; set; } + public string ArmorClass { get; set; } + public string HitPoints { get; set; } + public string Speed { get; set; } + public string Strength { get; set; } + public string Dexterity { get; set; } + public string Constitution { get; set; } + public string Intelligence { get; set; } + public string Wisdom { get; set; } + public string Charisma { get; set; } + public string SavingThrows { get; set; } + public string Skills { get; set; } + public string Senses { get; set; } + public string Languages { get; set; } + public string Challenge { get; set; } + public string Description { get; set; } + public string Picture { get; set; } + + + + public static Monster FromHtml(HtmlNode nodeMonster) + { + var monster = new Monster(); + var divMonster = nodeMonster.SelectSingleNode("div[@class='monstre']"); + monster.Name = divMonster.SelectSingleNode("h1").InnerText; + monster.NameVO = divMonster.SelectSingleNode("div[@class='trad']/a").InnerText; + var divSansSerif = divMonster.SelectSingleNode("div[@class='sansSerif']"); + var typeSizeAlignment = divSansSerif.SelectSingleNode("h2/em").InnerText; + var matchesTypeSizeAlignment = new Regex("(?.*) de taille (?.*), (?.*)").Match(typeSizeAlignment); + monster.Type = matchesTypeSizeAlignment.Groups["type"].Value; + monster.Size = matchesTypeSizeAlignment.Groups["size"].Value; + monster.Alignment = matchesTypeSizeAlignment.Groups["alignment"].Value; + var divRed = divSansSerif.SelectSingleNode("div[@class='red']"); + monster.Strength = divRed.SelectSingleNode("strong").NextSibling.InnerText; + //monster.LevelType = nodeSpell.SelectSingleNode("h2/em").InnerText; + //monster.Level = spell.LevelType.Split(new string[] { " - " }, StringSplitOptions.None)[0].Split(' ')[1]; + //monster.Type = spell.LevelType.Split(new string[] { " - " }, StringSplitOptions.None)[1]; + //monster.CastingTime = nodeSpell.SelectSingleNode("div[@class='paragraphe']").InnerText.Split(new string[] { " : " }, StringSplitOptions.None)[1]; + //monster.Range = nodeSpell.SelectSingleNode("div[strong/text()='Portée']").InnerText.Split(new string[] { " : " }, StringSplitOptions.None)[1]; + //monster.Components = nodeSpell.SelectSingleNode("div[strong/text()='Composantes']").InnerText.Split(new string[] { " : " }, StringSplitOptions.None)[1]; + //monster.Duration = nodeSpell.SelectSingleNode("div[strong/text()='Durée']").InnerText.Split(new string[] { " : " }, StringSplitOptions.None)[1]; + //monster.DescriptionDiv = nodeSpell.SelectSingleNode("div[contains(@class,'description')]"); + //monster.Overflow = nodeSpell.SelectSingleNode("div[@class='overflow']")?.InnerText; + //monster.NoOverflow = nodeSpell.SelectSingleNode("div[@class='nooverflow']")?.InnerText; + //monster.Source = nodeSpell.SelectSingleNode("div[@class='source']").InnerText; + return monster; + } + + } +} diff --git a/AideDeJeu/AideDeJeuLib/Monsters/MonstersScrappers.cs b/AideDeJeu/AideDeJeuLib/Monsters/MonstersScrappers.cs new file mode 100644 index 00000000..4252954c --- /dev/null +++ b/AideDeJeu/AideDeJeuLib/Monsters/MonstersScrappers.cs @@ -0,0 +1,75 @@ +using HtmlAgilityPack; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace AideDeJeuLib.Monsters +{ + public class MonstersScrappers + { + public HttpClient GetHttpClient() + { + var client = new HttpClient(); + client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/html")); + client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xhtml+xml")); + client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml")); + client.DefaultRequestHeaders.AcceptLanguage.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("fr")); + client.DefaultRequestHeaders.AcceptLanguage.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("fr-FR")); + return client; + } + + public async Task> GetMonsters(string categorie = "", string type = "", string niveauMin = "", string niveauMax = "", string taille = "", string legendaire = "", string source = "srd") + { + string html = null; + using (var client = GetHttpClient()) + { + // https://www.aidedd.org/regles/monstres/?min=.25&max=20&c=M&sz=TP&lg=si&t=Humano%C3%AFde&s=srd + + html = await client.GetStringAsync(string.Format($"https://www.aidedd.org/regles/monstres/?c={categorie}&t={type}&min={niveauMin}&max={niveauMax}&sz={taille}&lg={legendaire}&s={source}", categorie, type, niveauMin, niveauMax, taille, legendaire, source)); + } + var pack = new HtmlDocument(); + pack.LoadHtml(html); + var trs = pack.GetElementbyId("liste").Element("table").Elements("tr").ToList(); + var monsters = new List(); + foreach (var tr in trs) + { + var tds = tr.Elements("td").ToArray(); + if (tds.Length > 0) + { + var monster = new Monster(); + monster.Name = tds[0].InnerText; + var href = tds[0].Element("a").GetAttributeValue("href", ""); + var regex = new Regex("vf=(?.*)"); + monster.Id = regex.Match(href).Groups["id"].Value; + monster.Power = tds[1].InnerText; + monster.Type = tds[2].InnerText; + monster.Size = tds[3].InnerText; + monster.Alignment = tds[4].InnerText; + monster.Legendary = tds[5].InnerText; + monsters.Add(monster); + } + } + return monsters; + } + + public async Task GetMonster(string id) + { + string html = null; + using (var client = GetHttpClient()) + { + // https://www.aidedd.org/dnd/monstres.php?vf=aarakocra + + html = await client.GetStringAsync(string.Format($"https://www.aidedd.org/dnd/monstres.php?vf={id}", id)); + } + var pack = new HtmlDocument(); + pack.LoadHtml(html); + var divBloc = pack.DocumentNode.SelectNodes("//div[contains(@class,'bloc')]").FirstOrDefault(); + return Monster.FromHtml(divBloc); + } + + } +} diff --git a/AideDeJeu/AideDeJeuLib/Spells/Scrappers.cs b/AideDeJeu/AideDeJeuLib/Spells/SpellsScrappers.cs similarity index 99% rename from AideDeJeu/AideDeJeuLib/Spells/Scrappers.cs rename to AideDeJeu/AideDeJeuLib/Spells/SpellsScrappers.cs index d0e5d99b..6a3f4e1a 100644 --- a/AideDeJeu/AideDeJeuLib/Spells/Scrappers.cs +++ b/AideDeJeu/AideDeJeuLib/Spells/SpellsScrappers.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace AideDeJeuLib.Spells { - public class Scrappers + public class SpellsScrappers { public HttpClient GetHttpClient() {