public async Task <DougResponse> Steal(User user, User target, string channel) { if (user.IsStealOnCooldown()) { return(new DougResponse(string.Format(DougMessages.CommandOnCooldown, user.CalculateStealCooldownRemaining()))); } var channelType = _channelRepository.GetChannelType(channel); if (channelType != ChannelType.Common && channelType != ChannelType.Pvp) { return(new DougResponse(DougMessages.NotInRightChannel)); } var usersInChannel = await _slack.GetUsersInChannel(channel); if (usersInChannel.All(usr => usr != target.Id)) { return(new DougResponse(DougMessages.UserIsNotInPvp)); } var energy = user.Energy - StealEnergyCost; if (energy < 0) { return(new DougResponse(DougMessages.NotEnoughEnergy)); } _statsRepository.UpdateEnergy(user.Id, energy); _userRepository.SetStealCooldown(user.Id, user.GetStealCooldown()); var userChance = _eventDispatcher.OnStealingChance(user, user.BaseStealSuccessRate()); var targetChance = _eventDispatcher.OnGettingStolenChance(target, target.BaseOpponentStealSuccessRate()); var rollSuccessful = _randomService.RollAgainstOpponent(userChance, targetChance); var amount = _eventDispatcher.OnStealingAmount(user, user.BaseStealAmount()); if (target.Credits - amount < 0) { amount = target.Credits; } if (rollSuccessful) { _userRepository.RemoveCredits(target.Id, amount); _userRepository.AddCredits(user.Id, amount); var message = string.Format(DougMessages.StealCredits, _userService.Mention(user), amount, _userService.Mention(target)); await _slack.BroadcastMessage(message, channel); } else { var message = string.Format(DougMessages.StealFail, _userService.Mention(user), _userService.Mention(target)); await _slack.BroadcastMessage(message, channel); } return(new DougResponse()); }
private async Task <DougResponse> StealFromUser(User user, User target, string channel) { _statsRepository.SetSkillCooldown(user.Id, TimeSpan.FromSeconds(Cooldown)); var userChance = _eventDispatcher.OnStealingChance(user, user.BaseStealSuccessRate()); var targetChance = _eventDispatcher.OnGettingStolenChance(target, target.BaseOpponentStealSuccessRate()); var rollSuccessful = _randomService.RollAgainstOpponent(userChance, targetChance); var detected = !_randomService.RollAgainstOpponent(user.BaseDetectionAvoidance(), target.BaseDetectionChance()); var amount = _eventDispatcher.OnStealingAmount(user, user.BaseStealAmount()); if (target.Credits - amount < 0) { amount = target.Credits; } string message; DougResponse sneakResponse; if (rollSuccessful) { _creditsRepository.RemoveCredits(target.Id, amount); _creditsRepository.AddCredits(user.Id, amount); message = string.Format(DougMessages.StealCreditsCaught, _userService.Mention(user), amount, _userService.Mention(target)); sneakResponse = new DougResponse(string.Format(DougMessages.StealCredits, amount, _userService.Mention(target))); } else { message = string.Format(DougMessages.StealFailCaught, _userService.Mention(user), _userService.Mention(target)); sneakResponse = new DougResponse(string.Format(DougMessages.StealFail, _userService.Mention(target))); } if (detected) { await _slack.BroadcastMessage(message, channel); } return(sneakResponse); }