public string Inject(OgamePageInfo info, string body, ResponseContainer response, string host, int port)
        {
            if (!response.RequestMessage.RequestUri.PathAndQuery.Contains("page=eventList"))
            {
                return(body);
            }

            var events = response.GetParsed <EventInfo>();


            var totalAttack    = TotalFor(events.Where(ei => ei.IsReturning && ei.MissionType == MissionType.Attack));
            var totalTransport = TotalFor(events.Where(ei => !ei.IsReturning && (ei.MissionType == MissionType.Transport || ei.MissionType == MissionType.Deployment)));

            StringBuilder repl = new StringBuilder();


            string wrapper = "<tr class='eventFleet'><td colspan=11>Total cargo from {0}: <span class='textBeefy friendly'>{1}</span></td></tr>";

            if (totalAttack.Total > 0)
            {
                repl.Append(string.Format(wrapper, "attacks", totalAttack));
            }
            if (totalTransport.Total > 0)
            {
                repl.Append(string.Format(wrapper, "transport", totalTransport));
            }

            if (repl.Length > 0)
            {
                body = body.Replace(@"<tbody>", $@"<tbody>{repl.ToString()}");
            }

            return(body);
        }
Exemplo n.º 2
0
        private Resources Attack(IEnumerable <EspionageReport> messages)
        {
            Progress = "Attacking";
            //Check if the planet wasn't changed in the meantime (ie. by user action), we'd be sending cargos for a long trip
            ResponseContainer resp = Client.IssueRequest(RequestBuilder.GetPage(PageType.Fleet, PlanetId));
            OgamePageInfo     info = resp.GetParsedSingle <OgamePageInfo>();

            Resources totalPlunder = new Resources();

            foreach (var farm in Strategy.GetTargets(messages))
            {
                Thread.Sleep(3000 + _sleepTime.Next(2000));
                totalPlunder += farm.ExpectedPlunder;
                Logger.Instance.Log(LogLevel.Info, $"Attacking planet {farm.Destination} to plunder {farm.ExpectedPlunder}");

                SendFleetCommand attack = new SendFleetCommand()
                {
                    Mission     = farm.Mission,
                    Destination = farm.Destination,
                    PlanetId    = PlanetId,
                    Fleet       = farm.Fleet
                };
                attack.Run();
            }

            return(totalPlunder);
        }
Exemplo n.º 3
0
        public string Inject(OgamePageInfo current, string body, ResponseContainer response, string host, int port)
        {
            if (current == null)
            {
                return(body);
            }

            _port = port;
            _host = host;

            StringBuilder sb = new StringBuilder("$1");


            sb.Append("<hr/>");
            sb.Append(InjectHelper.GenerateCommandLink("farm?cp=$2", "Farm"))
            .Append(" (")
            .Append(InjectHelper.GenerateCommandLink("farm?cp=$2&slots=0", "0 slots"))
            .Append(")")
            .Append(NewLine);

            sb.Append(InjectHelper.GenerateCommandLink("hunt?cp=$2", "Hunt"))
            .Append(", range: ")
            .Append(InjectHelper.GenerateCommandLink("hunt?cp=$2&range=100", "100"))
            .Append(" ")
            .Append(InjectHelper.GenerateCommandLink("hunt?cp=$2&range=40", "40"))
            .Append(" ")
            .Append(InjectHelper.GenerateCommandLink("hunt?cp=$2&range=20", "20"))
            .Append(NewLine);

            sb.Append("Transport All: ")
            .Append(InjectHelper.GenerateCommandLink($"transport?from=$2&to={current.PlanetId}", "From"))
            .Append(" / ")
            .Append(InjectHelper.GenerateCommandLink($"transport?from={current.PlanetId}&to=$2", "To"))
            .Append(NewLine);

            sb.Append("Fleetsave: ")
            .Append(InjectHelper.GenerateCommandLink($"fs?cp=$2&in=360", "6h"))
            .Append(" ")
            .Append(InjectHelper.GenerateCommandLink($"fs?cp=$2&in=390", "6.5h"))
            .Append(" ")
            .Append(InjectHelper.GenerateCommandLink($"fs?cp=$2&in=420", "7h"))
            .Append(" ")
            .Append(InjectHelper.GenerateCommandLink($"fs?cp=$2&in=450", "7.5h"))
            .Append(" ")
            .Append(InjectHelper.GenerateCommandLink($"fs?cp=$2&in=480", "8h"))
            .Append(NewLine);


            sb.Append(InjectHelper.GenerateCommandLink("expedition?cp=$2", "Expedition"));

            if (current.PlanetCoord.Type == CoordinateType.Moon)
            {
                sb.Append(NewLine);
                sb.Append(InjectHelper.GenerateCommandLink($"jump?from={current.PlanetId}&to=$2", "Gate Jump"));
            }

            body = submenuRegex.Replace(body, InjectHelper.EncodeTooltip(sb.ToString()));
            return(body);
        }
