/// <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;
        }
Esempio n. 3
0
 /// <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));
 }
Esempio n. 4
0
 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));
        }
Esempio n. 6
0
 public ScanCommand()
 {
     if (To < From)
     {
         var tmp = From;
         From = To;
         To   = tmp;
     }
 }
Esempio n. 7
0
        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;
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
    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);
            }
        }
Esempio n. 12
0
        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());
        }
Esempio n. 15
0
        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);
            }
        }
Esempio n. 18
0
        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);
                }
            }
        }
Esempio n. 19
0
        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());
        }
Esempio n. 20
0
 public SystemCoordinate ReadSystemCoordinate()
 {
     return(SystemCoordinate.FromStream(this));
 }
Esempio n. 21
0
 /// <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));
 }
Esempio n. 23
0
        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);
 }
Esempio n. 25
0
 private void Scan(SystemCoordinate coord)
 {
     _client.IssueRequest(_client.RequestBuilder.GetGalaxyContent(coord));
 }
Esempio n. 26
0
 public FarmingBot(OGameClient client, SystemCoordinate startSystem, SystemCoordinate endSystem)
 {
     _client      = client;
     _startSystem = startSystem;
     _endSystem   = endSystem;
 }
Esempio n. 27
0
 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);
        }
Esempio n. 29
0
        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();
        }