/// <inheritdoc /> public SingularValueDecomposition(SystemCoordinate srcListCord, SystemCoordinate destListCord) : base(srcListCord, destListCord) { SourceSystemCoordinates = srcListCord; DestinationSystemCoordinates = destListCord; var countPoints = SourceSystemCoordinates.List.Count; var srcMatrix = SourceSystemCoordinates.Matrix; var dstMatrix = DestinationSystemCoordinates.Matrix; var eMatrix = CreateEMatrix(); var cMatrix = dstMatrix.Transpose() * eMatrix * srcMatrix; var svd = cMatrix.Svd(); var rotMatrix = (svd.U * svd.VT).Transpose(); // rotation matrix var trace1 = cMatrix.Multiply(rotMatrix).Diagonal().Sum(); var trace2 = (srcMatrix.Transpose() * eMatrix * srcMatrix).Diagonal().Sum(); var scale = trace1 / trace2; // reverse Helmert transformation var dMatrixInterim = scale * (srcMatrix * rotMatrix); var deltaMatrix = (1d / countPoints * (dstMatrix - dMatrixInterim)).Transpose(); var finalTVector = deltaMatrix.RowSums(); DeltaCoordinateMatrix = new DeltaCoordinateMatrix(finalTVector); RotationMatrix = new RotationMatrix(rotMatrix.Transpose(), false); M = scale - 1d; }
/// <inheritdoc /> public NewtonIterationProcess(SystemCoordinate source, SystemCoordinate destination) : base(source, destination) { if (source.List.Count <= MinListCount) { throw new ArgumentException("source list count cannot be less when 3"); } if (destination.List.Count <= MinListCount) { throw new ArgumentException("source list count cannot be less when 3"); } SourceSystemCoordinates = source; DestinationSystemCoordinates = destination; var aMatrix = FormingAMatrix(); var yMatrix = FormingYMatrix(); var paramsTransformMatrix = GetMatrixWithTransformParameters(aMatrix, yMatrix); var vMatrix = GetVMatrix(aMatrix, yMatrix, paramsTransformMatrix); var fCoefficient = CalculateFCoefficient(vMatrix); var mCoefficient = CalculateMCoefficient(fCoefficient); var qMatrix = GetQMatrix(aMatrix); var mceMatrix = GetMeanSquareErrorsMatrix(qMatrix, mCoefficient); IVectorParameters helper = new NIPVecParams(paramsTransformMatrix.Column(0)); RotationMatrix = helper.RotationMatrix; DeltaCoordinateMatrix = helper.DeltaCoordinateMatrix; M = helper.ScaleFactor; MeanSquareErrorsMatrix = mceMatrix; }
/// <summary> /// Transform from sc1 to sc2 with one parameters, but many source and destination lists. /// </summary> /// <exception cref="ArgumentException">Throw then you instantiate class with coordinates, /// and call method with transformation by coordinate</exception> public List <Point> FromSourceToDestinationBySystemsCoordinate(SystemCoordinate sc1, SystemCoordinate sc2) { if (_isTranformsByCoordinates) { throw new ArgumentException(); } return(Transform(sc1, sc2, _deltaCoordinate, _rotationMatrix, _m)); }
public HttpRequestMessage GetGalaxyContent(SystemCoordinate system) { return(_client.BuildPost(new Uri("/game/index.php?page=galaxyContent&ajax=1", UriKind.Relative), new[] { KeyValuePair.Create("galaxy", system.Galaxy.ToString()), KeyValuePair.Create("system", system.System.ToString()) })); }
public static int Compare(SystemCoordinate x, SystemCoordinate y) { if (x.Galaxy != y.Galaxy) { return(x.Galaxy.CompareTo(y.Galaxy)); } return(x.System.CompareTo(y.System)); }
public ScanCommand() { if (To < From) { var tmp = From; From = To; To = tmp; } }
private void CalculateParameters(object sender, RoutedEventArgs e) { if (_sourcePoints.Count == 0) { MessageBox.Show("Список исходных координат не может быть меньше 0", "Ошибка выполнения", MessageBoxButton.OK, MessageBoxImage.Error); return; } if (_destinationPoints.Count == 0) { MessageBox.Show("Список конечных координат не может быть меньше 0", "Ошибка выполнения", MessageBoxButton.OK, MessageBoxImage.Error); return; } var srcSc = new SystemCoordinate(_sourcePoints); var dstSc = new SystemCoordinate(_destinationPoints); var nip = new NewtonIterationProcess(srcSc, dstSc); NipParams.ItemsSource = FillParamsList(nip); var a9 = new NineAffine(srcSc, dstSc); A9Params.ItemsSource = FillParamsList(a9); var lp = new LinearProcedure(srcSc, dstSc); LpParams.ItemsSource = FillParamsList(lp); var svd = new SingularValueDecomposition(srcSc, dstSc); SvdParams.ItemsSource = FillParamsList(svd); var nipHelmert = new Helmert(srcSc).FromSourceToDestinationByParameters(nip.DeltaCoordinateMatrix, nip.RotationMatrix, nip.M).GetSubtractList(dstSc); NipDataGrid.ItemsSource = RoundList(nipHelmert); var a9Helmert = new Helmert(srcSc).FromSourceToDestinationByParameters(a9.DeltaCoordinateMatrix, a9.RotationMatrix, a9.M).GetSubtractList(dstSc); A9DataGrid.ItemsSource = RoundList(a9Helmert); var lpHelmert = new Helmert(srcSc).FromSourceToDestinationByParameters(lp.DeltaCoordinateMatrix, lp.RotationMatrix, lp.M).GetSubtractList(dstSc); LinearDataGrid.ItemsSource = RoundList(lpHelmert); var svdHelmert = new Helmert(srcSc).FromSourceToDestinationByParameters(svd.DeltaCoordinateMatrix, svd.RotationMatrix, svd.M).GetSubtractList(dstSc); SvdDataGrid.ItemsSource = RoundList(svdHelmert); }
/// <inheritdoc /> public NineAffine(SystemCoordinate srcListCord, SystemCoordinate destListCord) : base(srcListCord, destListCord) { SourceSystemCoordinates = srcListCord; DestinationSystemCoordinates = destListCord; var dxVector = Iteration(); IVectorParameters helper = new A9VecParams(dxVector); RotationMatrix = helper.RotationMatrix; DeltaCoordinateMatrix = helper.DeltaCoordinateMatrix; M = helper.ScaleFactor; }
public ScannerJob(OGameClient client, SystemCoordinate from, SystemCoordinate to) { _client = client; _from = from; _to = to; if (_to < _from) { _from = to; _to = from; } ExecutionInterval = TimeSpan.FromMinutes(15); }
protected void FillListsCoordinationData(string path, out SystemCoordinate listSrc, out SystemCoordinate listDest) { var srcMatrix = ReadControlDataFromFile(path + "\\testpoints_src.txt", 10, 3); var dstMatrix = ReadControlDataFromFile(path + "\\testpoints_dest.txt", 10, 3); var listSrc1 = new List <Point>(); var listDst1 = new List <Point>(); for (int row = 0; row < srcMatrix.RowCount; row++) { listSrc1.Add(new Point(srcMatrix[row, 0], srcMatrix[row, 1], srcMatrix[row, 2])); listDst1.Add(new Point(dstMatrix[row, 0], dstMatrix[row, 1], dstMatrix[row, 2])); } listSrc = new SystemCoordinate(listSrc1); listDest = new SystemCoordinate(listDst1); }
public IEnumerable <Planet> GetFarms(SystemCoordinate from, SystemCoordinate to) { using (BotDb db = new BotDb()) { var farms = db.Planets.Where(s => s.LocationId >= from.LowerCoordinate && s.LocationId <= to.UpperCoordinate && (s.Player.Status.HasFlag(PlayerStatus.Inactive) || s.Player.Status.HasFlag(PlayerStatus.LongInactive)) && !s.Player.Status.HasFlag(PlayerStatus.Vacation) && !s.Player.Status.HasFlag(PlayerStatus.Admin) && s.Player.Ranking < MinimumRanking && (s.Buildings.LastUpdated == null || s.Buildings.MetalStorage + s.Buildings.CrystalStorage + s.Buildings.DeuteriumTank > MinimumTotalStorageLevel) ).ToList(); return(farms); } }
protected override CommandQueueElement RunInternal() { // Get existing scan infoes Dictionary <int, GalaxyScan> existing; using (BotDb db = new BotDb()) { existing = db.Scans.Where(s => From.Id <= s.LocationId && s.LocationId <= To.Id).ToDictionary(s => s.LocationId); } int count = (To.Galaxy - From.Galaxy + 1) * (To.System - From.System + 1); Logger.Instance.Log(LogLevel.Info, $"Scanning between {From} and {To}: {count} systems"); for (byte gal = From.Galaxy; gal <= To.Galaxy; gal++) { short sFrom = gal == From.Galaxy ? From.System : (short)0; short sTo = gal == To.Galaxy ? To.System : Client.Settings.Systems; for (short sys = sFrom; sys <= sTo; sys++) { SystemCoordinate coord = new SystemCoordinate(gal, sys); GalaxyScan exists; if (existing.TryGetValue(coord, out exists)) { if (DateTimeOffset.Now - exists.LastScan < RescanInterval && exists.LastScan.Date == DateTimeOffset.Now.Date) { // Ignore continue; } } // Scan HttpRequestMessage req = Client.RequestBuilder.GetGalaxyContent(coord); Client.IssueRequest(req); if (--count % 10 == 0 && count > 0) { Logger.Instance.Log(LogLevel.Info, $"{count} systems remaining to scan..."); } } } return(null); }
private FleetSaveTarget CandidateFromGalaxy(BotDb db, Coordinate here, int fleetSpeed) { SystemCoordinate hereSystem = here; FleetSaveTarget best = null; for (int speed = 1; speed <= 10 && best == null; speed++) { for (short range = 1; range <= 100 && best == null; range++) { short systemCoordLeft = (short)(hereSystem.System - range); short systemCoordRight = (short)(hereSystem.System + range); if (systemCoordLeft <= 0) { systemCoordLeft = 0; } else if (systemCoordRight >= 499) { systemCoordRight = systemCoordLeft; } SystemCoordinate systemLeft = new SystemCoordinate(hereSystem.Galaxy, systemCoordLeft); SystemCoordinate systemRight = new SystemCoordinate(hereSystem.Galaxy, systemCoordRight); var duration = here.DurationTo(systemRight.LowerCoordinate, fleetSpeed, speed, OGameClient.Instance.Settings.Speed); if (GetDifference(duration, _oneWayTrip) > AcceptableWindow) { continue; } var targets = db.Planets .Where(p => (p.LocationId >= systemLeft.LowerCoordinate && p.LocationId <= systemLeft.UpperCoordinate) || (p.LocationId >= systemRight.LowerCoordinate && p.LocationId <= systemRight.UpperCoordinate)) .Select(p => p.LocationId) .AsEnumerable() .Select(target => new FleetSaveTarget { Target = target, Duration = duration, Speed = speed }); best = FilterDebrisAvailable(targets).FirstOrDefault(); } } return(best); }
private FleetSaveTarget CandidateFromSystem(BotDb db, Coordinate here, int fleetSpeed) { SystemCoordinate hereSystem = here; Coordinate herePlanet = Coordinate.Create(here, CoordinateType.Planet); Coordinate hereMoon = Coordinate.Create(here, CoordinateType.Moon); var currentSystemPlanets = db.Planets.Where(p => p.LocationId >= hereSystem.LowerCoordinate && p.LocationId <= hereSystem.UpperCoordinate && p.LocationId != herePlanet.Id && p.LocationId != hereMoon.Id) .Select(p => p.LocationId) .AsEnumerable(); IEnumerable <FleetSaveTarget> candidates = currentSystemPlanets.Cartesian(Enumerable.Range(1, 10), (target, speed) => new FleetSaveTarget { Target = target, Duration = here.DurationTo(target, fleetSpeed, speed, Client.Settings.Speed), Speed = speed }); return(FilterDebrisAvailable(FilterTime(candidates)).FirstOrDefault()); }
private List <Point> Transform(SystemCoordinate sc1, SystemCoordinate sc2, DeltaCoordinateMatrix coordinateMatrix, RotationMatrix rotationMatrix, double scale) { var interList = new List <Point>(sc1.List.Count); var rotWithM = scale * rotationMatrix.Matrix; var destVector = Vector <double> .Build.Dense(3); for (int row = 0; row < sc2.List.Count; row++) { destVector[0] = sc1.List[row].X; destVector[1] = sc1.List[row].Y; destVector[2] = sc1.List[row].Z; var interVector = rotWithM * destVector + coordinateMatrix.Vector; interList.Add(new Point(interVector[0], interVector[1], interVector[2])); } return(interList); }
/// <inheritdoc /> public LinearProcedure(SystemCoordinate srcListCord, SystemCoordinate destListCord) : base(srcListCord, destListCord) { SourceSystemCoordinates = srcListCord; DestinationSystemCoordinates = destListCord; var qMatrix = FormingQMatrix(); var lxVector = FormingLxVector(); var lyVector = FormingLyVector(); var lzVector = FormingLzVector(); var dxVector = CalculateDVectors(qMatrix, lxVector); var dyVector = CalculateDVectors(qMatrix, lyVector); var dzVector = CalculateDVectors(qMatrix, lzVector); IVectorParameters helper = new LPVecParams(dxVector, dyVector, dzVector); RotationMatrix = helper.RotationMatrix; DeltaCoordinateMatrix = helper.DeltaCoordinateMatrix; M = helper.ScaleFactor; }
public IEnumerable <Planet> GetFarms(SystemCoordinate from, SystemCoordinate to) { using (BotDb db = new BotDb()) { var farms = db.Planets.Where(s => s.LocationId >= from.LowerCoordinate && s.LocationId <= to.UpperCoordinate && !((s.Player.Status.HasFlag(PlayerStatus.Inactive) || s.Player.Status.HasFlag(PlayerStatus.LongInactive))) && !s.Player.Status.HasFlag(PlayerStatus.Vacation) && !s.Player.Status.HasFlag(PlayerStatus.Admin) && !s.Player.Status.HasFlag(PlayerStatus.Noob) && (!s.Player.Status.HasFlag(PlayerStatus.Strong) || s.Player.Status.HasFlag(PlayerStatus.Outlaw)) && (s.Player.Ranking >= MaxRanking && s.Player.Ranking <= MinRanking) && (!MoonsOnly || ((s.LocationId & 0xFF) == (int)CoordinateType.Moon)) // Either it's the first time we're scanning this target, and we've never learned its technologies // or their espionage technology is no higher than one than our own //&& (s.LastResourcesTime == null || (s.Player.Research.EspionageTechnology ?? 99) <= EspionageTechnologyLevel + 1) ).ToList(); return(farms); } }
protected override void RunInternal() { // Get existing scan infoes Dictionary <int, GalaxyScan> existing; using (BotDb db = new BotDb()) { int from = _from; int to = _to; existing = db.Scans.Where(s => from <= s.LocationId && s.LocationId <= to).ToDictionary(s => s.LocationId); } for (byte gal = _from.Galaxy; gal <= _to.Galaxy; gal++) { short sFrom = gal == _from.Galaxy ? _from.System : (short)0; short sTo = gal == _to.Galaxy ? _to.System : _client.Settings.Systems; for (short sys = sFrom; sys <= sTo; sys++) { SystemCoordinate coord = new SystemCoordinate(gal, sys); GalaxyScan exists; if (existing.TryGetValue(coord, out exists)) { if (DateTimeOffset.Now - exists.LastScan < RescanInterval) { // Ignore continue; } } // Scan HttpRequestMessage req = _client.RequestBuilder.GetGalaxyContent(coord); _client.IssueRequest(req); } } }
protected override CommandQueueElement RunInternal() { var req = Client.RequestBuilder.GetPage(PageType.Galaxy, PlanetId); var resp = Client.IssueRequest(req); var source = resp.GetParsedSingle <OgamePageInfo>(); // Start scanner _from = source.PlanetCoord; _from.System = (short)Math.Max(_from.System - Range, 1); _to = source.PlanetCoord; _to.System = (short)Math.Min(_to.System + Range, 499); var scanner = new ScanCommand() { PlanetId = PlanetId, From = _from, To = _to }; scanner.Run(); return(Farm()); }
public SystemCoordinate ReadSystemCoordinate() { return(SystemCoordinate.FromStream(this)); }
/// <inheritdoc cref="Helmert"/> /// <remarks> /// By this constructor you can create one instance with systems coordinate and transform /// with different parameters /// </remarks> /// <param name="sc1">Source system coordinate</param> /// <param name="sc2">Destination system coordinate</param> public Helmert(SystemCoordinate sc1, SystemCoordinate sc2) { _sourceSystemCoordinate = sc1; _destinationSystemCoordinate = sc2; _isTranformsByCoordinates = true; }
public static SystemCoordinate Create(SystemCoordinate baseSystemCoordinate, short system) { return(new SystemCoordinate(baseSystemCoordinate.Galaxy, system)); }
public static void Main(string[] args) { if (!File.Exists("config.json")) { Console.WriteLine("Please copy config.template.json to config.json and fill it out"); return; } Config config = JsonConvert.DeserializeObject <Config>(File.ReadAllText("config.json")); Logger.Instance.Log(LogLevel.Info, $"Loaded settings, user: {config.Username}, server: {config.Server}"); // Setup OGameStringProvider stringProvider = OGameStringProvider.Load(@"Resources\strings-en.json"); CultureInfo clientServerCulture = CultureInfo.GetCultureInfo("da-DK"); // Processing OGameClient client = new OGameClient(config.Server, stringProvider, config.Username, config.Password); client.Settings.ServerUtcOffset = TimeSpan.FromHours(1); client.Settings.Galaxies = 8; client.Settings.Systems = 499; client.ServerCulture = clientServerCulture; Logger.Instance.Log(LogLevel.Debug, "Prepared OGameClient"); // Savers client.RegisterSaver(new GalaxyPageSaver()); client.RegisterSaver(new EspionageReportSaver()); client.RegisterSaver(new GalaxyPageDebrisSaver()); client.RegisterSaver(new MessageSaver()); // UA stuff client.RegisterDefaultHeader("Accept-Language", "en-GB,en;q=0.8,da;q=0.6"); client.RegisterDefaultHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); client.RegisterDefaultHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"); Logger.Instance.Log(LogLevel.Debug, "Prepared user agent"); // Show details foreach (IInterventionHandler item in client.GetIntervention()) { Logger.Instance.Log(LogLevel.Info, $"Loaded Intervention Handler: {item.GetType().FullName}"); } foreach (BaseParser item in client.GetParsers()) { Logger.Instance.Log(LogLevel.Info, $"Loaded Parser: {item.GetType().FullName}"); } foreach (SaverBase item in client.GetSavers()) { Logger.Instance.Log(LogLevel.Info, $"Loaded Saver: {item.GetType().FullName}"); } // Start proxy OgameClientProxy proxy = new OgameClientProxy("127.0.0.1", 9400, client); proxy.SubstituteRoot = new Uri($"https://{config.Server}"); proxy.Start(); Logger.Instance.Log(LogLevel.Warning, $"Prepared reverse proxy, visit: {proxy.ListenPrefix}"); // Kick-off client.PerformLogin(); // Example job ApiImporterJob job1 = new ApiImporterJob(client, new DirectoryInfo("temp")); job1.Start(); MessageReaderJob job2 = new MessageReaderJob(client); job2.Start(); SessionKeepAliveJob job3 = new SessionKeepAliveJob(client); job3.Start(); // Farming bot FarmingBot bot = new FarmingBot(client, SystemCoordinate.Create(6, 60), SystemCoordinate.Create(6, 100)); bot.Start(); // Work Console.ReadLine(); }
public bool Equals(SystemCoordinate other) { return(Galaxy == other.Galaxy && System == other.System); }
private void Scan(SystemCoordinate coord) { _client.IssueRequest(_client.RequestBuilder.GetGalaxyContent(coord)); }
public FarmingBot(OGameClient client, SystemCoordinate startSystem, SystemCoordinate endSystem) { _client = client; _startSystem = startSystem; _endSystem = endSystem; }
public void WriteSystemCoordinate(SystemCoordinate coordinate) { coordinate.WriteTo(this); }
public override IEnumerable <DataObject> ProcessInternal(ClientBase client, ResponseContainer container) { HtmlDocument doc = container.ResponseHtml.Value; HtmlNode tableNode = doc.DocumentNode.SelectSingleNode("//table[@id='galaxytable']"); HtmlNodeCollection rows = tableNode?.SelectNodes("./tbody/tr"); if (rows == null) { yield break; } int galaxy = tableNode.GetAttributeValue("data-galaxy", 0); int system = tableNode.GetAttributeValue("data-system", 0); SystemCoordinate systemCoordinate = new SystemCoordinate((byte)galaxy, (short)system); GalaxyPageSystem systemResult = new GalaxyPageSystem(); systemResult.System = systemCoordinate; foreach (HtmlNode row in rows) { string positionText = row.SelectSingleNode("./td[contains(@class, 'position')]").InnerText; byte position = byte.Parse(positionText, NumberStyles.Integer, client.ServerCulture); HtmlNodeCollection linkNodesWithOnClick = row.SelectNodes(".//a[@onclick]"); HtmlNode planetNode = row.SelectSingleNode("./td[@data-planet-id]"); HtmlNode moonNode = row.SelectSingleNode("./td[@data-moon-id]"); if (planetNode == null) { systemResult.AbsentItems.Add(Coordinate.Create(systemCoordinate, position, CoordinateType.Planet)); } if (moonNode == null) { systemResult.AbsentItems.Add(Coordinate.Create(systemCoordinate, position, CoordinateType.Moon)); } if (planetNode == null && moonNode == null) { // Nothing to do here continue; } GalaxyPageInfoItem item = new GalaxyPageInfoItem(); // Process planet if (planetNode != null) { systemResult.PresentItems.Add(Coordinate.Create(systemCoordinate, position, CoordinateType.Planet)); int planetId = planetNode.GetAttributeValue("data-planet-id", 0); string planetName = row.SelectSingleNode("./td[contains(@class, 'planetname')]").InnerText.Trim(); item.Planet = new GalaxyPageInfoPartItem { Coordinate = Coordinate.Create(systemCoordinate, position, CoordinateType.Planet), Id = planetId, Name = planetName }; } // Process moon if (moonNode != null) { systemResult.PresentItems.Add(Coordinate.Create(systemCoordinate, position, CoordinateType.Moon)); int moonId = moonNode.GetAttributeValue("data-moon-id", 0); string moonName = row.SelectSingleNode(".//span[@class='textNormal']").InnerText.Trim(); item.Moon = new GalaxyPageInfoPartItem { Coordinate = Coordinate.Create(systemCoordinate, position, CoordinateType.Moon), Id = moonId, Name = moonName }; } // Process debris field { HtmlNode debrisNode = row.SelectSingleNode(".//td[contains(@class, 'debris')]"); HtmlNodeCollection debrisContents = debrisNode.SelectNodes(".//li[@class='debris-content']"); int debrisMetal = 0, debrisCrystal = 0; if (debrisContents?.Count == 2) { string metalText = debrisContents[0].InnerText; string crystalText = debrisContents[1].InnerText; metalText = metalText.Split(' ').Last(); crystalText = crystalText.Split(' ').Last(); debrisMetal = int.Parse(metalText, NumberStyles.AllowThousands | NumberStyles.Integer, client.ServerCulture); debrisCrystal = int.Parse(crystalText, NumberStyles.AllowThousands | NumberStyles.Integer, client.ServerCulture); } item.DebrisField = new Resources { Metal = debrisMetal, Crystal = debrisCrystal }; } // Process player if (planetNode != null) { string playerName; int playerId; PlayerStatus playerStatus = PlayerStatus.None; HtmlNode planetOwnerNode = row.SelectSingleNode(".//td[contains(@class, 'playername')]"); HtmlNode playerLinkNode = planetOwnerNode.SelectSingleNode(".//a[starts-with(@rel, 'player')]"); if (playerLinkNode == null) { // Own planet? Debug.Assert(planetOwnerNode.SelectNodes(".//a") == null); playerLinkNode = planetOwnerNode.SelectSingleNode(".//span[@class='status_abbr_active']"); playerName = playerLinkNode.InnerText.Trim(); playerId = -1; playerStatus = PlayerStatus.Active; } else { // Some users planet playerName = playerLinkNode.InnerText.Trim(); playerId = planetOwnerNode.SelectSingleNode(".//a[@data-playerid]").GetAttributeValue("data-playerid", 0); HtmlNodeCollection playerStatusSpans = planetOwnerNode.SelectNodes("./span[@class='status']/span"); if (playerStatusSpans != null) { foreach (HtmlNode playerStatusSpan in playerStatusSpans) { string @class = playerStatusSpan.GetCssClasses(CssPlayerStatus).FirstOrDefault(); switch (@class) { case "status_abbr_noob": playerStatus |= PlayerStatus.Noob; break; case "status_abbr_vacation": playerStatus |= PlayerStatus.Vacation; break; case "status_abbr_strong": playerStatus |= PlayerStatus.Strong; break; case "status_abbr_banned": playerStatus |= PlayerStatus.Banned; break; case "status_abbr_active": playerStatus |= PlayerStatus.Active; break; case "status_abbr_inactive": playerStatus |= PlayerStatus.Inactive; break; case "status_abbr_longinactive": playerStatus |= PlayerStatus.LongInactive; break; case "status_abbr_outlaw": playerStatus |= PlayerStatus.Outlaw; break; case "status_abbr_honorableTarget": playerStatus |= PlayerStatus.HonorableTarget; break; case "status_abbr_ally_own": playerStatus |= PlayerStatus.AllyOwn; break; case "status_abbr_ally_war": playerStatus |= PlayerStatus.AllyWar; break; case "status_abbr_buddy": playerStatus |= PlayerStatus.Buddy; break; case "status_abbr_admin": playerStatus |= PlayerStatus.Admin; break; } } } } item.PlayerId = playerId; item.PlayerName = playerName; item.PlayerStatus = playerStatus; } // Process ally if (planetNode != null) { string playerAllyName = null; int playerAllyId = 0; HtmlNode planetOwnerAllyNode = row.SelectSingleNode("./td[contains(@class, 'allytag')]"); HtmlNode playerAllyInfoNode = planetOwnerAllyNode.SelectSingleNode(".//span[starts-with(@rel, 'alliance')]"); if (playerAllyInfoNode != null) { string playerAllyIdText = LinkRelRegex.Match(playerAllyInfoNode.GetAttributeValue("rel", "")).Groups[1].Value; playerAllyName = playerAllyInfoNode.SelectSingleNode(".//h1").InnerText.Trim(); playerAllyId = int.Parse(playerAllyIdText); } item.AllyId = playerAllyId; item.AllyName = playerAllyName; } // Process links if (linkNodesWithOnClick != null) { foreach (HtmlNode node in linkNodesWithOnClick) { string onClickText = node.GetAttributeValue("onclick", string.Empty); var sendShipsCommand = SendShipsLinkParser.ParseSendLink(onClickText); if (sendShipsCommand == null) { continue; } if (sendShipsCommand.Mission == MissionType.Espionage) { if (sendShipsCommand.Coord.Type == CoordinateType.Planet) { item.Planet.EspionageLinkInfo = sendShipsCommand; } else if (sendShipsCommand.Coord.Type == CoordinateType.Moon) { item.Moon.EspionageLinkInfo = sendShipsCommand; } } } } // TODO: Rankings yield return(item); } yield return(systemResult); }
public static void Main(string[] args) { // F**k that, it's impossible to make Mono accept certificates from OGame, at least I'm too stupid to do it apparently. if (IsRunningOnMono()) { System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return(true); }; } if (!File.Exists("config.json")) { Console.WriteLine("Please copy config.template.json to config.json and fill it out"); return; } IExitSignal onExitSignal = null; if (IsRunningOnMono()) { onExitSignal = new UnixExitSignal(); } else { onExitSignal = new WindowsExitSignal(); } Config config = JsonConvert.DeserializeObject <Config>(File.ReadAllText("config.json")); Logger.Instance.MinimumLogLevel = config.LogLevel; Logger.Instance.IncludeTimestamp = config.LogIncludeTimestamp; Logger.Instance.Log(LogLevel.Info, $"Loaded settings, user: {config.Username}, server: {config.Server}"); // Setup OGameStringProvider stringProvider = OGameStringProvider.Load(@"Resources/strings-en.json"); CultureInfo clientServerCulture = CultureInfo.GetCultureInfo("da-DK"); var commander = new CommandBase.Commander(); // Processing OGameClient client = new OGameClient(config.Server, stringProvider, config.Username, config.Password, commander); client.Settings.ServerUtcOffset = TimeSpan.FromHours(1); client.Settings.Galaxies = 8; client.Settings.Systems = 499; client.ServerCulture = clientServerCulture; Logger.Instance.Log(LogLevel.Debug, "Prepared OGameClient"); // Savers client.RegisterSaver(new GalaxyPageSaver()); client.RegisterSaver(new EspionageReportSaver()); client.RegisterSaver(new GalaxyPageDebrisSaver()); client.RegisterSaver(new MessageSaver()); client.RegisterSaver(new PlayerPlanetSaver()); client.RegisterSaver(new GalaxyActivitySaver()); client.RegisterSaver(new HostileAttackEmailSender(config.HostileWarning.From, config.HostileWarning.To, config.HostileWarning.Server, config.HostileWarning.Login, config.HostileWarning.Password)); // Injects client.RegisterInject(new CommandsInject()); client.RegisterInject(new CargosForTransportInject()); client.RegisterInject(new PlanetExclusiveInject(client)); client.RegisterInject(new CommonInject()); client.RegisterInject(new BuildQueueInject()); client.RegisterInject(new CustomPlanetOrderInject(config.CustomOrder)); client.RegisterInject(new EventListTotalsInject()); // UA stuff client.RegisterDefaultHeader("Accept-Language", "en-GB,en;q=0.8,da;q=0.6"); client.RegisterDefaultHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); client.RegisterDefaultHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"); Logger.Instance.Log(LogLevel.Debug, "Prepared user agent"); // Show details foreach (IInterventionHandler item in client.GetIntervention()) { Logger.Instance.Log(LogLevel.Info, $"Loaded Intervention Handler: {item.GetType().FullName}"); } foreach (BaseParser item in client.GetParsers()) { Logger.Instance.Log(LogLevel.Info, $"Loaded Parser: {item.GetType().FullName}"); } foreach (SaverBase item in client.GetSavers()) { Logger.Instance.Log(LogLevel.Info, $"Loaded Saver: {item.GetType().FullName}"); } // Start proxy OgameClientProxy proxy = new OgameClientProxy(config.ListenAddress, config.ListenPort, client); proxy.SubstituteRoot = new Uri($"https://{config.Server}"); proxy.Start(); Logger.Instance.Log(LogLevel.Success, $"Prepared reverse proxy, visit: {proxy.ListenPrefix}"); // Kick-off client.IssueRequest(client.RequestBuilder.GetPage(Objects.Types.PageType.Overview)); // Example job ApiImporterJob job1 = new ApiImporterJob(client, new DirectoryInfo("temp")); job1.Start(); AuctionMonitor monitor = new AuctionMonitor(client); client.RegisterInject(new AuctionStatusInject(monitor)); monitor.Start(); SessionKeepAliveJob job3 = new SessionKeepAliveJob(client, config.SessionKeepaliveMode); if (config.SessionKeepaliveMode == SessionKeepAliveMode.Single) { job3.PlanetId = config.SessionKeepalivePlanet; } job3.Start(); commander.Start(); Action <int> recallAction = (fleet) => { RecallFleetCommand recall = new RecallFleetCommand() { FleetId = fleet }; recall.Run(); }; if (config.FleetToRecall > 0) { recallAction(config.FleetToRecall); Thread.Sleep(5000); return; } if (config.SystemsToScan?.Count > 0) { SystemScanner sysScanner = new SystemScanner(config.SystemsToScan.Select(z => SystemCoordinate.Parse(z))); sysScanner.Start(); } SetupProxyCommands(client, config, proxy); onExitSignal.Exit += (sender, eventArgs) => { client.SaveCookies(); }; Console.TreatControlCAsInput = true; Console.ReadKey(true); client.SaveCookies(); }