diff --git a/AideDeJeu/AideDeJeu/Services/SpellDataStore.cs b/AideDeJeu/AideDeJeu/Services/SpellDataStore.cs index 287824ed..fc700ee9 100644 --- a/AideDeJeu/AideDeJeu/Services/SpellDataStore.cs +++ b/AideDeJeu/AideDeJeu/Services/SpellDataStore.cs @@ -58,7 +58,8 @@ namespace AideDeJeu.Services public async Task> GetItemsAsync(bool forceRefresh = false) { var scrapper = new Scrappers(); - items = (await scrapper.GetSpells(await scrapper.GetSpellIds(""))).ToList(); + //items = (await scrapper.GetSpells(await scrapper.GetSpellIds(""))).ToList(); + items = (await scrapper.GetSpells()).ToList(); //items = spells.Select(spell => new Item() { Text = spell.Title, Description = spell.DescriptionText }).ToList(); return await Task.FromResult(items); diff --git a/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs index 0aea80d7..e33d8858 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs @@ -1,17 +1,54 @@ using System; - +using System.Diagnostics; +using System.Threading.Tasks; using AideDeJeu.Models; using AideDeJeuLib; +using Xamarin.Forms; namespace AideDeJeu.ViewModels { public class SpellDetailViewModel : BaseViewModel { - public Spell Item { get; set; } + Spell _Item = null; + public Spell Item + { + get { return _Item; } + set { SetProperty(ref _Item, value); } + } + + public Command LoadItemCommand { get; set; } + public SpellDetailViewModel(Spell item = null) { Title = item?.Title; Item = item; + LoadItemCommand = new Command(async () => await ExecuteLoadItemCommand()); + } + async Task ExecuteLoadItemCommand() + { + if (IsBusy) + return; + + IsBusy = true; + + try + { + //Items.Clear(); + var item = await new Scrappers().GetSpell(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/Views/MainPage.xaml.cs b/AideDeJeu/AideDeJeu/Views/MainPage.xaml.cs index 72d8d3f5..60aced9d 100644 --- a/AideDeJeu/AideDeJeu/Views/MainPage.xaml.cs +++ b/AideDeJeu/AideDeJeu/Views/MainPage.xaml.cs @@ -26,7 +26,9 @@ namespace AideDeJeu.Views if (item == null) return; - await Navigation.PushAsync(new SpellDetailPage(new SpellDetailViewModel(item))); + var spellvm = new SpellDetailViewModel(item); + spellvm.LoadItemCommand.Execute(null); + await Navigation.PushAsync(new SpellDetailPage(spellvm)); // Manually deselect item. ItemsListView.SelectedItem = null; @@ -34,7 +36,7 @@ namespace AideDeJeu.Views async void AddItem_Clicked(object sender, EventArgs e) { - await Navigation.PushModalAsync(new NavigationPage(new NewItemPage())); + //await Navigation.PushModalAsync(new NavigationPage(new NewItemPage())); } protected override void OnAppearing() diff --git a/AideDeJeu/AideDeJeuLib/Scrappers.cs b/AideDeJeu/AideDeJeuLib/Scrappers.cs index 58f321d7..f79e0d44 100644 --- a/AideDeJeu/AideDeJeuLib/Scrappers.cs +++ b/AideDeJeu/AideDeJeuLib/Scrappers.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Net.Http; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace AideDeJeuLib @@ -40,6 +41,83 @@ namespace AideDeJeuLib return pack.DocumentNode.SelectNodes("//input[@name='select_sorts[]']").Select(node => node.GetAttributeValue("value", "")); } + public async Task> GetSpells(string classe = "", int niveauMin = 0, int niveauMax = 9, string ecole = "", string rituel = "", string source = "srd") + { + string html = null; + using (var client = GetHttpClient()) + { + // https://www.aidedd.org/dnd/sorts.php?vo=ray-of-frost + // https://www.aidedd.org/dnd/sorts.php?vf=rayon-de-givre + // https://www.aidedd.org/regles/sorts/ + + html = await client.GetStringAsync(string.Format("https://www.aidedd.org/regles/sorts/?c={0}&min=1{1}&max=1{2}&e={3}&r={4}&s={5}", classe, niveauMin, niveauMax, ecole, rituel, source)); + } + var pack = new HtmlDocument(); + pack.LoadHtml(html); + var tdssort = pack.GetElementbyId("liste").Element("table").Elements("tr").ToList(); + var spells = new List(); + foreach (var tdsort in tdssort) + { + var thssort = tdsort.Elements("td").ToArray(); + if (thssort.Length > 0) + { + Spell spell = new Spell(); + spell.Title = thssort[0].InnerText; + var href = thssort[0].Element("a").GetAttributeValue("href", ""); + var regex = new Regex("vf=(?.*)"); + spell.Id = regex.Match(href).Groups["id"].Value; + spell.Level = thssort[1].InnerText; + spell.Type = thssort[2].InnerText; + spell.CastingTime = thssort[3].InnerText; + spell.Concentration = thssort[4].InnerText; + spell.Rituel = thssort[5].InnerText; + spells.Add(spell); + } + } + return spells; + } + + public async Task GetSpell(string id) + { + string html = null; + using (var client = GetHttpClient()) + { + // https://www.aidedd.org/dnd/sorts.php?vo=ray-of-frost + // https://www.aidedd.org/dnd/sorts.php?vf=rayon-de-givre + // https://www.aidedd.org/regles/sorts/ + + html = await client.GetStringAsync(string.Format("https://www.aidedd.org/dnd/sorts.php?vf={0}", id)); + } + var pack = new HtmlDocument(); + pack.LoadHtml(html); + var newSpells = new List(); + var divSpell = pack.DocumentNode.SelectNodes("//div[contains(@class,'bloc')]").FirstOrDefault(); + var newSpell = HtmlDivToSpell(divSpell); + + return newSpell; + } + + public Spell HtmlDivToSpell(HtmlNode divSpell) + { + var newSpell = new Spell(); + newSpell.Title = divSpell.SelectSingleNode("h1").InnerText; + newSpell.TitleUS = divSpell.SelectSingleNode("div[@class='trad']").InnerText; + newSpell.LevelType = divSpell.SelectSingleNode("h2/em").InnerText; + newSpell.Level = newSpell.LevelType.Split(new string[] { " - " }, StringSplitOptions.None)[0].Split(' ')[1]; + newSpell.Type = newSpell.LevelType.Split(new string[] { " - " }, StringSplitOptions.None)[1]; + newSpell.CastingTime = divSpell.SelectSingleNode("div[@class='paragraphe']").InnerText.Split(new string[] { " : " }, StringSplitOptions.None)[1]; + newSpell.Range = divSpell.SelectSingleNode("div[strong/text()='Portée']").InnerText.Split(new string[] { " : " }, StringSplitOptions.None)[1]; + newSpell.Components = divSpell.SelectSingleNode("div[strong/text()='Composantes']").InnerText.Split(new string[] { " : " }, StringSplitOptions.None)[1]; + newSpell.Duration = divSpell.SelectSingleNode("div[strong/text()='Durée']").InnerText.Split(new string[] { " : " }, StringSplitOptions.None)[1]; + newSpell.DescriptionDiv = divSpell.SelectSingleNode("div[contains(@class,'description')]"); + newSpell.Overflow = divSpell.SelectSingleNode("div[@class='overflow']")?.InnerText; + newSpell.NoOverflow = divSpell.SelectSingleNode("div[@class='nooverflow']")?.InnerText; + newSpell.Source = divSpell.SelectSingleNode("div[@class='source']").InnerText; + + return newSpell; + } + + public async Task> GetSpells(IEnumerable spellIds) { string html = null; @@ -57,7 +135,6 @@ namespace AideDeJeuLib var pack = new HtmlDocument(); pack.LoadHtml(html); var newSpells = new List(); - var cardDatas = new List(); var spells = pack.DocumentNode.SelectNodes("//div[contains(@class,'blocCarte')]").ToList(); foreach (var spell in spells) { diff --git a/AideDeJeu/AideDeJeuLib/Spell.cs b/AideDeJeu/AideDeJeuLib/Spell.cs index 83aced21..f6bf45e6 100644 --- a/AideDeJeu/AideDeJeuLib/Spell.cs +++ b/AideDeJeu/AideDeJeuLib/Spell.cs @@ -13,12 +13,14 @@ namespace AideDeJeuLib public string LevelType { get; set; } public string Level { get; set; } public string Type { get; set; } + public string Concentration { get; set; } + public string Rituel { get; set; } public string CastingTime { get; set; } public string Range { get; set; } public string Components { get; set; } public string Duration { get; set; } - public string DescriptionHtml { get { return DescriptionDiv.InnerHtml; } } - public string Description { get { return DescriptionDiv.InnerHtml.Replace("
", "\r\n").Replace("","").Replace("", "").Replace("", "").Replace("", ""); } } + public string DescriptionHtml { get { return DescriptionDiv?.InnerHtml; } } + public string Description { get { return DescriptionDiv?.InnerHtml?.Replace("
", "\r\n")?.Replace("","")?.Replace("", "")?.Replace("", "")?.Replace("", ""); } } public HtmlNode DescriptionDiv { get; set; } public string Overflow { get; set; } public string NoOverflow { get; set; }