public async void Handle_SignalMuleHeartbeat_Existing()
        {
            var stateManager = new Mock <IStateService>();

            stateManager.Setup(s => s.IsRunning()).ReturnsAsync(true);

            var logger = new Mock <ILogger <SignalMuleHeartbeatHandler> >();

            var now      = DateTime.UtcNow;
            var dateTime = new Mock <IDateTime>();

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

            var account = BogusData.ValidMuleAccounts.Generate();

            var mule = new Mule
            {
                Account = account,
                Tag     = Guid.NewGuid()
            };

            var bot = BogusData.Bots.Generate();

            var muleRequest = new MuleRequest
            {
                Mule = mule,
                Bot  = bot
            };

            using (var context = NewContext)
            {
                context.MuleRequests.Add(muleRequest);
                await context.SaveChangesAsync();
            }

            var command = new FORFarm.Application.Mules.Commands.SignalMuleHeartbeat.SignalMuleHeartbeat
            {
                Gold = 500 * 1000,
                Tag  = mule.Tag
            };

            var signalMuleHeartbeatHandler = new SignalMuleHeartbeatHandler(NewContext, logger.Object, dateTime.Object, stateManager.Object);

            var result = await signalMuleHeartbeatHandler.Handle(command, CancellationToken.None);

            result.Should().NotBeNull();
            result.Command.Should().Be(Command.Continue);
            result.MuleRequests.Should().ContainSingle(bot.DisplayName);

            var uMule = await NewContext.Mules.FindAsync(mule.ID);

            uMule.LastUpdate.Should().Be(now);
            uMule.Gold.Should().Be(command.Gold);
        }
Esempio n. 2
0
        public async void Handle_FinishMuling_ExistingTag()
        {
            var bot  = BogusData.Bots.Generate();
            var mule = BogusData.Mules.Generate();

            var muleRequest = new MuleRequest
            {
                Mule = mule,
                Bot  = bot
            };

            await using (var context = NewContext)
            {
                context.MuleRequests.Add(muleRequest);
                await context.SaveChangesAsync();
            }

            const int goldTransferred = 500000;

            await using (var context = NewContext)
            {
                var request = new FORFarm.Application.Bots.Commands.FinishMuling.FinishMuling()
                {
                    Tag             = bot.Tag,
                    GoldTransferred = goldTransferred
                };

                var finishMulingHandler = new FinishMulingHandler(context);

                await finishMulingHandler.Handle(request, CancellationToken.None);
            }

            await using (var context = NewContext)
            {
                context.MuleRequests.ToList().Should().BeEmpty();

                var uBot = context.Bots.Find(bot.ID);
                uBot.Should().NotBeNull();
                uBot.GoldEarned.Should().Be(bot.GoldEarned + goldTransferred);
            }
        }
Esempio n. 3
0
        public async Task <RequestMulingResponse> Handle(RequestMuling request, CancellationToken cancellationToken)
        {
            if (!await _stateService.IsRunning())
            {
                return(new RequestMulingResponse());
            }

            var bot = await _context.Bots.FirstOrDefaultAsync(b => b.Tag == request.Tag, cancellationToken);

            if (bot == null)
            {
                _logger.LogWarning($"Bot with tag {request.Tag} was not found");
                return(new RequestMulingResponse());
            }

            var mules = await _context.Mules
                        .Include(m => m.Position)
                        .Where(_instanceService.IsConnected())
                        .Cast <Mule>()
                        .ToListAsync(cancellationToken);

            if (mules.Count == 0)
            {
                return(new RequestMulingResponse());
            }

            var selectedMule = mules[_random.Next(0, mules.Count)];

            var muleRequest = new MuleRequest
            {
                Mule = selectedMule,
                Bot  = bot
            };

            _context.MuleRequests.Add(muleRequest);

            await _context.SaveChangesAsync(cancellationToken);

            return(new RequestMulingResponse(new MuleInfo(selectedMule.DisplayName, selectedMule.Position, selectedMule.World)));
        }