private static async Task <Deck> ImportArenaValue(string url) { try { var deck = new Deck { Name = "Arena " + DateTime.Now.ToString("dd-MM HH:mm"), IsArenaDeck = true }; const string baseUrl = @"http://www.arenavalue.com/deckpopout.php?id="; var newUrl = baseUrl + url.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Last(); HtmlNodeCollection nodes = null; using (var wb = new WebBrowser()) { var done = false; wb.Navigate(newUrl + "#" + DateTime.Now.Ticks); wb.DocumentCompleted += (sender, args) => done = true; while (!done) { await Task.Delay(50); } for (var i = 0; i < 20; i++) { var doc = new HtmlDocument(); doc.Load(wb.DocumentStream); if ((nodes = doc.DocumentNode.SelectNodes("//*[@id='deck']/div[@class='deck screenshot']")) != null) { try { if (nodes.Sum(x => int.Parse(x.Attributes["data-count"].Value)) == 30) { break; } } catch { } } await Task.Delay(500); } } if (nodes == null) { return(null); } foreach (var node in nodes) { var cardId = node.Attributes["data-original"].Value; int count; int.TryParse(node.Attributes["data-count"].Value, out count); var card = Game.GetCardFromId(cardId); card.Count = count; deck.Cards.Add(card); if (string.IsNullOrEmpty(deck.Class) && card.GetPlayerClass != "Neutral") { deck.Class = card.PlayerClass; } } if (DeckList.Instance.AllTags.Contains("Arena")) { deck.Tags.Add("Arena"); } return(deck); } catch (Exception e) { Logger.WriteLine(e.ToString(), "DeckImporter"); return(null); } }
public static async Task <Deck> Import(string url) { try { var deck = new Deck { Name = Helper.ParseDeckNameTemplate(Config.Instance.ArenaDeckNameTemplate), IsArenaDeck = true }; const string baseUrl = @"http://www.arenavalue.com/deckpopout.php?id="; var newUrl = baseUrl + url.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Last(); HtmlNodeCollection nodes = null; using (var wb = new WebBrowser()) { var done = false; wb.ScriptErrorsSuppressed = true; wb.Navigate(newUrl + "#" + DateTime.Now.Ticks); wb.DocumentCompleted += (sender, args) => done = true; while (!done) { await Task.Delay(50); } for (var i = 0; i < 20; i++) { var doc = new HtmlDocument(); doc.Load(wb.DocumentStream); if ((nodes = doc.DocumentNode.SelectNodes("//*[@id='deck']/div[contains(@class, 'screenshot')]")) != null) { try { if (nodes.Sum(x => int.Parse(x.Attributes["data-count"].Value)) == 30) { break; } } catch { } } await Task.Delay(500); } } if (nodes == null) { return(null); } foreach (var node in nodes) { int count; int.TryParse(node.Attributes["data-count"].Value, out count); var text = HttpUtility.HtmlDecode(node.InnerText).Trim(); var match = Regex.Match(text, @"^\d+\s*(.+?)\s*(x \d+)?$"); var name = ""; if (match.Success && match.Groups.Count == 3) { name = match.Groups[1].ToString(); } if (string.IsNullOrWhiteSpace(name)) { continue; } var card = Database.GetCardFromName(name); card.Count = count; deck.Cards.Add(card); if (string.IsNullOrEmpty(deck.Class) && card.GetPlayerClass != "Neutral") { deck.Class = card.PlayerClass; } } return(deck); } catch (Exception e) { Logger.WriteLine(e.ToString(), "DeckImporter"); return(null); } }