public override async Task <TaskRes> Execute(Account acc) { var script = $"document.getElementById('mentorTaskList').querySelector('[data-questid=\"{this.QuestToClaim.Id}\"]').click();"; await DriverHelper.ExecuteScript(acc, script); await Task.Delay(AccountHelper.Delay() * 2); string buttonId = ""; switch (acc.AccInfo.ServerVersion) { case Classificator.ServerVersionEnum.T4_5: buttonId = acc.Wb.Html.DocumentNode.Descendants("button").FirstOrDefault(x => x.GetAttributeValue("questid", "") == this.QuestToClaim.Id).Id; break; case Classificator.ServerVersionEnum.T4_4: buttonId = acc.Wb.Html.DocumentNode.Descendants("button").FirstOrDefault(x => x.HasClass("questButtonNext"))?.Id; break; } await DriverHelper.ClickById(acc, buttonId); await TaskExecutor.PageLoaded(acc); // Optional return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/dorf2.php"); await DriverHelper.ExecuteScript(acc, "Travian.Game.Quest.openTodoListDialog('', true);"); switch (acc.AccInfo.ServerVersion) { case Classificator.ServerVersionEnum.T4_4: var script = "var dialog = document.getElementById('dialogContent');"; script += "dialog.getElementsByClassName('active')[0].click();"; await DriverHelper.ExecuteScript(acc, script); break; case Classificator.ServerVersionEnum.T4_5: await DriverHelper.ExecuteScript(acc, "document.getElementsByClassName('rewardReady')[0].click();"); break; } await DriverHelper.ExecuteScript(acc, "document.getElementsByClassName('questButtonGainReward')[0].click();"); return(TaskRes.Executed); }
//TODO Add options for catapult/scout targets inside SendTroops2! public override async Task <TaskRes> Execute(Account acc) { var wb = acc.Wb.Driver; await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/build.php?tt=2&id=39"); //add number of troops to the input boxes for (int i = 0; i < TroopsMovement.Troops.Length; i++) { if (TroopsMovement.Troops[i] == 0) { continue; } wb.ExecuteScript($"document.getElementsByName('t{i + 1 }')[0].value='{TroopsMovement.Troops[i]}'"); await Task.Delay(222); } //select coordinates wb.ExecuteScript($"document.getElementById('xCoordInput').value='{TroopsMovement.Coordinates.x}'"); wb.ExecuteScript($"document.getElementById('yCoordInput').value='{TroopsMovement.Coordinates.y}'"); //Select type of troop sending string script = "var radio = document.getElementsByClassName(\"radio\");for(var i = 0; i < radio.length; i++){"; script += $"if(radio[i].value == \"{(int)TroopsMovement.MovementType}\") radio[i].checked = \"checked\"}}"; await DriverHelper.ExecuteScript(acc, script); //Click on "Send" button wb.ExecuteScript($"document.getElementById('btn_ok').click()"); return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { var wb = acc.Wb.Driver; await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/dorf1.php"); Random rnd = new Random(); int sec = rnd.Next(725, 740); TaskExecutor.AddTask(acc, new TTWarsGetAnimals() { ExecuteAt = DateTime.Now.AddSeconds(sec), Vill = AccountHelper.GetMainVillage(acc) }); //Open payment wizard on tab Plus features (where you can buy stuff with gold) var script = "window.fireEvent('startPaymentWizard', {data:{activeTab: 'paymentFeatures'}});"; await DriverHelper.ExecuteScript(acc, script); script = "$$('.paymentWizardMenu').addClass('hide');$$('.buyGoldInfoStep').removeClass('active');$$('.buyGoldInfoStep#3').addClass('active');$$('.paymentWizardMenu#buyAnimal').removeClass('hide');"; await DriverHelper.ExecuteScript(acc, script); var buy = acc.Wb.Html.DocumentNode.Descendants().First(x => x.HasClass("buyAnimal5")); //wb.FindElementById(buy.Id).Click(); //var buy = acc.Wb.Html.DocumentNode.SelectNodes("//*[text()[contains(., '3000')]]")[0]; //while (buy.Name != "button") buy = buy.ParentNode; //var buyId = buy.GetAttributeValue("id", ""); wb.ExecuteScript($"document.getElementById('{buy.Id}').click()"); //Clicking on buy button DOES NOT trigger a page reloag. We have to do it manually. return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/dorf1.php"); var finishClass = acc.Wb.Html.DocumentNode .Descendants("div") .FirstOrDefault(x => x.HasClass("finishNow")); var button = finishClass.Descendants("button").FirstOrDefault(); await TbsCore.Helpers.DriverHelper.ExecuteScript(acc, $"document.getElementById('{button.GetAttributeValue("id", "")}').click()"); var dialog = acc.Wb.Html.GetElementbyId("finishNowDialog"); var useButton = dialog.Descendants("button").FirstOrDefault(); await DriverHelper.ExecuteScript(acc, $"document.getElementById('{useButton.GetAttributeValue("id", "")}').click()"); // Execute next build task right away var task = acc.Tasks.FirstOrDefault(x => x.GetType() == typeof(UpgradeBuilding) && x.Vill == this.Vill ); if (task != null) { task.ExecuteAt = DateTime.Now; } await TaskExecutor.PageLoaded(acc); return(TaskRes.Executed); }
/// <summary> /// Is called whenever a web browser loaded a new page. /// Usage: After navigation (has to execute) and after execution (click on button etc.) /// In first case execute the task, in second remove it. /// </summary> /// <param name="acc"></param> public static async Task PageLoaded(Account acc) { if (IsCaptcha(acc) || IsWWMsg(acc) || IsBanMsg(acc) || IsMaintanance(acc)) //Check if a captcha/ban/end of server/maintanance { acc.Wb.Log("Captcha/WW/Ban/Maintanance found! Stopping bot for this account!"); acc.TaskTimer.Stop(); return; } if (CheckCookies(acc)) { await DriverHelper.ExecuteScript(acc, "document.getElementById('CybotCookiebotDialogBodyLevelButtonLevelOptinDeclineAll').click();"); } if (CheckCookiesNew(acc)) { await DriverHelper.ExecuteScript(acc, "document.getElementsByClassName('cmpboxbtnyes')[0].click();"); } if (CheckContextualHelp(acc) && acc.AccInfo.ServerVersion == Classificator.ServerVersionEnum.T4_5) { AddTaskIfNotExists(acc, new EditPreferences() { ExecuteAt = DateTime.Now.AddHours(-1), TroopsPerPage = 99, ContextualHelp = true }); } if (acc.AccInfo.Tribe == null && CheckSkipTutorial(acc)) { await DriverHelper.ClickByClassName(acc, "questButtonSkipTutorial"); } if (IsLoginScreen(acc)) //Check if you are on login page -> Login task { AddTask(acc, new LoginTask() { ExecuteAt = DateTime.MinValue }); return; } if (IsSysMsg(acc)) //Check if there is a system message (eg. Artifacts/WW plans appeared) { await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/dorf1.php?ok"); await Task.Delay(AccountHelper.Delay()); } //TODO: limit this for performance reasons? PostLoadTasks(acc); }
private async Task StartCelebration(Account acc, bool big) { var nodes = acc.Wb.Html.DocumentNode.Descendants("div").Where(x => x.HasClass("research")); var node = big ? nodes.LastOrDefault() : nodes.FirstOrDefault(); if (node == null) { return; } var button = node.Descendants("button").FirstOrDefault(); await DriverHelper.ExecuteScript(acc, $"document.getElementById('{button.Id}').click()"); }
public override async Task <TaskRes> Execute(Account acc) { var wb = acc.Wb.Driver; if (Vill == null) { Vill = AccountHelper.GetMainVillage(acc); } await base.Execute(acc); var building = TroopsHelper.GetTroopBuilding(troop, Great); if (!await VillageHelper.EnterBuilding(acc, Vill, building)) { return(TaskRes.Executed); } var troopNode = acc.Wb.Html.DocumentNode.Descendants("img").FirstOrDefault(x => x.HasClass("u" + (int)troop)); while (!troopNode.HasClass("details")) { troopNode = troopNode.ParentNode; } //finding the correct "Exchange resources" button var exchangeResButton = troopNode.Descendants("button").FirstOrDefault(x => x.HasClass("gold")); string script = $"document.getElementById('{exchangeResButton.GetAttributeValue("id", "")}').click()"; await DriverHelper.ExecuteScript(acc, script); var distribute = acc.Wb.Html.DocumentNode.SelectNodes("//*[text()[contains(., 'Distribute remaining resources.')]]")[0]; while (distribute.Name != "button") { distribute = distribute.ParentNode; } string distributeid = distribute.GetAttributeValue("id", ""); wb.ExecuteScript($"document.getElementById('{distributeid}').click()"); //Distribute resources button await Task.Delay(AccountHelper.Delay()); wb.ExecuteScript($"document.getElementById('npc_market_button').click()"); //Exchange resources button return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { var wb = acc.Wb.Driver; if (!await VillageHelper.EnterBuilding(acc, Vill, Classificator.BuildingEnum.Marketplace)) { return(TaskRes.Executed); } var npcMerchant = acc.Wb.Html.DocumentNode.Descendants("div").FirstOrDefault(x => x.HasClass("npcMerchant")); var npcButton = npcMerchant.Descendants("button").FirstOrDefault(x => x.HasClass("gold")); // Exchange resources button await DriverHelper.ClickById(acc, npcButton.Id); var resSum = Parser.RemoveNonNumeric(acc.Wb.Html.GetElementbyId("remain").InnerText); var targetRes = MarketHelper.NpcTargetResources(Vill, resSum); if (!Vill.Market.Npc.NpcIfOverflow && MarketHelper.NpcWillOverflow(Vill, targetRes)) { return(TaskRes.Executed); } for (int i = 0; i < 4; i++) { //await acc.Wb.Driver.FindElementById($"m2[{i}]").Write(targetRes[i]); switch (acc.AccInfo.ServerVersion) { case Classificator.ServerVersionEnum.T4_4: await DriverHelper.ExecuteScript(acc, $"document.getElementById('m2[{i}]').value='{targetRes[i]}'"); break; case Classificator.ServerVersionEnum.T4_5: await DriverHelper.ExecuteScript(acc, $"document.getElementsByName('desired{i}')[0].value='{targetRes[i]}'"); break; } } var submit = acc.Wb.Html.GetElementbyId("submitText"); var distribute = submit.Descendants("button").FirstOrDefault(); await DriverHelper.ExecuteScript(acc, $"document.getElementById('{distribute.Id}').click()"); wb.ExecuteScript($"document.getElementById('npc_market_button').click()"); //Exchange resources button return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { var wb = acc.Wb.Driver; await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/dorf2.php"); Random rnd = new Random(); int sec = rnd.Next(370, 380); TaskExecutor.AddTask(acc, new TTWarsGetRes() { ExecuteAt = DateTime.Now.AddSeconds(sec), Vill = AccountHelper.GetMainVillage(acc) }); TaskExecutor.AddTask(acc, new TrainExchangeRes() { ExecuteAt = DateTime.Now.AddSeconds(sec + 5), troop = acc.Villages[0].Troops.TroopToTrain ?? Classificator.TroopsEnum.Hero, Vill = Vill }); TaskExecutor.AddTask(acc, new TrainTroops() { ExecuteAt = DateTime.Now.AddSeconds(sec + 9), Troop = acc.Villages[0].Troops.TroopToTrain ?? Classificator.TroopsEnum.Hero, Vill = Vill, HighSpeedServer = true }); var script = "window.fireEvent('startPaymentWizard', {data:{activeTab: 'paymentFeatures'}});"; await DriverHelper.ExecuteScript(acc, script); script = "$$('.paymentWizardMenu').addClass('hide');$$('.buyGoldInfoStep').removeClass('active');$$('.buyGoldInfoStep#2').addClass('active');$$('.paymentWizardMenu#buyResources').removeClass('hide');"; await DriverHelper.ExecuteScript(acc, script); //gold prosButton buyResources6 //gold prosButton buyAnimal5 var buy = acc.Wb.Html.DocumentNode.Descendants("button").FirstOrDefault(x => x.HasClass("buyResources6")); if (buy == null) { acc.Wb.Log("Can't find the button with class buyResources6. Are you sure you are on vip/unl TTWars server?"); return(TaskRes.Executed); } var buyId = buy.GetAttributeValue("id", ""); wb.ExecuteScript($"document.getElementById('{buyId}').click()"); return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { var wb = acc.Wb.Driver; await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/build.php?tt=99&id=39"); // Show "Add raid" popup await DriverHelper.ExecuteScript(acc, $"Travian.Game.RaidList.addSlot({this.FarmListId},'','','rallyPoint');"); // Input coordinates await DriverHelper.WriteCoordinates(acc, Farm.Coords); // Input troops for (int i = 0; i < Farm.Troops.Length; i++) { if (Farm.Troops[i] == 0) { continue; } await DriverHelper.WriteById(acc, $"t{i + 1}", Farm.Troops[i]); } await Task.Delay(AccountHelper.Delay()); // Click "save" switch (acc.AccInfo.ServerVersion) { case Classificator.ServerVersionEnum.T4_4: wb.ExecuteScript("Travian.Game.RaidList.saveSlot(getSelectedListId(), $('edit_form').toQueryString().parseQueryString(), true);"); break; case Classificator.ServerVersionEnum.T4_5: await DriverHelper.ClickById(acc, "save"); break; } return(TaskRes.Executed); }
/// <summary> /// Tries to watch an Ad for +25% faster upgrade /// </summary> /// <param name="acc">Account</param> /// <returns>Whether bot watched the ad</returns> private async Task <bool> TryFastUpgrade(Account acc) { if (!await DriverHelper.ClickByClassName(acc, "videoFeatureButton green", false)) { return(false); } // Accept ads if (await DriverHelper.ClickByName(acc, "adSalesVideoInfoScreen", false)) { await DriverHelper.ExecuteScript(acc, "jQuery(window).trigger('showVideoWindowAfterInfoScreen')"); } // Has to be a legit "click" acc.Wb.Driver.FindElementById("videoFeature").Click(); var timeout = DateTime.Now.AddSeconds(100); do { await System.Threading.Tasks.Task.Delay(1000); if (timeout < DateTime.Now) { return(false); } }while (acc.Wb.Driver.Url.Contains("build.php")); // Don't show again acc.Wb.UpdateHtml(); if (acc.Wb.Html.GetElementbyId("dontShowThisAgain") != null) { await DriverHelper.ClickById(acc, "dontShowThisAgain"); await DriverHelper.ClickByClassName(acc, "dialogButtonOk ok"); } return(true); }
public override async Task <TaskRes> Execute(Account acc) { await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/build.php?tt=2&id=39"); TroopsCallback?.Invoke(acc, TroopsMovementParser.GetTroopsInRallyPoint(acc.Wb.Html)); // No troops selected to be sent from this village if (this.TroopsMovement.Troops.Sum() == 0) { return(TaskRes.Executed); } // Add number of troops to the input boxes for (int i = 0; i < TroopsMovement.Troops.Length; i++) { if (TroopsMovement.Troops[i] == 0) { continue; } switch (acc.AccInfo.ServerVersion) { case Classificator.ServerVersionEnum.T4_4: await DriverHelper.WriteByName(acc, $"t{i + 1}", TroopsMovement.Troops[i]); break; case Classificator.ServerVersionEnum.T4_5: await DriverHelper.WriteByName(acc, $"troops[0][t{i + 1}]", TroopsMovement.Troops[i]); break; } } // Select coordinates await DriverHelper.WriteCoordinates(acc, TroopsMovement.TargetCoordinates); //Select type of troop sending string script = $"Array.from(document.getElementsByName('c')).find(x=>x.value=={(int)TroopsMovement.MovementType}).checked=true;"; await DriverHelper.ExecuteScript(acc, script); //Click on "Send" button await DriverHelper.ClickById(acc, "btn_ok"); await Task.Delay(AccountHelper.Delay()); // Select catapult targets if (this.TroopsMovement.Target1 != Classificator.BuildingEnum.Site) { await DriverHelper.SelectIndexByName(acc, "ctar1", (int)this.TroopsMovement.Target1); } if (this.TroopsMovement.Target2 != Classificator.BuildingEnum.Site) { await DriverHelper.SelectIndexByName(acc, "ctar2", (int)this.TroopsMovement.Target2); } // Scout type if (this.TroopsMovement.ScoutType != ScoutEnum.None) { string scout = $"Array.from(document.getElementsByName('spy')).find(x=>x.value=={(int)TroopsMovement.ScoutType}).checked=true;"; await DriverHelper.ExecuteScript(acc, scout); } //Click on "Send" button await DriverHelper.ClickById(acc, "btn_ok"); return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { var wb = acc.Wb.Driver; await VersionHelper.Navigate(acc, "/hero.php?t=3", "/hero/adventures"); acc.Hero.Adventures = AdventureParser.GetAdventures(acc.Wb.Html, acc.AccInfo.ServerVersion); HeroHelper.UpdateHeroVillage(acc); if (acc.Hero.Adventures == null || acc.Hero.Adventures.Count == 0 || UpdateOnly) { return(TaskRes.Executed); } var adventures = acc.Hero.Adventures .Where(x => MapHelper.CalculateDistance(acc, x.Coordinates, HeroHelper.GetHeroHomeVillage(acc).Coordinates) <= acc.Hero.Settings.MaxDistance ) .ToList(); if (adventures.Count == 0) { return(TaskRes.Executed); } var adventure = adventures.FirstOrDefault(x => x.Difficulty == Classificator.DifficultyEnum.Normal); if (adventure == null) { adventure = adventures.FirstOrDefault(); } acc.Hero.NextHeroSend = DateTime.Now.AddSeconds(adventure.DurationSeconds * 2); switch (acc.AccInfo.ServerVersion) { case Classificator.ServerVersionEnum.T4_4: await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/{adventure.Ref}"); var startButton = acc.Wb.Html.GetElementbyId("start"); if (startButton == null) { //Hero is probably out of the village. this.NextExecute = DateTime.Now.AddMinutes(10); return(TaskRes.Executed); } wb.ExecuteScript("document.getElementById('start').click()"); break; case Classificator.ServerVersionEnum.T4_5: string script = $"var div = document.getElementById('{adventure.AdventureId}');"; script += $"div.children[0].submit();"; await DriverHelper.ExecuteScript(acc, script); // Check hero outgoing time var outTime = HeroParser.GetHeroArrival(acc.Wb.Html); // At least 1.5x longer (if hero has Large map) acc.Hero.NextHeroSend = DateTime.Now + TimeSpan.FromTicks((long)(outTime.Ticks * 1.5)); break; } return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { var wb = acc.Wb.Driver; await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/build.php?tt=99&id=39"); var flNode = GetFlNode(acc.Wb.Html, acc.AccInfo.ServerVersion); // If there is no rally point, switch to different village if (flNode == null) { var mainVill = AccountHelper.GetMainVillage(acc); if (mainVill == this.Vill) { return(TaskRes.Executed); // No gold account? } await VillageHelper.SwitchVillage(acc, mainVill.Id); flNode = GetFlNode(acc.Wb.Html, acc.AccInfo.ServerVersion); if (flNode == null) { return(TaskRes.Retry); } } if (acc.Farming.TrainTroopsAfterFL) // For TTWars servers { TaskExecutor.AddTask(acc, new TrainTroops() { ExecuteAt = DateTime.Now.AddSeconds(2), Troop = Vill.Troops.TroopToTrain ?? Classificator.TroopsEnum.Hero, Vill = this.Vill, HighSpeedServer = true }); } // If FL is collapsed, expand it if (acc.AccInfo.ServerVersion == ServerVersionEnum.T4_4 || flNode.Descendants("div").Any(x => x.HasClass("expandCollapse") && x.HasClass("collapsed"))) { await DriverHelper.ExecuteScript(acc, $"Travian.Game.RaidList.toggleList({this.FL.Id});"); // Update flNode! flNode = GetFlNode(acc.Wb.Html, acc.AccInfo.ServerVersion); } foreach (var farm in flNode.Descendants("tr").Where(x => x.HasClass("slotRow"))) { //iReport2 = yellow swords, iReport3 = red swords, iReport1 = successful raid var img = farm.ChildNodes.FirstOrDefault(x => x.HasClass("lastRaid"))?.Descendants("img"); //there has to be an image (we already have a report) and wrong raid style to not check this farmlist: if (img.Count() != 0 && ( //no image -> no recent attack (img.FirstOrDefault(x => x.HasClass("iReport3")) != null && this.FL.RaidStyle != RaidStyle.RaidLost) || //raid was lost and we don't have RaidLost raidstyle (img.FirstOrDefault(x => x.HasClass("iReport2")) != null && (this.FL.RaidStyle == RaidStyle.RaidSuccessful)) //some casualities, but we only attack on successful )) { continue; } var checkbox = farm.Descendants("input").FirstOrDefault(x => x.HasClass("markSlot")); await DriverHelper.CheckById(acc, checkbox.Id, true, update : false); } await Task.Delay(AccountHelper.Delay() * 2); switch (acc.AccInfo.ServerVersion) { case ServerVersionEnum.T4_4: var sendFlScript = $"document.getElementById('{flNode.Id}').childNodes[1].submit()"; wb.ExecuteScript(sendFlScript); break; case ServerVersionEnum.T4_5: var startRaid = flNode.Descendants("button").FirstOrDefault(x => x.HasClass("startButton")); acc.Wb.Driver.FindElementById(startRaid.Id).Click(); break; } acc.Wb.Log($"FarmList '{this.FL.Name}' was sent"); return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { building = TroopsHelper.GetTroopBuilding(Troop, Great); // Switch hero helmet. If hero will be switched, this TrainTroops task // will be executed right after the hero helmet switch if (HeroHelper.SwitchHelmet(acc, this.Vill, building, this)) { return(TaskRes.Executed); } await base.Execute(acc); if (!await VillageHelper.EnterBuilding(acc, Vill, building)) { return(TaskRes.Executed); } if (this.UpdateOnly || this.Troop == TroopsEnum.None) { return(TaskRes.Executed); } (TimeSpan dur, Resources cost) = TroopsParser.GetTrainCost(acc.Wb.Html, this.Troop); var troopNode = acc.Wb.Html.DocumentNode.Descendants("img").FirstOrDefault(x => x.HasClass("u" + (int)Troop)); if (troopNode == null) { acc.Wb.Log($"Bot tried to train {Troop} in {Vill.Name}, but couldn't find it in {building}! Are you sure you have {Troop} researched?"); return(TaskRes.Executed); } while (!troopNode.HasClass("details")) { troopNode = troopNode.ParentNode; } var inputName = troopNode.Descendants("input").FirstOrDefault().GetAttributeValue("name", ""); long maxNum = 0; switch (acc.AccInfo.ServerVersion) { case ServerVersionEnum.T4_4: maxNum = Parser.RemoveNonNumeric( troopNode.ChildNodes .FirstOrDefault(x => x.Name == "a")?.InnerText ?? "0" ); break; case ServerVersionEnum.T4_5: maxNum = Parser.RemoveNonNumeric( troopNode.ChildNodes .First(x => x.HasClass("cta")) .ChildNodes .First(x => x.Name == "a") .InnerText); break; } if (!HighSpeedServer) { var trainNum = TroopsHelper.TroopsToFill(acc, Vill, this.Troop, this.Great); // Don't train too many troops, just fill up the training building if (maxNum > trainNum) { maxNum = trainNum; } } if (maxNum < 0) { // We have already enough troops in training. return(TaskRes.Executed); } acc.Wb.Driver.ExecuteScript($"document.getElementsByName('{inputName}')[0].value='{maxNum}'"); await Task.Delay(100); await DriverHelper.ExecuteScript(acc, "document.getElementsByName('s1')[0].click()"); UpdateCurrentlyTraining(acc.Wb.Html, acc); if (!HighSpeedServer) { RepeatTrainingCycle(acc.Wb.Html, acc); } return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { var wb = acc.Wb.Driver; await acc.Wb.Navigate($"{acc.AccInfo.ServerUrl}/build.php?tt=2&id=39"); int[] troopsAtHome = TroopsMovementParser.GetTroopsInRallyPoint(acc.Wb.Html); for (int i = 0; i < 10; i++) { var troop = TroopsHelper.TroopFromInt(acc, i); if (TroopsHelper.IsTroopDefensive(troop)) { var upkeep = TroopSpeed.GetTroopUpkeep(troop); int sendAmount = troopsAtHome[i]; if (this.DeffAmount.DeffCount != null) { if (sendAmount * upkeep > this.DeffAmount.DeffCount) { // We have sent all needed deff sendAmount = (this.DeffAmount.DeffCount ?? 0) / upkeep; // Remove all other (linked) SendDeff bot tasks var list = new List <SendDeff> { this.NextDeffTask }; while (list.Last() != null) { list.Add(list.Last().NextDeffTask); } foreach (var task in list) { if (task == null) { continue; } acc.Tasks.Remove(task); } } else { this.DeffAmount.DeffCount -= sendAmount * upkeep; } } wb.ExecuteScript($"document.getElementsByName('t{i + 1 }')[0].value='{sendAmount}'"); } } //select coordinates wb.ExecuteScript($"document.getElementById('xCoordInput').value='{TargetVillage.x}'"); wb.ExecuteScript($"document.getElementById('yCoordInput').value='{TargetVillage.y}'"); await Task.Delay(AccountHelper.Delay()); //Select reinforcement string script = "var radio = document.getElementsByClassName(\"radio\");for(var i = 0; i < radio.length; i++){"; script += $"if(radio[i].value == '2') radio[i].checked = \"checked\"}}"; await DriverHelper.ExecuteScript(acc, script); await DriverHelper.ExecuteScript(acc, "document.getElementById('btn_ok').click()"); // Confirm wb.ExecuteScript($"document.getElementById('btn_ok').click()"); //Click send return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { var wb = acc.Wb.Driver; if (!await VillageHelper.EnterBuilding(acc, Vill, Classificator.BuildingEnum.Marketplace, "&t=0")) { return(TaskRes.Executed); } var npcMerchant = acc.Wb.Html.DocumentNode.Descendants("div").FirstOrDefault(x => x.HasClass("npcMerchant")); var npcButton = npcMerchant.Descendants("button").FirstOrDefault(x => x.HasClass("gold")); // Exchange resources button await DriverHelper.ClickById(acc, npcButton.Id); //wait npc form show var timeout = DateTime.Now.AddSeconds(100); HtmlNode remainRes = null; do { await Task.Delay(1000); remainRes = acc.Wb.Html.GetElementbyId("remain"); if (timeout < DateTime.Now) { acc.Wb.Log($"NPC in village {Vill.Name} is time out. Retry after 3 mins"); this.NextExecute = DateTime.Now.AddMinutes(3); return(TaskRes.Executed); } }while (remainRes == null); var resSum = Parser.RemoveNonNumeric(remainRes.InnerText); var targetRes = MarketHelper.NpcTargetResources(Vill, resSum); if (!Vill.Market.Npc.NpcIfOverflow && MarketHelper.NpcWillOverflow(Vill, targetRes)) { acc.Wb.Log($"NPC in village {Vill.Name} will be overflow. Stop NPC"); return(TaskRes.Executed); } for (int i = 0; i < 4; i++) { //await acc.Wb.Driver.FindElementById($"m2[{i}]").Write(targetRes[i]); switch (acc.AccInfo.ServerVersion) { case Classificator.ServerVersionEnum.T4_4: await DriverHelper.ExecuteScript(acc, $"document.getElementById('m2[{i}]').value='{targetRes[i]}'"); break; case Classificator.ServerVersionEnum.T4_5: await DriverHelper.ExecuteScript(acc, $"document.getElementsByName('desired{i}')[0].value='{targetRes[i]}'"); break; } } var submit = acc.Wb.Html.GetElementbyId("submitText"); var distribute = submit.Descendants("button").FirstOrDefault(); await DriverHelper.ClickById(acc, distribute.Id); await DriverHelper.ClickById(acc, "npc_market_button"); return(TaskRes.Executed); }
public override async Task <TaskRes> Execute(Account acc) { var url = $"{acc.AccInfo.ServerUrl}/build.php?id=39&tt=2"; if (SetCoordsInUrl) { url += "&z=" + MapHelper.KidFromCoordinates(TroopsMovement.TargetCoordinates, acc); } await acc.Wb.Navigate(url); var proceed = TroopsCallback?.Invoke(acc, TroopsMovementParser.GetTroopsInRallyPoint(acc.Wb.Html)); if (!(proceed ?? true)) { return(TaskRes.Retry); } // No troops selected to be sent from this village if (this.TroopsMovement.Troops.Sum() == 0) { return(TaskRes.Executed); } // Add number of troops to the input boxes for (int i = 0; i < TroopsMovement.Troops.Length; i++) { if (TroopsMovement.Troops[i] == 0) { continue; } switch (acc.AccInfo.ServerVersion) { case Classificator.ServerVersionEnum.T4_4: await DriverHelper.WriteByName(acc, $"t{i + 1}", TroopsMovement.Troops[i]); break; case Classificator.ServerVersionEnum.T4_5: await DriverHelper.WriteByName(acc, $"troops[0][t{i + 1}]", TroopsMovement.Troops[i]); break; } } // Select coordinates, if we haven't set them in the url already if (!SetCoordsInUrl) { await DriverHelper.WriteCoordinates(acc, TroopsMovement.TargetCoordinates); } //Select type of troop sending string script = $"Array.from(document.getElementsByName('c')).find(x=>x.value=={(int)TroopsMovement.MovementType}).checked=true;"; await DriverHelper.ExecuteScript(acc, script); //Click on "Send" button await DriverHelper.ClickById(acc, "btn_ok"); await Task.Delay(AccountHelper.Delay()); // Select catapult targets if (this.TroopsMovement.Target1 != Classificator.BuildingEnum.Site) { await DriverHelper.SelectIndexByName(acc, "ctar1", (int)this.TroopsMovement.Target1); } if (this.TroopsMovement.Target2 != Classificator.BuildingEnum.Site) { await DriverHelper.SelectIndexByName(acc, "ctar2", (int)this.TroopsMovement.Target2); } // Scout type if (this.TroopsMovement.ScoutType != ScoutEnum.None) { string scout = $"Array.from(document.getElementsByName('spy')).find(x=>x.value=={(int)TroopsMovement.ScoutType}).checked=true;"; await DriverHelper.ExecuteScript(acc, scout); } // Parse movement duration of the troops this.Arrival = TroopsMovementParser.GetMovementDuration(acc.Wb.Html); //Click on "Send" button await DriverHelper.ClickById(acc, "btn_ok"); acc.Wb.Log($"Bot sent troops from village {Vill.Name} to {this.TroopsMovement.TargetCoordinates}"); return(TaskRes.Executed); }
/// <summary> /// Tries to watch an Ad for +25% faster upgrade /// </summary> /// <param name="acc">Account</param> /// <returns>Whether bot watched the ad</returns> private async Task <bool> TryFastUpgrade(Account acc) { if (!await DriverHelper.ClickByClassName(acc, "videoFeatureButton green", false)) { return(false); } await System.Threading.Tasks.Task.Delay(AccountHelper.Delay()); // Confirm acc.Wb.UpdateHtml(); if (acc.Wb.Html.DocumentNode.SelectSingleNode("//input[@name='adSalesVideoInfoScreen']") != null) { await DriverHelper.ClickByName(acc, "adSalesVideoInfoScreen"); await System.Threading.Tasks.Task.Delay(AccountHelper.Delay()); await DriverHelper.ExecuteScript(acc, "jQuery(window).trigger('showVideoWindowAfterInfoScreen')"); await System.Threading.Tasks.Task.Delay(AccountHelper.Delay()); } // Has to be a legit "click" acc.Wb.Driver.FindElementById("videoFeature").Click(); // wait for finish watching ads var timeout = DateTime.Now.AddSeconds(100); do { await System.Threading.Tasks.Task.Delay(3000); //skip ads from Travian Games //they use ifarme to emebed ads video to their game acc.Wb.UpdateHtml(); if (acc.Wb.Html.GetElementbyId("videoArea") != null) { acc.Wb.Driver.SwitchTo().Frame(acc.Wb.Driver.FindElementById("videoArea")); // trick to skip await DriverHelper.ExecuteScript(acc, "var video = document.getElementsByTagName('video')[0];video.currentTime = video.duration - 1;", false, false); //back to first page acc.Wb.Driver.SwitchTo().DefaultContent(); } if (timeout < DateTime.Now) { return(false); } }while (acc.Wb.Driver.Url.Contains("build.php")); // Don't show again acc.Wb.UpdateHtml(); if (acc.Wb.Html.GetElementbyId("dontShowThisAgain") != null) { await DriverHelper.ClickById(acc, "dontShowThisAgain"); await System.Threading.Tasks.Task.Delay(AccountHelper.Delay()); await DriverHelper.ClickByClassName(acc, "dialogButtonOk ok"); } return(true); }