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()
{