private static void UpdateCurrentlyBuilding(Account acc, Village vill)
        {
            vill.Build.CurrentlyBuilding.Clear();
            var cb = InfrastructureParser.CurrentlyBuilding(acc.Wb.Html, acc);

            if (cb == null)
            {
                return;             // Nothing is currently building
            }
            var bldJson = DriverHelper.GetJsObj <string>(acc, "JSON.stringify(bld);");

            if (string.IsNullOrEmpty(bldJson))
            {
                return;
            }
            var bldJs = JsonConvert.DeserializeObject <List <Bld> >(bldJson);

            // Combine data from two sources about currently building (JS object and HTML table)
            // We get time duration and level from HTML
            // and build location, level and building (type) from JSON
            for (int i = 0; i < cb.Count; i++)
            {
                cb[i].Building = bldJs[i].Building;
                cb[i].Location = bldJs[i].Location;
                cb[i].Level    = (byte)bldJs[i].Level;

                vill.Build.CurrentlyBuilding.Add(cb[i]);
            }
        }
Exemple #2
0
        /// <summary>
        /// Sends HTTP request to the server and gets number of animals inside the oasis
        /// </summary>
        public static int[] GetOasisAnimals(Account acc, Coordinates oasis)
        {
            var    htmlDoc = new HtmlAgilityPack.HtmlDocument();
            string html    = "";

            switch (acc.AccInfo.ServerVersion)
            {
            case Classificator.ServerVersionEnum.T4_4:
                var ajaxToken = DriverHelper.GetJsObj <string>(acc, "ajaxToken");

                var req = new RestSharp.RestRequest
                {
                    Resource = "/ajax.php?cmd=viewTileDetails",
                    Method   = Method.POST,
                };

                req.AddParameter("cmd", "viewTileDetails");
                req.AddParameter("x", oasis.x.ToString());
                req.AddParameter("y", oasis.y.ToString());
                req.AddParameter("ajaxToken", ajaxToken);

                var resString = HttpHelper.SendPostReq(acc, req);

                var root = JsonConvert.DeserializeObject <TileDetailsT4_4>(resString);
                if (root.response.error)
                {
                    throw new Exception("Unable to get T4.4 tile details!\n" + root.response.error);
                }

                html = WebUtility.HtmlDecode(root.response.data.html);
                break;

            case Classificator.ServerVersionEnum.T4_5:
                var bearerToken = DriverHelper.GetBearerToken(acc);

                var reqMapInfo = new RestSharp.RestRequest
                {
                    Resource      = "/api/v1/ajax/viewTileDetails",
                    Method        = Method.POST,
                    RequestFormat = DataFormat.Json
                };
                reqMapInfo.AddHeader("authorization", $"Bearer {bearerToken}");
                reqMapInfo.AddHeader("content-type", "application/json; charset=UTF-8");
                reqMapInfo.AddJsonBody(oasis);

                var tileDetails = HttpHelper.SendPostReq(acc, reqMapInfo);

                var tile = JsonConvert.DeserializeObject <TileDetailsT4_5>(tileDetails);
                html = WebUtility.HtmlDecode(tile.html);
                break;
            }

            htmlDoc.LoadHtml(html);
            return(TroopsParser.GetOasisAnimals(htmlDoc));
        }
