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); }
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); }
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); }
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")); }
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); }
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); } }
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); }
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); }
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); } }
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(); } }
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); }