/// <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); }
/// <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); }
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); }
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); }
/// <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)); }
/// <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); }
/// <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); }
/// <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); }
public static TimeSpan GetHeroArrival(HtmlDocument htmlDoc) { return(TimeParser.ParseTimer(htmlDoc.GetElementbyId("tileDetails"))); }