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);
            }
        }
示例#2
0
        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);
            }
        }