Exemplo n.º 1
0
        /// <summary>
        /// Parses the ongoing resource transits in the market.
        /// </summary>
        /// <param name="htmlDoc">Html</param>
        public static List <MerchantsUnderWay> ParseTransits(HtmlAgilityPack.HtmlDocument htmlDoc)
        {
            var formulat = htmlDoc.GetElementbyId("merchantsOnTheWay");

            var         underWay    = new List <MerchantsUnderWay>();
            TransitType transitType = default;

            foreach (var child in formulat.ChildNodes)
            {
                if (child.HasClass("spacer"))
                {
                    transitType = Localizations.MercahntDirectionFromString(child.InnerText);
                    continue;
                }
                else if (child.HasClass("traders"))
                {
                    underWay.Add(new MerchantsUnderWay()
                    {
                        Arrival         = DateTime.Now.Add(TimeParser.ParseTimer(child)),
                        TargetVillageId = (int)Parser.RemoveNonNumeric(child.Descendants("td").First(x => x.HasClass("dorf")).Descendants("a").First().GetAttributeValue("href", "")),
                        RepeatTimes     = (int)Parser.RemoveNonNumeric(child.Descendants("div").First(x => x.HasClass("repeat")).InnerText),
                        Transit         = transitType,
                        Resources       = ResourceParser.ParseResourcesMerchants(child),
                    });
                }
            }
            return(underWay);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Method to get currently improving troops inside the smithy.
        /// </summary>
        /// <param name="html">HtmlDocument of the page</param>
        /// <returns></returns>
        public static List <TroopCurrentlyImproving> GetImprovingTroops(HtmlDocument html)
        {
            var list  = new List <TroopCurrentlyImproving>();
            var table = html.DocumentNode.Descendants("table").FirstOrDefault(x => x.HasClass("under_progress"));

            if (table == null)
            {
                return(list);
            }
            //If we have plus acc, we can have 2 improvements simultaneously
            var rows = table.ChildNodes.First(x => x.Name == "tbody").ChildNodes.Where(x => x.Name == "tr");

            foreach (var row in rows)
            {
                var desc = row.Descendants("td").First(x => x.HasClass("desc"));
                (Classificator.TroopsEnum, int)troop = GetTroopAndLevel(desc);
                var time = TimeParser.ParseTimer(row);
                list.Add(new TroopCurrentlyImproving
                {
                    Level = troop.Item2,
                    Troop = troop.Item1,
                    Time  = time
                });
            }
            return(list);
        }
        public static List <BuildingCurrently> CurrentlyBuilding(HtmlAgilityPack.HtmlDocument htmlDoc)
        {
            var finishButton = htmlDoc.DocumentNode.Descendants("div").FirstOrDefault(x => x.HasClass("finishNow"));

            if (finishButton == null)
            {
                return(null);
            }
            var ret = new List <BuildingCurrently>();

            foreach (var row in finishButton.ParentNode.Descendants("li").ToList())
            {
                var duration = TimeParser.ParseTimer(row);
                var name     = row.Descendants("div").FirstOrDefault(x => x.HasClass("name")).InnerText.Split('\n')[1].Trim();
                var lvl      = Parser.RemoveNonNumeric(row.Descendants("span").FirstOrDefault(x => x.HasClass("lvl")).InnerText);

                ret.Add(new BuildingCurrently()
                {
                    Duration = DateTime.Now.Add(duration),
                    Level    = (byte)lvl,
                    Building = Localizations.BuildingFromString(name)
                });
            }
            return(ret);
        }
Exemplo n.º 4
0
        public static List <BuildingCurrently> CurrentlyBuilding(HtmlAgilityPack.HtmlDocument htmlDoc, Account acc)
        {
            var finishButton = htmlDoc.DocumentNode.Descendants("div").FirstOrDefault(x => x.HasClass("finishNow"));

            if (finishButton == null)
            {
                return(null);
            }
            var ret = new List <BuildingCurrently>();

            foreach (var row in finishButton.ParentNode.Descendants("li").ToList())
            {
                var duration = TimeParser.ParseTimer(row);
                var nameArr  = row.Descendants("div").FirstOrDefault(x => x.HasClass("name")).InnerText.Split('\t'); //[1].Trim();

                var    levelStr = row.Descendants("span").FirstOrDefault(x => x.HasClass("lvl")).InnerText;
                string name     = nameArr.FirstOrDefault(x => !string.IsNullOrEmpty(x.Replace("\r", "").Replace("\n", "")));
                switch (acc.AccInfo.ServerVersion)
                {
                case Classificator.ServerVersionEnum.T4_4:
                    name = name.Replace(levelStr, "");
                    break;
                }
                var lvl = Parser.RemoveNonNumeric(levelStr);

                ret.Add(new BuildingCurrently()
                {
                    Duration = DateTime.Now.Add(duration),
                    Level    = (byte)lvl,
                    Building = Localizations.BuildingFromString(name, acc)
                });
            }
            return(ret);
        }
Exemplo n.º 5
0
        public static List <TroopMovementDorf1> ParseDorf1Movements(HtmlDocument html)
        {
            var ret = new List <TroopMovementDorf1>();

            var movements = html.GetElementbyId("movements");

            if (movements == null)
            {
                return(ret);
            }

            foreach (var movement in movements.Descendants("tr"))
            {
                var img = movement.Descendants("img").FirstOrDefault();
                if (img == null)
                {
                    continue;              // Not a movement row
                }
                var movementType = ParseMovementImg(img.GetClasses().First());

                var numStr = movement.Descendants("div").First(x => x.HasClass("mov")).InnerText;
                var num    = (int)Parser.RemoveNonNumeric(numStr);

                var time = TimeParser.ParseTimer(movement.Descendants("div").First(x => x.HasClass("dur_r")));

                ret.Add(new TroopMovementDorf1()
                {
                    Type  = movementType,
                    Count = num,
                    Time  = DateTime.Now.Add(time)
                });
            }
            return(ret);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Parses when the hero arrival will be (parsed from /hero.php)
        /// </summary>
        /// <param name="html">Html</param>
        /// <returns>TimeSpan after how much time hero arrival will happen</returns>
        public static TimeSpan GetHeroArrivalInfo(HtmlDocument html)
        {
            var statusMsg = html.DocumentNode.Descendants("div").FirstOrDefault(x => x.HasClass("heroStatusMessage"));

            if (statusMsg == null)
            {
                return(new TimeSpan(-1, 0, 0));                   // -1 hour
            }
            return(TimeParser.ParseTimer(statusMsg));
        }
Exemplo n.º 7
0
        /// <summary>
        /// Get soonest time own merchant arrive (ignore fact they go away or go back village)
        /// </summary>
        /// <param name="htmlDoc">Html</param>
        public static DateTime GetSoonestMerchant(HtmlAgilityPack.HtmlDocument htmlDoc)
        {
            // i know id is incoming, but trust me =))
            var divOwnMerchants = htmlDoc.DocumentNode.Descendants("div").FirstOrDefault(x => x.HasClass("incomingMerchants"));

            var table = divOwnMerchants.Descendants("table").FirstOrDefault();

            var soonest = DateTime.Now.Add(TimeParser.ParseTimer(table));

            return(soonest);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Gets the TimeSpan when the current celebration will end
        /// </summary>
        /// <param name="html">Html</param>
        /// <returns>When celebration will end</returns>
        public static DateTime GetCelebrationTime(HtmlDocument html)
        {
            var underProgress = html.GetElementbyId("under_progress"); // T4.4

            if (underProgress == null)                                 // T4.5
            {
                var content = html.GetElementbyId("content");
                underProgress = content.Descendants().FirstOrDefault(x => x.HasClass("under_progress"));
            }

            if (underProgress == null)
            {
                return(DateTime.MinValue);                       // No celebration is under progress
            }
            return(DateTime.Now + TimeParser.ParseTimer(underProgress));
        }
        /// <summary>
        /// Parse troops from the overview tab inside the rally point
        /// </summary>
        public static List <TroopsMovementRallyPoint> ParseTroopsOverview(Account acc, HtmlDocument html)
        {
            var ret = new List <TroopsMovementRallyPoint>();

            var attacks = html.DocumentNode.Descendants("table").Where(x => x.HasClass("troop_details"));

            if (attacks == null)
            {
                return(ret);
            }

            var now = TimeParser.GetServerTime(html);

            foreach (var attackNode in attacks)
            {
                var attack = new TroopsMovementRallyPoint();

                var movementClass = attackNode.GetClasses().FirstOrDefault(x => x != "troop_details");
                attack.MovementType = ParseMovementClass(movementClass);

                // If attack.Troops.Sum() is less than 11, we are able to view troop types attacking
                attack.Troops = ParseIncomingTroops(attackNode);

                var infos = attackNode.Descendants("tbody").FirstOrDefault(x => x.HasClass("infos"));

                attack.Arrival = now.Add(TimeParser.ParseTimer(infos));

                var sourceId = MapParser.GetKarteHref(attackNode.Descendants("td").First(x => x.HasClass("role")));
                attack.SourceCoordinates = MapHelper.CoordinatesFromKid(sourceId, acc);

                var targetId = MapParser.GetKarteHref(attackNode.Descendants("td").First(x => x.HasClass("troopHeadline")));
                attack.TargetCoordinates = MapHelper.CoordinatesFromKid(targetId, acc);

                var unitImg  = attackNode.Descendants("img").First(x => x.HasClass("unit"));
                var unitInt  = Parser.RemoveNonNumeric(unitImg.GetClasses().First(x => x != "unit"));
                int tribeInt = (int)(unitInt / 10);
                // ++ since the first element in Classificator.TribeEnum is Any, second is Romans.
                tribeInt++;
                attack.Tribe = ((Classificator.TribeEnum)tribeInt);

                ret.Add(attack);
            }
            return(ret);
        }
        public static List <IncomingAttackModel> FullAttackWithHero(HtmlDocument html)
        {
            var ret     = new List <IncomingAttackModel>();
            var attacks = html.DocumentNode.Descendants("table").Where(x => x.HasClass("troop_details"));

            if (attacks == null)
            {
                return(ret);
            }
            var count = attacks.Count();

            foreach (var attack in attacks)
            {
                var attackModel = new IncomingAttackModel();

                attackModel.MovementType = MovementType.Attack;
                if (attack.HasClass("inRaid"))
                {
                    attackModel.MovementType = MovementType.Raid;
                }

                var troops    = attack.Descendants("tbody").FirstOrDefault(x => x.HasClass("last") && x.HasClass("units"));
                var troopsNum = troops.Descendants("td").Where(x => x.HasClass("unit"));
                // Hero can be "0" -> false only if user has stronger spies art or number of attacking troops
                // are below rally point level
                attackModel.Hero = false;
                if (troopsNum.Last().InnerText == "?")
                {
                    attackModel.Hero = true;
                }

                var infos = attack.Descendants("tbody").FirstOrDefault(x => x.HasClass("infos"));
                attackModel.Arrival = DateTime.Now.Add(TimeParser.ParseTimer(infos));
            }
            return(ret);
        }
Exemplo n.º 11
0
        /// <summary>
        /// Get currently building (upgrading/constructing) buildings from dorf1/dorf2
        /// </summary>
        public static List <BuildingCurrently> CurrentlyBuilding(HtmlAgilityPack.HtmlDocument htmlDoc, Account acc)
        {
            var finishButton = htmlDoc.DocumentNode.Descendants("div").FirstOrDefault(x => x.HasClass("finishNow"));

            if (finishButton == null)
            {
                return(null);
            }

            var ret = new List <BuildingCurrently>();

            foreach (var row in finishButton.ParentNode.Descendants("li").ToList())
            {
                var duration = TimeParser.ParseTimer(row);
                var level    = row.Descendants("span").FirstOrDefault(x => x.HasClass("lvl")).InnerText;

                ret.Add(new BuildingCurrently()
                {
                    Duration = DateTime.Now.Add(duration),
                    Level    = (byte)Parser.RemoveNonNumeric(level),
                });
            }
            return(ret);
        }
Exemplo n.º 12
0
 public static TimeSpan GetHeroArrival(HtmlDocument htmlDoc)
 {
     return(TimeParser.ParseTimer(htmlDoc.GetElementbyId("tileDetails")));
 }