Exemple #3
0
        /// <summary>

        /// Gets tasks that should be executed after loading a page
        /// </summary>
        /// <param name="acc">Account</param>
        /// <returns>List of tasks</returns>
        public static List <Action> GetPostLoadTasks(Account acc)
        {
            var html = acc.Wb.Html;

            var ran = new Random();

            //Web browser not initialized
            if (!UpdateAccountObject.UpdateVillages(html, acc))
            {
                return(new List <Action>());
            }

            //Didnt check version yet
            if (acc.AccInfo.ServerSpeed == 0 || acc.AccInfo.MapSize == 0)
            {
                return(new List <Action>());
            }

            var vill = acc.Villages.FirstOrDefault(x => x.Active);

            return(new List <Action>()
            {
                // 1: update info
                () => {
                    if (acc.Wb.CurrentUrl.Contains("dorf1"))
                    {
                        TaskExecutor.UpdateDorf1Info(acc);
                    }
                    else if (acc.Wb.CurrentUrl.Contains("dorf2"))
                    {
                        TaskExecutor.UpdateDorf2Info(acc);
                    }
                },
                // 2: get culture point
                () => acc.AccInfo.CulturePoints = RightBarParser.GetCulturePoints(html, acc.AccInfo.ServerVersion),
                // 3: Village expansion:
                () =>
                {
                    var villExpansionReady = acc.Villages.FirstOrDefault(x => x.Expansion.ExpansionAvailable);
                    if (acc.AccInfo.CulturePoints?.MaxVillages > acc.AccInfo.CulturePoints?.VillageCount &&
                        villExpansionReady != null)
                    {
                        villExpansionReady.Expansion.ExpansionAvailable = false;
                        TaskExecutor.AddTaskIfNotExists(acc, new SendSettlers()
                        {
                            ExecuteAt = DateTime.Now, Vill = villExpansionReady
                        });
                    }
                },
                // 4: claim Beginner Quests:
                () =>
                {
                    if (acc.AccInfo.ServerVersion == Classificator.ServerVersionEnum.T4_5 &&
                        acc.Wb.Html.GetElementbyId("sidebarBoxQuestmaster")?
                        .Descendants()?.FirstOrDefault(x => x.HasClass("newQuestSpeechBubble")) != null &&
                        acc.Wb.Html.GetElementbyId("mentorTaskList") == null &&
                        acc.Quests.ClaimBeginnerQuests)
                    {
                        TaskExecutor.AddTaskIfNotExists(acc, new ClaimBeginnerTask2021()
                        {
                            ExecuteAt = DateTime.Now
                        });
                        return;
                    }

                    acc.Quests.Quests = RightBarParser.GetBeginnerQuests(html, acc.AccInfo.ServerVersion);
                    var claimQuest = acc.Quests?.Quests?.FirstOrDefault(x => x.finished);
                    if (claimQuest != null &&
                        acc.Quests.ClaimBeginnerQuests
                        )
                    {
                        TaskExecutor.AddTaskIfNotExists(acc, new ClaimBeginnerTask()
                        {
                            ExecuteAt = DateTime.Now,
                            QuestToClaim = claimQuest,
                            Vill = VillageHelper.VillageFromId(acc, acc.Quests.VillToClaim)
                        });
                    }
                },
                // 5: claim Daily Quest:
                () =>
                {
                    if (acc.AccInfo.ServerVersion == Classificator.ServerVersionEnum.T4_5 &&
                        RightBarParser.CheckDailyQuest(html) &&
                        acc.Quests.ClaimDailyQuests)
                    {
                        TaskExecutor.AddTaskIfNotExists(acc, new ClaimDailyTask()
                        {
                            ExecuteAt = DateTime.Now,
                            Vill = VillageHelper.VillageFromId(acc, acc.Quests.VillToClaim)
                        });
                    }
                },
                // 6: Parse gold/silver
                () =>
                {
                    var goldSilver = RightBarParser.GetGoldAndSilver(html, acc.AccInfo.ServerVersion);
                    acc.AccInfo.Gold = goldSilver[0];
                    acc.AccInfo.Silver = goldSilver[1];
                },
                // 7: plus acconunt
                () => acc.AccInfo.PlusAccount = RightBarParser.HasPlusAccount(html, acc.AccInfo.ServerVersion),

                // 8: Check msgs:
                () =>
                {
                    if (MsgParser.UnreadMessages(html, acc.AccInfo.ServerVersion) > 0 &&
                        !acc.Wb.CurrentUrl.Contains("messages.php") &&
                        acc.Settings.AutoReadIgms)
                    {
                        TaskExecutor.AddTaskIfNotExists(acc, new ReadMessage()
                        {
                            ExecuteAt = DateTime.Now.AddSeconds(ran.Next(10, 600)), // Read msg in next 10-600 seconds
                            Priority = TaskPriority.Low
                        });
                    }
                },
                // 9: JS resources
                () => {
                    // TODO: cast directly from object to ResourcesJsObject, no de/serialization!
                    var resJson = DriverHelper.GetJsObj <string>(acc, "JSON.stringify(resources);");
                    var resJs = JsonConvert.DeserializeObject <ResourcesJsObject>(resJson);

                    vill.Res.Capacity.GranaryCapacity = resJs.maxStorage.l4;
                    vill.Res.Capacity.WarehouseCapacity = resJs.maxStorage.l1;

                    vill.Res.Stored.Resources = resJs.storage.GetResources();
                    vill.Res.Stored.LastRefresh = DateTime.Now;

                    vill.Res.Production = resJs.production.GetResources();
                    vill.Res.FreeCrop = resJs.production.l5;
                },
                // 10: Check if there are unfinished tasks
                () => ResSpendingHelper.CheckUnfinishedTasks(acc, vill),
                // 11: Donate to ally bonus
                () => DonateToAlly(acc, vill),
                // 12: increase next village refresh time
                () => VillageHelper.SetNextRefresh(acc, vill),
                // 13: NPC:
                () =>
                {
                    float ratio = (float)vill.Res.Stored.Resources.Crop / vill.Res.Capacity.GranaryCapacity;
                    if (0.99 <= ratio &&
                        3 <= acc.AccInfo.Gold &&
                        vill.Market.Npc.Enabled &&
                        (vill.Market.Npc.NpcIfOverflow || !MarketHelper.NpcWillOverflow(vill)))
                    {  //npc crop!
                        TaskExecutor.AddTaskIfNotExistInVillage(acc, vill, new NPC()
                        {
                            ExecuteAt = DateTime.MinValue,
                            Vill = vill
                        });
                    }
                },
                // 14: TTwars plus and boost
                () => {
                    if (acc.Settings.AutoActivateProductionBoost && CheckProductionBoost(acc))
                    {
                        TaskExecutor.AddTask(acc, new TTWarsPlusAndBoost()
                        {
                            ExecuteAt = DateTime.Now.AddSeconds(1)
                        });
                    }
                },
                // 15: Insta upgrade:
                () =>
                {
                    if (vill.Build.InstaBuild &&
                        acc.AccInfo.Gold >= 2 &&
                        vill.Build.CurrentlyBuilding.Count >= (acc.AccInfo.PlusAccount ? 2 : 1) &&
                        vill.Build.CurrentlyBuilding.LastOrDefault().Duration
                        >= DateTime.Now.AddMinutes(vill.Build.InstaBuildMinutes))
                    {
                        TaskExecutor.AddTaskIfNotExistInVillage(acc, vill, new InstaUpgrade()
                        {
                            Vill = vill,
                            ExecuteAt = DateTime.Now.AddHours(-1)
                        });
                    }
                },
                // 16: Adventure num
                () => acc.Hero.AdventureNum = HeroParser.GetAdventureNum(html, acc.AccInfo.ServerVersion),
                // 17: status of hero
                () => acc.Hero.Status = HeroParser.HeroStatus(html, acc.AccInfo.ServerVersion),
                // 18: health of hero
                () => acc.Hero.HeroInfo.Health = HeroParser.GetHeroHealth(html, acc.AccInfo.ServerVersion),
                // 19:  Hero:
                () =>
                {
                    bool heroReady = (acc.Hero.HeroInfo.Health > acc.Hero.Settings.MinHealth &&
                                      acc.Hero.Settings.AutoSendToAdventure &&
                                      acc.Hero.Status == Hero.StatusEnum.Home &&
                                      acc.Hero.NextHeroSend < DateTime.Now);

                    var homeVill = HeroHelper.GetHeroHomeVillage(acc);
                    // Update adventures
                    if (homeVill == null)
                    {
                        TaskExecutor.AddTask(acc, new HeroUpdateInfo()
                        {
                            ExecuteAt = DateTime.Now
                        });
                    }
                    else if (heroReady &&
                             (homeVill.Build.Buildings.Any(x => x.Type == Classificator.BuildingEnum.RallyPoint && 0 < x.Level)) &&
                             (acc.Hero.AdventureNum != acc.Hero.Adventures.Count() || HeroHelper.AdventureInRange(acc)))
                    {
                        // Update adventures
                        TaskExecutor.AddTaskIfNotExists(acc, new StartAdventure()
                        {
                            ExecuteAt = DateTime.Now.AddSeconds(10)
                        });
                    }
                    if (acc.Hero.AdventureNum == 0 && acc.Hero.Settings.BuyAdventures) //for UNL servers, buy adventures
                    {
                        TaskExecutor.AddTaskIfNotExists(acc, new TTWarsBuyAdventure()
                        {
                            ExecuteAt = DateTime.Now.AddSeconds(5)
                        });
                    }
                    if (acc.Hero.Status == Hero.StatusEnum.Dead && acc.Hero.Settings.AutoReviveHero) //if hero is dead, revive him
                    {
                        TaskExecutor.AddTaskIfNotExists(acc, new ReviveHero()
                        {
                            ExecuteAt = DateTime.Now.AddSeconds(5),
                            Vill = AccountHelper.GetHeroReviveVillage(acc)
                        });
                    }
                    if (HeroParser.LeveledUp(html, acc.AccInfo.ServerVersion) && acc.Hero.Settings.AutoSetPoints)
                    {
                        TaskExecutor.AddTaskIfNotExists(acc, new HeroSetPoints()
                        {
                            ExecuteAt = DateTime.Now
                        });
                    }
                },
                // 20: build more storage
                () => AutoExpandStorage(acc, vill),
                // 21: Extend protection
                () => {
                    if (acc.Settings.ExtendProtection &&
                        acc.Wb.Html.GetElementbyId("sidebarBoxInfobox").Descendants("button").Any(x => x.GetAttributeValue("value", "") == "Extend"))
                    {
                        // infoType_25 ?
                        TaskExecutor.AddTaskIfNotExists(acc, new ExtendProtection()
                        {
                            ExecuteAt = DateTime.Now
                        });
                    }
                }
            });
        }
