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