1
0
Fork 0
mirror of https://github.com/Nioux/AideDeJeu.git synced 2025-10-29 06:26:02 +00:00

Utilisation de la page sorts.php au lieu de la page livre-sorts pour ne charger que les titres et surtout avoir plus d'options de filtre

This commit is contained in:
Yan Maniez 2018-04-22 23:32:04 +02:00
parent 87438c69c4
commit 8089e3afb0
5 changed files with 127 additions and 8 deletions

View file

@ -58,7 +58,8 @@ namespace AideDeJeu.Services
public async Task<IEnumerable<Spell>> 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);

View file

@ -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;
}
}
}
}

View file

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

View file

@ -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<IEnumerable<Spell>> 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<Spell>();
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=(?<id>.*)");
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<Spell> 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<Spell>();
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<IEnumerable<Spell>> GetSpells(IEnumerable<string> spellIds)
{
string html = null;
@ -57,7 +135,6 @@ namespace AideDeJeuLib
var pack = new HtmlDocument();
pack.LoadHtml(html);
var newSpells = new List<Spell>();
var cardDatas = new List<CardData>();
var spells = pack.DocumentNode.SelectNodes("//div[contains(@class,'blocCarte')]").ToList();
foreach (var spell in spells)
{

View file

@ -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("<br>", "\r\n").Replace("<strong>","").Replace("</strong>", "").Replace("<em>", "").Replace("</em>", ""); } }
public string DescriptionHtml { get { return DescriptionDiv?.InnerHtml; } }
public string Description { get { return DescriptionDiv?.InnerHtml?.Replace("<br>", "\r\n")?.Replace("<strong>","")?.Replace("</strong>", "")?.Replace("<em>", "")?.Replace("</em>", ""); } }
public HtmlNode DescriptionDiv { get; set; }
public string Overflow { get; set; }
public string NoOverflow { get; set; }