Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        //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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        /// <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);
        }
Ejemplo n.º 7
0
        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()");
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        /// <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);
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
        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);
        }
Ejemplo n.º 15
0
        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);
        }
Ejemplo n.º 16
0
        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);
        }
Ejemplo n.º 17
0
        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);
        }
Ejemplo n.º 18
0
        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);
        }
Ejemplo n.º 19
0
        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);
        }
Ejemplo n.º 20
0
        /// <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);
        }