Exemple #4
0
        /// <summary>
        /// Send raw HTTP request to the server and request the map tiles around the coords. This mimics browser on the map page.
        /// </summary>
        public static List <MapTile> GetMapTiles(Account acc, Coordinates coords)
        {
            switch (acc.AccInfo.ServerVersion)
            {
            case Classificator.ServerVersionEnum.T4_4:
                var ajaxToken = DriverHelper.GetJsObj <string>(acc, "ajaxToken");

                var req = new RestSharp.RestRequest
                {
                    Resource = "/ajax.php?cmd=mapPositionData",
                    Method   = Method.POST,
                };

                req.AddParameter("cmd", "mapPositionData");
                req.AddParameter("data[x]", coords.x.ToString());
                req.AddParameter("data[y]", coords.y.ToString());
                req.AddParameter("data[zoomLevel]", "3");
                req.AddParameter("ajaxToken", ajaxToken);

                var resString = HttpHelper.SendPostReq(acc, req);

                var root = JsonConvert.DeserializeObject <MapPositionDataT4_4.Root>(resString);
                if (root.response.error)
                {
                    throw new Exception("Unable to get T4.4 map position data!\n" + root.response.error);
                }
                return(root.response.data.tiles.Select(x => x.GetMapTile()).ToList());

            //case Classificator.ServerVersionEnum.T4_5:
            //{
            //    var bearerToken = DriverHelper.GetBearerToken(acc);

            //    var reqMapInfo = new RestSharp.RestRequest
            //    {
            //        Resource = "/api/v1/ajax/mapInfo",
            //        Method = Method.POST,
            //        RequestFormat = DataFormat.Json
            //    };
            //    reqMapInfo.AddHeader("authorization", $"Bearer {bearerToken}");
            //    reqMapInfo.AddHeader("content-type", "application/json; charset=UTF-8");
            //    reqMapInfo.AddJsonBody(GenerateMapInfo(coords));

            //    var mapInfoRes = HttpHelper.SendPostReq(acc, reqMapInfo);

            //    var mapPosition = new SendMapPositionT4_5.Root()
            //    {
            //        data = new SendMapPositionT4_5.Data()
            //        {
            //            x = coords.x,
            //            y = coords.y,
            //            zoomLevel = 3,
            //            ignorePositions = new List<object>()
            //        }
            //    };

            //    var reqMapPosition = new RestSharp.RestRequest
            //    {
            //        Resource = "/api/v1/ajax/mapPositionData",
            //        Method = Method.POST,
            //        RequestFormat = DataFormat.Json
            //    };
            //    reqMapPosition.AddHeader("authorization", $"Bearer {bearerToken}");
            //    reqMapPosition.AddHeader("content-type", "application/json; charset=UTF-8");
            //    reqMapPosition.AddJsonBody(mapPosition);

            //    var mapPositionRes = HttpHelper.SendPostReq(acc, reqMapPosition);
            //    var mapPositionData = JsonConvert.DeserializeObject<MapPositionDataT4_5>(mapPositionRes);
            //    return mapPositionData.tiles.Select(x => x.GetMapTile()).ToList();
            //}
            default:
            {
                var bearerToken = DriverHelper.GetBearerToken(acc);

                var reqMapInfo = new RestSharp.RestRequest
                {
                    Resource      = "/api/v1/map/info",
                    Method        = Method.POST,
                    RequestFormat = DataFormat.Json
                };
                reqMapInfo.AddHeader("authorization", $"Bearer {bearerToken}");
                reqMapInfo.AddHeader("content-type", "application/json; charset=UTF-8");
                reqMapInfo.AddJsonBody(GenerateMapInfo(coords));

                var mapInfoRes = HttpHelper.SendPostReq(acc, reqMapInfo);

                var mapPosition = new SendMapPositionT4_5.Root()
                {
                    data = new SendMapPositionT4_5.Data()
                    {
                        x               = coords.x,
                        y               = coords.y,
                        zoomLevel       = 3,
                        ignorePositions = new List <object>()
                    }
                };

                var reqMapPosition = new RestSharp.RestRequest
                {
                    Resource      = "/api/v1/map/position",
                    Method        = Method.POST,
                    RequestFormat = DataFormat.Json
                };
                reqMapPosition.AddHeader("authorization", $"Bearer {bearerToken}");
                reqMapPosition.AddHeader("content-type", "application/json; charset=UTF-8");
                reqMapPosition.AddJsonBody(mapPosition);

                var mapPositionRes  = HttpHelper.SendPostReq(acc, reqMapPosition);
                var mapPositionData = JsonConvert.DeserializeObject <MapPositionDataT4_5>(mapPositionRes);
                return(mapPositionData.tiles.Select(x => x.GetMapTile()).ToList());
            }
            }
        }