示例#1
0
        public async void Start_CanStart_LauncherRunning()
        {
            var now      = DateTime.UtcNow;
            var dateTime = new Mock <IDateTime>();

            dateTime.Setup(d => d.UtcNow).Returns(now);

            var settingsManager = new Mock <ISettingsService>();

            settingsManager.Setup(s => s.AreSettingsReady()).ReturnsAsync(true);

            using (var context = NewContext)
            {
                var settings = Clone(ValidSettings);
                settings.ID = 1;
                context.Update(settings);
                await context.SaveChangesAsync();
            }

            var launcher = new Mock <ILauncher>();

            launcher.Setup(l => l.Hostname).Returns(ValidSettings.Hostname);
            launcher.Setup(l => l.SocketAddress).Returns(SocketAddress);

            var farm = new FarmSetup(new List <Account> {
                new Account()
            }, new List <Account>());
            var farmBuilder = new Mock <IFarmBuilder>();

            farmBuilder.Setup(f => f.BuildFarmSetup()).ReturnsAsync(farm);

            var clientHandler = new Mock <IClientHandler>();

            clientHandler.Setup(c => c.GetLaunchers(It.IsAny <string>())).ReturnsAsync(new List <ILauncher> {
                launcher.Object
            });

            using (var context = NewContext)
            {
                var stateManager = new FORFarm.Application.Farm.StateService(context, dateTime.Object, settingsManager.Object, farmBuilder.Object, clientHandler.Object);
                await stateManager.Start();
            }

            var state = await NewContext.FarmStates.FindAsync(1);

            settingsManager.Verify(s => s.ActivateFarmSettings());

            state.Running.Should().BeTrue();
            state.Start.Should().Be(now);
            state.SocketAddress.Should().Be(SocketAddress);
        }
示例#2
0
        public async Task <FarmSetup> BuildFarmSetup()
        {
            if (_farmSetup != null)
            {
                return(_farmSetup);
            }

            var settings      = await _context.FarmSettings;
            var candidateFarm = await AccountAssigner.AssignAccounts(_context, settings);

            if (candidateFarm.IsEmpty())
            {
                return(_farmSetup = candidateFarm);
            }

            if (await ProxyAssigner.AssignProxies(_context, candidateFarm, settings))
            {
                return(_farmSetup = candidateFarm);
            }

            return(_farmSetup = FarmSetup.EmptyFarm);
        }
示例#3
0
        public static async Task <bool> AssignProxies(IFarmContext context, FarmSetup farmSetup, FarmSettings settings)
        {
            var neededBotProxySpots  = farmSetup.Bots.Count(a => a.Proxy == null);
            var neededMuleProxySpots = farmSetup.Mules.Count(a => a.Proxy == null);

            var neededSpots = neededBotProxySpots + neededMuleProxySpots;

            if (neededSpots == 0)
            {
                return(true);
            }

            var candidateBotProxies = await context.Proxies
                                      .Include(p => p.ActiveAccounts)
                                      .Where(HasNoMules)
                                      .Where(p => p.ActiveAccounts.Count < settings.ConcurrentAccountsPerProxy)
                                      .Where(p => p.BannedMules + p.BannedBots + p.ActiveAccounts.Count < settings.MaxAccountsPerProxy)
                                      .Take(neededBotProxySpots).ToListAsync();

            var remainingSpotsToAssign = neededBotProxySpots;
            var takenProxyIds          = new HashSet <int>();

            foreach (var proxy in candidateBotProxies)
            {
                if (remainingSpotsToAssign == 0)
                {
                    break;
                }

                remainingSpotsToAssign -= GetRemainingSpots(proxy, settings.ConcurrentAccountsPerProxy, settings.MaxActiveBots);
                takenProxyIds.Add(proxy.ID);
            }

            if (remainingSpotsToAssign > 0)
            {
                return(false);
            }

            var remainingProxies = candidateBotProxies
                                   .Where(p => !takenProxyIds.Contains(p.ID))
                                   .Where(HasNoBots.Compile())
                                   .Where(HasSpotRemaining(settings.ConcurrentAccountsPerProxy, settings.MaxAccountsPerProxy).Compile())
                                   .ToList();

            var remainingSpots = GetRemainingSpots(remainingProxies, settings.ConcurrentAccountsPerProxy,
                                                   settings.MaxAccountsPerProxy);

            var candidateMuleProxies = await context.Proxies
                                       .Include(p => p.ActiveAccounts)
                                       .Where(HasNoBots)
                                       .Where(p => !takenProxyIds.Contains(p.ID))
                                       .Take(neededMuleProxySpots - remainingSpots).ToListAsync();

            candidateBotProxies.RemoveAll(p => !takenProxyIds.Contains(p.ID));
            candidateMuleProxies.AddRange(remainingProxies);

            remainingSpotsToAssign = neededMuleProxySpots;

            foreach (var proxy in candidateMuleProxies)
            {
                if (remainingSpotsToAssign == 0)
                {
                    break;
                }

                remainingSpotsToAssign -= GetRemainingSpots(proxy, settings.ConcurrentAccountsPerProxy,
                                                            settings.MaxAccountsPerProxy);
            }

            if (remainingSpotsToAssign > 0)
            {
                return(false);
            }

            foreach (var acc in farmSetup.Bots.Where(a => a.Proxy == null))
            {
                var proxy = candidateBotProxies.First(
                    HasSpotRemaining(settings.ConcurrentAccountsPerProxy, settings.MaxAccountsPerProxy).Compile());

                acc.Proxy = proxy;
                proxy.ActiveAccounts.Add(acc);
            }

            foreach (var acc in farmSetup.Mules.Where(a => a.Proxy == null))
            {
                var proxy = candidateMuleProxies.First(
                    HasSpotRemaining(settings.ConcurrentAccountsPerProxy, settings.MaxAccountsPerProxy).Compile());

                acc.Proxy = proxy;
                proxy.ActiveAccounts.Add(acc);
            }

            await context.SaveChangesAsync();

            return(true);
        }