Exemplo n.º 4
0
        public override string Inject(string body, ResponseContainer response, string host, int port)
        {
            OgamePageInfo info = response.GetParsedSingle <OgamePageInfo>(false);

            foreach (IInject inject in _injects)
            {
                body = inject.Inject(info, body, response, host, port);
            }

            return(base.Inject(body, response, host, port));
        }
        public string Inject(OgamePageInfo info, string body, ResponseContainer response, string host, int port)
        {
            if (info?.Page != PageType.Fleet)
            {
                return(body);
            }

            int cargosNecessary = FleetComposition.ToTransport(response.GetParsedSingle <PlanetResources>().Resources).Ships[ShipType.LargeCargo];

            return(largeCargo.Replace(body, $@"$1<span onclick=""toggleMaxShips('#shipsChosen', 203,{cargosNecessary}); checkIntInput('#ship_203', 0, {cargosNecessary}); checkShips('shipsChosen'); event.stopPropagation(); return false;"" style='color: #aaa'>[{cargosNecessary}]</span> $2"));
        }
Exemplo n.º 6
0
        public string Inject(OgamePageInfo info, string body, ResponseContainer response, string host, int port)
        {
            if (info?.Page != null)
            {
                body = body.Replace(@"</body>", $@"<script type=""text/javascript"">
                                                        ogameUrl = 'http://{host}:{port}';
                                                        {ogbcmdFunction};
                                                        </script></body>");
            }

            body = body.Replace("no-commander", "");

            return(body);
        }
        public string Inject(OgamePageInfo info, string body, ResponseContainer response, string host, int port)
        {
            if (info == null || (info != null && info.Page != PageType.Facilities && info.Page != PageType.Resources))
            {
                return(body);
            }
            string replace = $@"<a style='filter: hue-rotate(90deg)' class='fastBuild tooltip js_hideTipOnMobile' title='Add to Build Queue' href='javascript:void(0)' onclick=""ogbcmd('build?cp={info.PlanetId}&id=$5')""></a>";

            body = regex.Replace(body, $@"$1$2{replace}$3$4");

            // hack to remove solar satellite
            body = body.Replace(replace.Replace("$5", "212"), string.Empty);

            return(body);
        }
Exemplo n.º 8
0
        protected override CommandQueueElement RunInternal()
        {
            using (Client.EnterPlanetExclusive(this))
            {
                // Make the initial request to get a token
                HttpRequestMessage req = Client.RequestBuilder.GetPage(PageType.Resources, PlanetId);
                ResponseContainer  res = AssistedIssue(req);

                OgamePageInfo info  = res.GetParsedSingle <OgamePageInfo>();
                string        token = info.OrderToken;

                // validate resources
                int currentBuildingLevel = res.GetParsed <DetectedBuilding>()
                                           .Where(b => b.Building == BuildingToBuild)
                                           .Select(b => b.Level)
                                           .FirstOrDefault();

                PlanetResources resources = res.GetParsedSingle <PlanetResources>();

                Resources cost = Building.Get(BuildingToBuild).Cost.ForLevel(currentBuildingLevel + 1);
                DetectedOngoingConstruction underConstruction = res.GetParsedSingle <DetectedOngoingConstruction>(false);

                if (underConstruction != null)
                {
                    Logger.Instance.Log(LogLevel.Debug, $"Building {underConstruction.Building} already under construction on planet {info.PlanetName}, will finish at {underConstruction.FinishingAt}");
                    return(Reschedule(underConstruction.FinishingAt));
                }
                else if (cost.Metal > resources.Resources.Metal || cost.Crystal > resources.Resources.Crystal || cost.Deuterium > resources.Resources.Deuterium)
                {
                    double maxTimeToGetEnoughResources = new double[] {
                        (cost.Metal - resources.Resources.Metal) / (resources.ProductionPerHour.Metal / 3600.0),
                        (cost.Crystal - resources.Resources.Crystal) / (resources.ProductionPerHour.Deuterium / 3600.0),
                        (cost.Deuterium - resources.Resources.Deuterium) / (resources.ProductionPerHour.Deuterium / 3600.0)
                    }.Max();
                    Logger.Instance.Log(LogLevel.Debug, $"Not enough resources! It would cost {cost} to build {BuildingToBuild} level {currentBuildingLevel + 1}, planet {info.PlanetName} only has {resources.Resources}; will have enough in {maxTimeToGetEnoughResources} seconds");
                    return(Reschedule(DateTimeOffset.Now.AddSeconds(maxTimeToGetEnoughResources)));
                }


                HttpRequestMessage buildReq = Client.RequestBuilder.GetBuildBuildingRequest(BuildingToBuild, token);
                AssistedIssue(buildReq);

                return(null);
            }
        }
Exemplo n.º 9
0
        public string Inject(OgamePageInfo info, string body, ResponseContainer response, string host, int port)
        {
            var matches = planetListElement.Matches(body);

            if (matches.Count == 0)
            {
                return(body);
            }

            Dictionary <int, string> caps = new Dictionary <int, string>();
            int firstIndex = -1;

            foreach (Match m in matches)
            {
                int cp = int.Parse(m.Groups[2].Value);
                if (firstIndex == -1)
                {
                    firstIndex = m.Index;
                }
                caps[cp] = m.Groups[1].Value;
            }
            body = planetListElement.Replace(body, "");

            StringBuilder sb = new StringBuilder();

            foreach (int cp in _planetOrder)
            {
                sb.Append(caps[cp]);
                caps.Remove(cp);
            }
            // Add any that aren't in the custom order setting

            foreach (var element in caps.Values)
            {
                sb.Append(element);
            }

            body = body.Insert(firstIndex, sb.ToString());



            return(body);
        }
Exemplo n.º 10
0
        public override IEnumerable <DataObject> ProcessInternal(ClientBase client, ResponseContainer container)
        {
            HtmlDocument       doc        = container.ResponseHtml.Value;
            HtmlNodeCollection metaFields = doc.DocumentNode.SelectNodes("/html/head/meta[@name and @content]");

            if (metaFields == null)
            {
                yield break;
            }

            OgamePageInfo res = new OgamePageInfo();

            // Meta info
            foreach (HtmlNode field in metaFields)
            {
                string key   = field.GetAttributeValue("name", string.Empty);
                string value = field.GetAttributeValue("content", string.Empty);

                res.Fields[key] = value;
            }

            // JS Vars
            // <script type="text/javascript">
            HtmlNodeCollection scriptBlocks = doc.DocumentNode.SelectNodes("//script[@type='text/javascript' and not(@src)]");

            if (scriptBlocks != null)
            {
                foreach (HtmlNode block in scriptBlocks)
                {
                    Match match = FleetTokenRegex.Match(block.InnerText);
                    if (!match.Success)
                    {
                        continue;
                    }

                    res.MiniFleetToken = match.Groups[1].Value;

                    break;
                }
            }

            yield return(res);
        }
        public string Inject(OgamePageInfo info, string body, ResponseContainer response, string host, int port)
        {
            if (info?.Page == null || (Auction?.MinutesRemaining ?? 0) == 0)
            {
                return(body);
            }


            string color;

            if (Auction.MinutesRemaining >= 20)
            {
                color = "color:#99CC00;";
            }
            else if (Auction.MinutesRemaining >= 10)
            {
                color = "color:#ffa500";
            }
            else if (Auction.MinutesRemaining == 5)
            {
                color = "color:#ff0000";
            }
            else
            {
                color = string.Empty;
            }

            StringBuilder tooltipBuilder = new StringBuilder($"<b>{Auction.Item}</b><br/><b>Bid:</b> {Auction.CurrentBid}<br/><b>Bidder:</b> {Auction.HighestBidderName}<hr/><b>Bid using: </b>");

            tooltipBuilder.Append(InjectHelper.GenerateCommandLink($"bid?cp={info.PlanetId}&resource=m", "Metal")).Append(' ')
            .Append(InjectHelper.GenerateCommandLink($"bid?cp={info.PlanetId}&resource=c", "Crystal")).Append(' ')
            .Append(InjectHelper.GenerateCommandLink($"bid?cp={info.PlanetId}&resource=d", "Deuterium"));

            string tooltip = InjectHelper.EncodeTooltip(tooltipBuilder.ToString());

            body = clockRegex.Replace(body, $"$1<li style='float:right'><a href='/game/index.php?page=traderOverview#animation=false&page=traderAuctioneer' class='tooltipClose' title='{tooltip}'>Auctioneer: <span style='{color};font-weight:bold;'>{Auction.MinutesRemaining}m</span></a></li>");
            return(body);
        }
Exemplo n.º 12
0
        public string Inject(OgamePageInfo info, string body, ResponseContainer response, string host, int port)
        {
            if (!response.RequestMessage.RequestUri.PathAndQuery.Contains("ogpe=1"))
            {
                return(body);
            }


            using (BotDb db = new BotDb())
            {
                IPlanetExclusiveOperation op = _client.CurrentPlanetExclusiveOperation?.Operation;
                // Disposed since check was made
                if (op == null)
                {
                    return(body);
                }

                Planet planet = db.Planets.Where(p => p.PlanetId == op.PlanetId).First();

                //
                body += $"<script type='text/javascript'>errorBoxNotify('Ongoing activity','There is an ongoing bot activity on planet {planet.Name} {planet.Coords} - {op.Name}: {op.Progress}! Cannot change planets right now.','OK');</script>";
                return(body);
            }
        }
Exemplo n.º 13
0
        public override void Run(List <DataObject> result)
        {
            OgamePageInfo current = result.OfType <OgamePageInfo>().FirstOrDefault();

            if (current == null)
            {
                return;
            }

            var playerPlanets = result.OfType <PlanetListItem>();

            PlanetResources resources = result.OfType <PlanetResources>().FirstOrDefault();
            var             buildings = result.OfType <DetectedBuilding>().ToDictionary(s => s.Building, s => s.Level);
            var             ships     = result.OfType <DetectedShip>().ToDictionary(s => s.Ship, s => s.Count);
            var             defences  = result.OfType <DetectedDefence>().ToDictionary(s => s.Building, s => s.Count);
            var             research  = result.OfType <DetectedResearch>().ToDictionary(s => s.Research, s => s.Level);

            using (BotDb db = new BotDb())
            {
                long[] locIds = playerPlanets.Select(s => s.Coordinate.Id).ToArray();
                Dictionary <long, Planet> existing = db.Planets.Where(s => locIds.Contains(s.LocationId)).ToDictionary(s => s.LocationId);

                if (!_isPlayerSeeded)
                {
                    if (!db.Players.Where(s => s.PlayerId == current.PlayerId).Any())
                    {
                        db.Players.Add(new Player()
                        {
                            PlayerId = current.PlayerId,
                            Name     = current.PlayerName,
                            Status   = PlayerStatus.None
                        });
                        db.SaveChanges();
                    }
                    _isPlayerSeeded = true;
                }


                foreach (var playerPlanet in playerPlanets)
                {
                    Planet item;

                    if (!existing.TryGetValue(playerPlanet.Coordinate.Id, out item))
                    {
                        item = new Planet()
                        {
                            Coordinate = playerPlanet.Coordinate,
                            Name       = playerPlanet.Name,
                            PlanetId   = playerPlanet.Id,
                            PlayerId   = current.PlayerId
                        };
                        db.Planets.Add(item);
                    }

                    if (resources.Coordinate.Id == playerPlanet.Coordinate.Id)
                    {
                        item.Resources = resources.Resources;
                    }

                    if (current.PlanetId == playerPlanet.Id)
                    {
                        if (ships.Count > 0)
                        {
                            item.Ships.FromPartialResult(ships);
                            item.Ships.LastUpdated = DateTimeOffset.UtcNow;
                        }
                        else if (defences.Count > 0)
                        {
                            item.Defences.FromPartialResult(defences);
                            item.Defences.LastUpdated = DateTimeOffset.UtcNow;
                        }
                        else if (buildings.Count > 0)
                        {
                            item.Buildings.FromPartialResult(buildings);
                            item.Buildings.LastUpdated = DateTimeOffset.UtcNow;
                        }
                        else if (research.Count > 0)
                        {
                            item.Player.Research.FromPartialResult(research);
                            item.Player.Research.LastUpdated = DateTimeOffset.UtcNow;
                        }
                    }
                    item.Name     = playerPlanet.Name;
                    item.PlayerId = current.PlayerId;
                    item.PlanetId = playerPlanet.Id;
                    db.SaveChanges();
                }
            }

            List <MessageBase> messages = result.OfType <MessageBase>().ToList();

            if (!messages.Any())
            {
                return;
            }

            int[] messageIds = messages.Select(s => s.MessageId).ToArray();

            using (BotDb db = new BotDb())
            {
                HashSet <int> existing = db.Messages.Where(s => messageIds.Contains(s.MessageId)).Select(s => s.MessageId).ToHashset();

                foreach (MessageBase message in messages.Where(s => !existing.Contains(s.MessageId)))
                {
                    db.Messages.Add(new Message
                    {
                        MessageId = message.MessageId,
                        Body      = message,
                        TabType   = message.TabType
                    });
                }

                db.SaveChanges();
            }
        }
Exemplo n.º 14
0
        public override IEnumerable <DataObject> ProcessInternal(ClientBase client, ResponseContainer container)
        {
            HtmlDocument       doc        = container.ResponseHtml.Value;
            HtmlNodeCollection metaFields = doc.DocumentNode.SelectNodes("/html/head/meta[@name and @content]");

            if (metaFields == null)
            {
                yield break;
            }

            OgamePageInfo res = new OgamePageInfo();

            // Meta info
            foreach (HtmlNode field in metaFields)
            {
                string key   = field.GetAttributeValue("name", string.Empty);
                string value = field.GetAttributeValue("content", string.Empty);

                res.Fields[key] = value;
            }

            // Page info: make use of the implicit Page <-> PageType casts to find the matching link
            NameValueCollection query = HttpUtility.ParseQueryString(container.RequestMessage.RequestUri.Query);

            if (query["page"] != null)
            {
                IEnumerable <Page> pages = Page.All(); //will this work or cause an exception?
                try
                {
                    res.Page = pages.Where(s => s.Link == query["page"]).FirstOrDefault();
                }
                catch (KeyNotFoundException)
                {
                    Logger.Instance.Log(LogLevel.Error, $"Page {query["page"]} could not be identified, {nameof(PageType)} missing.");
                }
            }

            // JS Vars
            // <script type="text/javascript">
            HtmlNodeCollection scriptBlocks = doc.DocumentNode.SelectNodes("//script[@type='text/javascript' and not(@src)]");

            if (scriptBlocks != null)
            {
                foreach (HtmlNode block in scriptBlocks)
                {
                    Match match = FleetTokenRegex.Match(block.InnerText);
                    if (!match.Success)
                    {
                        continue;
                    }

                    res.MiniFleetToken = match.Groups[1].Value;

                    break;
                }
            }

            HtmlNode token = doc.DocumentNode.SelectSingleNode("//input[@type='hidden' and @name='token']");

            if (token != null)
            {
                res.OrderToken = token.GetAttributeValue("value", string.Empty);
            }

            yield return(res);
        }